欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

tomcat加載jar異常問(wèn)題的分析與解決

現(xiàn)象描述:

為新邵等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及新邵網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、新邵網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

項(xiàng)目使用springboot啟動(dòng)一個(gè)web項(xiàng)目,在啟動(dòng)階段看到console中出現(xiàn)了異常“1.10.3-1.4.3\hdf5.jar  系統(tǒng)找不到指定的文件”,雖然這些異常不影響項(xiàng)目的正常運(yùn)行,但作為一個(gè)嚴(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)找不到指定的文件。)

項(xiàng)目環(huán)境說(shuō)明

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

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

tomcat加載jar異常問(wèn)題的分析與解決

跟蹤分析

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

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

方法doScanClassPath(...)

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

tomcat加載jar異常問(wèn)題的分析與解決

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

tomcat加載jar異常問(wèn)題的分析與解決

  • 方法processURLs(...)

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

tomcat加載jar異常問(wèn)題的分析與解決

  • 方法process()

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

processManifest(jar, isWebapp, classPathUrlsToProcess)

tomcat加載jar異常問(wèn)題的分析與解決

  • 方法 processManifest

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

tomcat加載jar異常問(wèn)題的分析與解決

原因分析

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

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

tomcat加載jar異常問(wèn)題的分析與解決

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

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

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

解決方案

方案一:

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

方案二:

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

方案三:

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

方案四

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

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

tomcat加載jar異常問(wèn)題的分析與解決

總結(jié):

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。

本文名稱:tomcat加載jar異常問(wèn)題的分析與解決
URL分享:http://aaarwkj.com/article4/isjsie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、電子商務(wù)、建站公司網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站設(shè)計(jì)、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
亚洲精品日本一区二区| 亚洲高清有码在线观看| 国产一区二区av免费| 亚洲精品深夜福利视频| 99热这里只有精品欧美| 精品日韩av高清一区二区三区| 一区二区三区乱码av| 黄色18禁网站在线看| 九九热这里只有免费精品| 欧美黄片高清免费播放| 亚洲一区二区美女av| 亚洲97成人在线视频| 日韩中文字幕视频一区| 国产亚洲欧美日韩中文字幕| 欧美高清一区二区在线播放| 国产精品一区二区综合亚洲| 久久91亚洲精品久久91| 欧美男女精品一区二区三区| 午夜影院网站在线看黄| 九九99九九99九九精品在线观看 | 在线 | 一区二区三区四区| 亚洲日本av一区二区| 精品成人在线一区二区| 精品一区二区亚洲精品| 国产一区二区三区不卡视频| 国产乱码精品免费一区二区av| 国产特级黄片免费观看| 国产原创av剧情六区| 成年免费视频一区二区三区| 亚洲成在人线免费观看| 国产精品白浆大屁股一区二区三| 亚洲欧美另类重口国产| 久久国产精品成人免费蜜臀| 欧美人与性禽动交情品| 97视频高清在线观看| 亚洲精品污一区二区三区| 精品人妻一区二区三区观看| 国产午夜在线观看免费视频| 国产精品精品国产一区二区| 日韩一区二区三区成人| 人妻中字幕出轨中文字幕|