欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

tomcat加載jar異常問題的分析與解決

 更新時間:2019年04月07日 10:47:36   作者:山東大蔥哥  
這篇文章主要給大家介紹了關(guān)于tomcat加載jar異常問題的分析與解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用tomcat具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

現(xiàn)象描述:

項目使用springboot啟動一個web項目,在啟動階段看到console中出現(xiàn)了異?!?.10.3-1.4.3\hdf5.jar  系統(tǒng)找不到指定的文件”,雖然這些異常不影響項目的正常運行,但作為一個嚴(yán)謹(jǐn)?shù)募夹g(shù)人員,看到這些異常就像見到仇人一樣,一定要除之而后快。

java.io.FileNotFoundException: D:\.m2\repository\org\bytedeco\javacpp-presets\hdf5-platform\1.10.3-1.4.3\hdf5.jar (系統(tǒng)找不到指定的文件。)
 at java.util.zip.ZipFile.open(Native Method)
 at java.util.zip.ZipFile.<init>(ZipFile.java:225)
 at java.util.zip.ZipFile.<init>(ZipFile.java:155)
 at java.util.jar.JarFile.<init>(JarFile.java:166)
 at java.util.jar.JarFile.<init>(JarFile.java:130)
 at org.apache.tomcat.util.compat.JreCompat.jarFileNewInstance(JreCompat.java:188)
 at org.apache.tomcat.util.scan.JarFileUrlJar.<init>(JarFileUrlJar.java:65)
 at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:49)
 at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:374)
 at org.apache.tomcat.util.scan.StandardJarScanner.processURLs(StandardJarScanner.java:309)
 at org.apache.tomcat.util.scan.StandardJarScanner.doScanClassPath(StandardJarScanner.java:266)
 at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:229)
 at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262)
 at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104)
 at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:101)
 at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5204)
 at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
 at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1421)
 at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1411)
 at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
 at java.util.concurrent.FutureTask.run(FutureTask.java)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
 at java.lang.Thread.run(Thread.java:748)

2019-03-29 18:09:08.303 WARN 16940 --- [ost-startStop-1] o.a.tomcat.util.scan.StandardJarScanner : Failed to scan [file:/D:/.m2/repository/org/bytedeco/javacpp-presets/hdf5-platform/1.10.3-1.4.3/hdf5-linux-x86.jar] from classloader hierarchy

java.io.FileNotFoundException: D:\.m2\repository\org\bytedeco\javacpp-presets\hdf5-platform\1.10.3-1.4.3\hdf5-linux-x86.jar (系統(tǒng)找不到指定的文件。)
......
2019-03-29 18:09:08.578 WARN 16940 --- [ost-startStop-1] o.a.tomcat.util.scan.StandardJarScanner : Failed to scan [file:/D:/.m2/repository/org/bytedeco/javacpp-presets/hdf5-platform/1.10.3-1.4.3/hdf5-linux-x86_64.jar] from classloader hierarchy

java.io.FileNotFoundException: D:\.m2\repository\org\bytedeco\javacpp-presets\hdf5-platform\1.10.3-1.4.3\hdf5-linux-x86_64.jar (系統(tǒng)找不到指定的文件。)

項目環(huán)境說明

  • tomcat:使用springboot內(nèi)置版本 8.5.29
  • 使用Maven進(jìn)行依賴管理
  • spring boot 版本為2.0.1
  • spring 框架 版本為5.0.5
  • 項目引用了Deep Learn 4 Java(一個非常棒的Java的機(jī)器學(xué)習(xí)庫)
 <dependency>
 <groupId>org.deeplearning4j</groupId>
 <artifactId>deeplearning4j-core</artifactId>
 <version>1.0.0-beta3</version>
 </dependency>

有問題的jar依賴關(guān)系

跟蹤分析

既然是在啟動階段報錯,那就找到啟動類添加斷點,一步步跟蹤下到底哪個階段報的錯誤,然后再分析出錯的原因。我跟蹤調(diào)試了springboot的代碼,找到j(luò)ar的加載位置。主要的幾個類和方法如下所示:

跟蹤類org.apache.tomcat.util.scan.StandardJarScanner

方法doScanClassPath(...)

該方法會對所有classloader進(jìn)行遍歷,加載每一個classloader中jar包

上圖標(biāo)紅處就是關(guān)鍵代碼,其中變量classPathUrlsToProcess中存放的是所有待加載的jar信息,主要是jar包路徑信息,我們可以看到這里面和我們在maven中看到的jar包是一樣的。

  • 方法processURLs(...)

該方法會對當(dāng)前classloader的所有jar,也就是對classPathUrlsToProcess進(jìn)行堆棧操作,然后處理每一個jar包。關(guān)鍵代碼如下所示。

  • 方法process()

該方法會對每一個jar進(jìn)行加載及分析處理,該方法中重點關(guān)注

processManifest(jar, isWebapp, classPathUrlsToProcess)

  • 方法 processManifest

該方法會處理jar中的Manifest文件,對Manifest文件中的Class-Path進(jìn)行分隔處理,對其中的內(nèi)容作為新的依賴jar再插入到classPathUrlsToProcess中(processURLs方法會按照堆棧結(jié)果加載其中的jar)

原因分析

