AWSのTomcat 8.0.39で完全に動作するSpring Boot WARアプリケーションがあります。 Sudo service Tomcat8 stop
を発行し、Sudo yum update
を介してTomcat 8.0.41にアップグレードし、インスタンスを再起動した後、アプリケーションは起動しません。カタリナログファイルには、次の種類の例外が大量に記録されています。
19-Feb-2017 10:27:15.326 WARNING [localhost-startStop-1] org.Apache.Tomcat.util.
scan.StandardJarScanner.scan Failed to scan [file:/usr/share/Java/Tomcat8/javax.
annotation-api.jar] from classloader hierarchy
Java.io.FileNotFoundException: /usr/share/Java/Tomcat8/javax.annotation-api.jar
(No such file or directory)
Tomcatが不満を言うファイルは次のとおりです。
javax.annotation-api.jar
jsr181-api.jar
jaxb-api.jar
javax.xml.soap-api.jar
FastInfoset.jar
mimepull.jar
saaj-impl.jar
stax2-api.jar
woodstox-core-asl.jar
jaxb-core-2.2.10-b140802.1033.jar
jaxb-api-2.2.12-b140109.1041.jar
istack-commons-runtime-2.19.jar
txw2-2.2.10-b140802.1033.jar
hk2-core.jar
class-model.jar
config.jar
auto-depends.jar
javax.inject.jar
hk2-api.jar
osgi-resource-locator.jar
tiger-types.jar
bean-validator.jar
jtype.jar
これを修正する方法についての提案はありますか?
#1:を更新
上記のファイルの一部はjaxws-ri
に属します。 JAX-WS RI 2.2.10 lib
ディレクトリのjarをTomcatのlib
ディレクトリにコピーしましたが、すべてではありません(23)。不足している13個のjarをコピーした後、catalinaログファイルでTomcatが不満を言うファイルのリストは次のように縮小されています。
jaxb-core-2.2.10-b140802.1033.jar
jaxb-api-2.2.12-b140109.1041.jar
istack-commons-runtime-2.19.jar
txw2-2.2.10-b140802.1033.jar
hk2-core.jar
class-model.jar
config.jar
auto-depends.jar
javax.inject.jar
hk2-api.jar
osgi-resource-locator.jar
tiger-types.jar
bean-validator.jar
jtype.jar
(上記のファイルの例外はログファイルで数回繰り返されます。スキャナーは起動時に繰り返し呼び出され、異なるクラスパスをスキャンしているようです。)
これにより、8.0.39から8.0.41への移行により、Tomcatは突然、参照されたすべてのjarの存在について非常にうるさくなりました。さらに、Tomcatはいくつかのjarの特定のビルドに非常に細心の注意を払っているようです(たとえば、上記のjaxb-core...
およびjaxb-api...
jarを参照してください)。
さて、これを修正するために、これらすべての欠落しているjarを見つけて、Tomcatのlib
ディレクトリにコピーしてみます。ただし、config.jar
などの一般的な名前、またはバージョン番号の欠落により、それらの一部の適切なソースを保証する方法はありません。
それでは、Tomcatのscan.StandardJarScanner.scan
がこれらすべてのjarファイルについてあまりうるさくならないようにする方法はありますか?
更新#2:
Tomcat 8.0.38では、jarスキャンを制御するための設定が追加され、その値はデフォルトでtrue
になっていることがわかりました。スキャンをオフにするには、context.xml
に次の行を追加します。
<Context>
...
<JarScanner scanManifest="false"/>
</Context>
詳細については、「 jarのマニフェストファイル内のClass-Pathエントリの処理を無効にするオプションを提供する 」を参照してください。
Tomcat 8は、 Class-Path
ファイルの MANIFEST.MF
ヘッダーを無視するというバグがありました。 JAR、 バグ59226 を参照:
バグ59226-StandardJarScannerはマニフェストクラスパスヘッダーのjarを無視します
このバグはTomcat 8.0.34で修正されましたが、不要なJARについて多くの警告が生成されました。 バグ59961 を参照してください。
バグ59961-jarのマニフェストファイル内のClass-Pathエントリの処理を無効にするオプションを提供
Tomcat 8.0.38以降では、MANIFEST.MF
ファイルのスキャンを無効にできます。 The Jar Scanner Component を参照してください。
scanManifest
Trueの場合、見つかったJARのマニフェストファイルは追加のクラスパス全体についてスキャンされ、それらのエントリはスキャンするURLに追加されます。デフォルトはtrueです。