1. 程式人生 > >xalanxalan2.7.2xercesImpl.jar (系統找不到指定的文件)問題

xalanxalan2.7.2xercesImpl.jar (系統找不到指定的文件)問題

epo stand 找到 startup alt 而且 方式 arsc roc

本文轉自:http://blog.csdn.net/lveliu/article/details/77772828

環境搭建為:maven+tomcat

tomcat 8.5.2 以上會出現改問題(包含8.5.2)

開始:

警告: Failed to scan [file:/D:/develop/repo/xalan/xalan/2.7.2/xercesImpl.jar] from classloader hierarchy
技術分享java.io.FileNotFoundException: D:\XXX目錄\xalan\xalan\2.7.2\xercesImpl.jar (系統找不到指定的文件。)
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:219)
at java.util.zip.ZipFile.<init>(ZipFile.java:149)
at java.util.jar.JarFile.<init>(JarFile.java:166)
at java.util.jar.JarFile.<init>(JarFile.java:130)
at org.apache.tomcat.util.scan.JarFileUrlJar.<init>(JarFileUrlJar.java:60)
at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:43)
at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:327)
at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:277)
at org.apache.catalina.startup.ContextConfig.processJarsForWebFragments(ContextConfig.java:1887)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1122)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:771)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:298)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:94)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5093)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1405)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1395)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

雖然只是警告,不影響正常使用,但是看著總是那麽不爽。

本人使用過的是maven,我以查看maven依賴,不對啊,怎麽會查找這個目錄下面的xercesImpl.jar,分明不對,原始路徑應該是, D:\XXX目錄\xerces\xercesImpl\2.9.1\xercesImpl.2.9.1.jar。

找原因,為什麽為加載到D:\XXX目錄\xalan\xalan\2.7.2\xercesImpl.jar這個文件,各種百度谷歌,最後找到問題是tomcat 加載包的問題。tomcat在8.5.2 中 修改了加載jar的方式,8.5.2 版本會解析jar中MANIFEST.MF文件,當該文件包含class-path屬性時,會把該屬性對象值,解析成需要加載的jar給加載進來。這個就是根本原因。沒得辦法,只有自降版本到8.5.0就能解決這個問題。為了解決這個問題,花了老子半天時間。

例如xalan.jar中MANIFEST.MF文件,部分截圖如下:

技術分享技術分享技術分享技術分享

這個就會加載配置的這3個jar,而且尋找路徑是xalan.jar所在的文件下尋找。

接下來我們就來看下tomcat的源碼,到底是怎麽回事。

tomcat 8.5.0 加載jar重要部分如下:

首先調用scanJars掃描jar,重要部分,調用scan方法。

技術分享

技術分享技術分享

scan方法:

技術分享

技術分享技術分享

重要部分看紅色,這個和8.5.2 版本的方法不一樣的地方,這個也是出問題的地方。

先看8.5.0方法:

技術分享

技術分享技術分享

沒有去解析MANIFEST.MF文件。這個正常,接下來我們看8.5.2版本

技術分享技術分享

註意看紅色部分

技術分享

當為jar時,就去調用processManifest該方法,這個方法就是解析MANIFEST文件。下面我們看這個方法:

技術分享

技術分享技術分享

其中就可以看出,去解析了class-path屬性,解析對應值,然後加載到需要classPathUrlsToprocess中,這個就是需要加載的jar對象。所以這個就是根本原因。

不知道tomcat在高版本中為什麽要這個做,有知道的同學可以解答下。

xalan\xalan\2.7.2\xercesImpl.jar (系統找不到指定的文件)問題