其實問題就是出Manifest文件中的classpath,通過分析代碼我們知道tomcat除了加載了我們maven管理的jar包之外,還會對jar中的manifest文件進(jìn)行分析,如果其中存在classpath,他會將其中的內(nèi)容也添加jar包依賴中,并對這些jar包進(jìn)行加載。

我們打開其中hdf5-1.10.3-1.4.3.jar的manifest文件作為例子看看錯誤出在哪里。

大家注意到了沒有,這里的jar包沒有路徑也沒有版本號,這就導(dǎo)致tomcat加載的時候按照hdf5-1.10.3-1.4.3.jar的路徑進(jìn)行加載。

然而我們的工程中在對應(yīng)位置并不存在這些jar,這也就導(dǎo)致了找不到j(luò)ar的異常。我們工程中實際上有這些jar,只不過路徑和名字不一樣。在上圖左邊大家可以看到maven中其實已經(jīng)有了這些jar,只不過名字后面多了版本號,路徑在各自的maven倉庫中。

到這里我們已經(jīng)將出現(xiàn)問題的原因弄清楚了,接下來我們考慮下怎么解決。

解決方案

方案一:

刪除Manifest中的classpath或者刪除Manifest文件,這樣就避免了加載不存在的jar包。但是每次maven更新的時候可能會覆蓋掉你的修改,導(dǎo)致異常再次出現(xiàn)。

方案二:

按照加載提示的路徑,將對應(yīng)jar包復(fù)制過去并改名去掉版本號,但這樣會造成jar冗余,同樣的jar會加載兩個。

方案三:

降級tomcat版本,使用8.5.0 或以下版本。8.5.0版本中不會對manifest進(jìn)行分析加載,這樣也就不會出現(xiàn)我們的異常了。

方案四

增加一下代碼設(shè)置不掃描Manifest文件。

 @Bean
 public TomcatServletWebServerFactory tomcatFactory() {
  return new TomcatServletWebServerFactory() {
   @Override
   protected void postProcessContext(Context context) {
    ((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
   }
  };
 }

總結(jié):

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 一文教你怎么選擇Tomcat對應(yīng)的JDK版本

    一文教你怎么選擇Tomcat對應(yīng)的JDK版本

    這篇文章主要給大家截介紹了怎么選擇Tomcat對應(yīng)的JDK版本,如果不知道Tomcat的哪個版本應(yīng)該對應(yīng)哪個版本的JDK,可以參考借鑒本文,對大家的學(xué)習(xí)有一定的幫助
    2023-10-10
  • Java+Tomcat 環(huán)境部署及安裝過程圖解

    Java+Tomcat 環(huán)境部署及安裝過程圖解

    這篇文章主要介紹了Java+Tomcat 環(huán)境部署及安裝過程圖解,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • 在Windows10中安裝TomCat的教程圖解

    在Windows10中安裝TomCat的教程圖解

    Tomcat 服務(wù)器是一個免費的開放源代碼的Web 應(yīng)用服務(wù)器,屬于輕量級應(yīng)用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場合下被普遍使用,是開發(fā)和調(diào)試JSP 程序的首選。這篇文章主要介紹了在Windows10中安裝TomCat的教程圖解,需要的朋友可以參考下
    2019-11-11
  • 解析在Tomcat中啟用虛擬線程特性

    解析在Tomcat中啟用虛擬線程特性

    這篇文章主要介紹了在Tomcat中啟用虛擬線程特性,準(zhǔn)備好嵌入式Tomcat的依賴,需要引入三個依賴包,分別是tomcat-embed-core、tomcat-embed-el和tomcat-embed-websocket,版本選用10.1.0+?,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-10-10
  • 使用Tomcat Native提升Tomcat IO效率的方法詳解

    使用Tomcat Native提升Tomcat IO效率的方法詳解

    這篇文章主要介紹了使用Tomcat Native提升Tomcat IO效率的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Centos8.2云服務(wù)器環(huán)境安裝Tomcat8.5的詳細(xì)教程

    Centos8.2云服務(wù)器環(huán)境安裝Tomcat8.5的詳細(xì)教程

    這篇文章主要介紹了Centos8.2云服務(wù)器環(huán)境安裝Tomcat8.5的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • tomcat如何去掉項目名稱直接訪問項目

    tomcat如何去掉項目名稱直接訪問項目

    這篇文章主要介紹了tomcat如何去掉項目名稱直接訪問項目問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • tomcat配置虛擬路徑的實現(xiàn)步驟

    tomcat配置虛擬路徑的實現(xiàn)步驟

    本文主要介紹了tomcat配置虛擬路徑的實現(xiàn)步驟,主要是在localhost文件中進(jìn)行配置,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Tomcat中catalina.out 和 catalina.log的區(qū)別和用途詳解

    Tomcat中catalina.out 和 catalina.log的區(qū)別和用途詳解

    本文主要介紹了Tomcat中catalina.out 和 catalina.log的區(qū)別和用途詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Win7系統(tǒng)下tomcat7.0配置教程

    Win7系統(tǒng)下tomcat7.0配置教程

    這篇文章主要為大家詳細(xì)介紹了Windows7系統(tǒng)下tomcat7.0配置教程,感興趣的小伙伴們可以參考一下
    2016-06-06

最新評論