2017-02-19 112 views
7

我有一個Spring Boot WAR應用程序,完全可以在AWS上的Tomcat 8.0.39下運行。在發佈sudo service tomcat8 stop後,升級到Tomcat 8.0.41到sudo yum update,並重新啓動實例,應用程序無法啓動。在卡特琳娜的日誌文件,我看到一噸類型的異常:從Tomcat 8.0.39升級到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目錄中的一些(10)但不是全部(23)的目錄複製到Tomcat的lib目錄中。拷貝丟失的13瓶後,在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突然變得非常挑剔所有引用的罐子的存在,即使應用程序工作沒有很多人都很完美。另外,Tomcat似乎對某些罐子的特定構造非常特別(例如參見上面的罐子jaxb-core...jaxb-api...)。

現在,爲了解決這個問題,我可以嘗試找到所有這些遺漏的jar並將它們複製到Tomcat的lib目錄中。但是,由於通用名稱(如config.jar)或缺少版本號,我認爲沒有辦法確保其中某些源的正確來源。

那麼,有沒有辦法阻止Tomcat的scan.StandardJarScanner.scan對所有這些罐子如此挑剔?


更新#2:

事實證明,在Tomcat的8.0.38,加入一個設置來控制罐掃描,其默認爲true值。要打開掃描已關閉,添加以下行context.xml

<Context> 
    ... 
    <JarScanner scanManifest="false"/> 
</Context> 

有關詳細信息,請參閱 Provide an option to disable processing of Class-Path entry in a jar's manifest file

+0

這些文件不存在。如果Tomcat 8.0.41需要它們(而8.0.39顯然沒有),那麼它們應該帶有'yum update',但顯然他們沒有。 – user1408140

+0

因此,從'rpm -ql tomcat | more'開始,看看安裝的是什麼,並確保這些文件實際上是丟失的,而不是意想不到的。 –

回答

8

有一個錯誤,表示Tomcat 8將忽略MANIFEST.MF文件中的JAR的Class-Path頭,見Bug 59226

錯誤59226 - StandardJarScanner忽略清單Class-路徑頭罐

這個bug在Tomcat 8.0中修復。34,但它產生了很多關於不要求JAR文件的警告,請參閱Bug 59961

錯誤59961 - 提供一個選項來禁用一個jar的manifest文件類路徑條目的處理

由於Tomcat的8.0.38您可以禁用MANIFEST.MF文件的掃描,看The Jar Scanner Component

scanManifest

如果爲真,將M將掃描找到的任何JAR的anifest文件以獲取其他類路徑條目,並將這些條目添加到要掃描的URL中。默認值是true。

相關問題