一個第三方公司提供spring boot 項目,直接啟動是ok的, 但是打包成war,通過Tomcat啟動,就出現 ZipException: error in opening zip file:
20-Mar-2019 15:48:28.385 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [F:\dev\apache-tomcat-8.5.24\webapps\cardmanager.war] 20-Mar-2019 15:48:28.597 嚴重 [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/cardmanager]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:986) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744) Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.webresources.StandardRoot@7921dcac] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4860) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4995) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 10 more Caused by: org.apache.catalina.LifecycleException: Failed to initialize component [org.apache.catalina.webresources.JarResourceSet@5865a4ba] at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:112) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:140) at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:724) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 13 more Caused by: java.lang.IllegalArgumentException: java.util.zip.ZipException: error in opening zip file at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.initInternal(AbstractSingleArchiveResourceSet.java:142) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107) ... 16 more Caused by: java.util.zip.ZipException: error in opening zip file at java.util.zip.ZipFile.open(Native Method) at java.util.zip.ZipFile.<init>(ZipFile.java:215) at java.util.zip.ZipFile.<init>(ZipFile.java:145) at java.util.jar.JarFile.<init>(JarFile.java:153) at java.util.jar.JarFile.<init>(JarFile.java:117) at org.apache.tomcat.util.compat.JreCompat.jarFileNewInstance(JreCompat.java:188) at org.apache.tomcat.util.compat.JreCompat.jarFileNewInstance(JreCompat.java:173) at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.initInternal(AbstractSingleArchiveResourceSet.java:139) ... 17 more 20-Mar-2019 15:48:28.610 嚴重 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive [F:\dev\apache-tomcat-8.5.24\webapps\cardmanager.war] java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/cardmanager]] at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:756) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:986) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744) 20-Mar-2019 15:48:28.620 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [F:\dev\apache-tomcat-8.5.24\webapps\cardmanager.war] has finished in [234] ms 20-Mar-2019 15:48:28.621 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [F:\dev\apache-tomcat-8.5.24\webapps\cardmanager_20190320.war]
我也真是郁悶了, 搞了幾個小時還是沒有發現原因哦!
為什么第三方公司 啟動就ok呢? 它們有私服,我這里沒有使用私服, 依賴的ojdbc 的jar 是通過system引入的,所以。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> <includeSystemScope>true</includeSystemScope> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <webResources> <resource> <directory>${project.basedir}/../lib</directory> <targetPath>WEB-INF/lib</targetPath> <filtering>true</filtering> <includes> <include>**/*.jar</include> </includes> </resource> </webResources> <warName>cardmanager</warName> </configuration> </plugin> </plugins> </build>
...
Maven 編譯打包都沒有問題,為什么就是不行呢? war 本身應該是沒問題的吧?
不過, 從上面的錯誤日志來看,確實是出現了問題。 搜索了半天,嘗試了半天,還是不行。有的博客上說,刪除maven的資源庫中所有的jar包,然后重新通過maven編譯項目,我試了不行。。
https://blog.csdn.net/u012012240/article/details/79571539上說:
問題:
spring-boot項目本地運行沒問題,部署線上出現環境問題,因為本地spring-boot使用tomcat8內置jar包(存放於lib文件夾下),線上配置的tomcat7環境而使用tomcat8的jar包,所以報錯。
解決:
1.在pom文件中將tomcat的版本調整為tomcat7,編譯后替換下上的tomcat jar包(親測可用)
2.修改線上tomcat環境為tomcat8環境(感興趣的可以試試,項目時間緊就沒試)
參考文章:http://blog.csdn.net/asdfsfsdgdfgh/article/details/52127562
難道我Tomcat有問題? 發現都是 tomcat8, 應該是不存在這樣的問題的吧!
https://blog.csdn.net/qq_31293575/article/details/84262302 上說:
idea在創建目錄a后再創建目錄b,會出現創建出a.b目錄的問題,這會影響到tomcat編譯啟動
需要在創建目錄a后隨便創建一個文件,然后再創建b目錄。(idea的bug)
感覺完成是胡扯
偶然發現 我的 本地引入的ojdbc的版本是ojdbc14_g.jar, 而 他們的是 ojdbc7-12.1.0.1.0.jar, 難道這個原因?
替換成了他們的jar,發現還是不行。。
https://blog.csdn.net/qq_23599977/article/details/78140470 上說:
之后排查倉庫問題,發現是spring-context包下載問題。根本就沒有這方面想,公司自己搭建的maven服務器,下載還能出錯??而且mavenjar下載失敗,你也報個問題啊,還是build success!
我這里倉庫難道有問題? 誠惶誠恐啊! 但是通過-X 參數調試過了,並沒有發現error 信息。 可見,並不是倉庫問題吧。
https://blog.csdn.net/wujunyucg/article/details/78437601 上說:
首先檢查有沒有 zip 包
沒有 zip 包,那剩下的只能是 jar 包。
在網上搜了一陣后,發現很多情況是在 maven 打包是就出現了這個錯誤,就能找到是哪個包,之后就好解決了。
但是我每次都是沒有錯誤,成功打包
之后花式打包,調各種參數,都失敗了
在這樣的情況下,只能調試 tomcat 了(我想到的本辦法,如果有更好的辦法請告述我!!!)
之后就是調試 tomcat 源碼了,詳情請點擊。
tomcat 源碼 org.apache.catalina.util.LifecycleBase.init 這個位置打斷點,終於發現是哪個 jar 包了。
發現只剩調試 tomcat 源碼一條路了, 這也太麻煩了吧, 我真是不願意。。
后面發現, 我的war 解壓后, 對應的 ojdbc jar 的大小發生了變化, 他們的 ojdbc7-12.1.0.1.0.jar 大小是3319k, 我的war 解壓后的ojdbc7-12.1.0.1.0.jar 大小是5872k 應該已經不是原始的那個了jar!
雙擊通過jd-gui 打開 發現沒有任何內容! 后綴改為 zip ,然后解壓, 發現了下面的錯誤:
這就奇怪了,雖然大小是5872k,但是無法正常解壓! 應該是壓縮的過程出現了問題!!
手動替換 ojdbc7-12.1.0.1.0.jar 為他們的jar 就好了! 當然,這不是最終的解決方案。
這樣看來, 可以肯定的是 spring-boot-maven-plugin 或者 maven-war-plugin 插件對 scope 為 system的 dependency 做了什么手腳!!
最終的方案其實很簡單,如下,把 filtering 配置成 fasle 就可以了!!! :
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <webResources> <resource> <directory>${project.basedir}/src/main/resources/ify</directory> <targetPath>WEB-INF/lib</targetPath> <filtering>false</filtering> <includes> <include>**/*.jar</include> </includes> </resource> </webResources> </configuration> </plugin>
里面lib 的jar 完全沒有被壓縮,都是原始大小:
確實是解壓的時候出的錯, 不過不是解壓war的時候出現問題(實際上war 的解壓是完全正常的), 而是 啟動時, 連接數據庫,然后加載class,然后 引用到 對應的ojdbc jar 的時候出現的問題!
這個錯誤提示 , 根本看不到哪里的問題, 真是坑!
參考:
https://blog.csdn.net/wujunyucg/article/details/78438836
https://blog.csdn.net/wujunyucg/article/details/78437601
https://blog.csdn.net/qq_35246620/article/details/75013964
https://blog.csdn.net/wangming520liwei/article/details/78222793
https://blog.csdn.net/xiang_6119/article/details/80169465
https://blog.csdn.net/u013041642/article/details/82988604