一个第三方公司提供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编译项目,我试了不行。。

问题:
spring-boot项目本地运行没问题,部署线上出现环境问题,因为本地spring-boot使用tomcat8内置jar包(存放于lib文件夹下),线上配置的tomcat7环境而使用tomcat8的jar包,所以报错。


解决:
1.在pom文件中将tomcat的版本调整为tomcat7,编译后替换下上的tomcat jar包(亲测可用)
2.修改线上tomcat环境为tomcat8环境(感兴趣的可以试试,项目时间紧就没试)

难道我Tomcat有问题? 发现都是 tomcat8, 应该是不存在这样的问题的吧!

 

idea在创建目录a后再创建目录b,会出现创建出a.b目录的问题,这会影响到tomcat编译启动

需要在创建目录a后随便创建一个文件,然后再创建b目录。(idea的bug)

感觉完成是胡扯

 

偶然发现 我的 本地引入的ojdbc的版本是ojdbc14_g.jar, 而 他们的是 ojdbc7-12.1.0.1.0.jar, 难道这个原因?

替换成了他们的jar,发现还是不行。。

之后排查仓库问题,发现是spring-context包下载问题。根本就没有这方面想,公司自己搭建的maven服务器,下载还能出错??而且mavenjar下载失败,你也报个问题啊,还是build success!

我这里仓库难道有问题? 诚惶诚恐啊! 但是通过-X 参数调试过了,并没有发现error 信息。 可见,并不是仓库问题吧。

首先检查有没有 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!

spring boot tomcat 打本地包成war,通过Tomcat启动时出现问题: ZipException: error in opening zip file_tomcat

 

  双击通过jd-gui 打开 发现没有任何内容! 后缀改为 zip ,然后解压, 发现了下面的错误:

 spring boot tomcat 打本地包成war,通过Tomcat启动时出现问题: ZipException: error in opening zip file_apache_02

 

这就奇怪了,虽然大小是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 完全没有被压缩,都是原始大小:

spring boot tomcat 打本地包成war,通过Tomcat启动时出现问题: ZipException: error in opening zip file_maven_03

 

 

确实是解压的时候出的错, 不过不是解压war的时候出现问题(实际上war 的解压是完全正常的), 而是 启动时, 连接数据库,然后加载class,然后 引用到 对应的ojdbc jar 的时候出现的问题!

 

这个错误提示 , 根本看不到哪里的问题, 真是坑!