spring boot tomcat 打本地包成war,經過Tomcat啓動時出現問題: ZipException: error in opening zip file

 

 

一個第三方公司提供spring boot 項目,直接啓動是ok的, 可是打包成war,經過Tomcat啓動,就出現 ZipException: error in opening zip file:java

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]

 

我也真是鬱悶了, 搞了幾個小時仍是沒有發現緣由哦!web

爲何第三方公司 啓動就ok呢? 它們有私服,我這裏沒有使用私服, 依賴的ojdbc 的jar 是經過system引入的,因此。spring

    <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 自己應該是沒問題的吧?apache

 

不過, 從上面的錯誤日誌來看,確實是出現了問題。 搜索了半天,嘗試了半天,仍是不行。有的博客上說,刪除maven的資源庫中全部的jar包,而後從新經過maven編譯項目,我試了不行。。tomcat

 

https://blog.csdn.net/u012012240/article/details/79571539上說:服務器

問題:
spring-boot項目本地運行沒問題,部署線上出現環境問題,由於本地spring-boot使用tomcat8內置jar包(存放於lib文件夾下),線上配置的tomcat7環境而使用tomcat8的jar包,因此報錯。app


解決:
1.在pom文件中將tomcat的版本調整爲tomcat7,編譯後替換下上的tomcat jar包(親測可用)
2.修改線上tomcat環境爲tomcat8環境(感興趣的能夠試試,項目時間緊就沒試)webapp


參考文章:http://blog.csdn.net/asdfsfsdgdfgh/article/details/52127562maven

難道我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

相關文章
相關標籤/搜索