解决了异常java.util.zip.ZipException: invalid CEN header (bad signature)心路历程

前言

过完年来,我被安排做一个比较小的查询功能增加到先有的.net系统中,其实就是增加个二级菜单,点击菜单之后输入账号可以从数据库查询到相关的信息。正常来说,这个小功能一个下午不到就可以完成,但是因为涉及到一些很小的细节问题不能及时解决,所以花了我几天的时间,我都开始崩溃和怀疑人生了。所以我写个博客来记录一下遇到的问题还有是如何解决的。

注意事项

如果你们想知道标题涉及的问题解决方案,直接拉到文章的后面查看即可,前面写的估计你们也许不会遇到,没必要都看完。

遇到的问题和解决过程

1. 数据库连接不上

当时我对于这个问题是很纠结的。我发现做个web小功能是个很常见的事情,然后做了个maven的 web项目模板来节省每次都得新建项目,包和配置文件的重复工作。这个空白的项目模板链接在文章的最后面,有需要的朋友可以直接拿来用。
当时就发现本地客户端plsqldev使用账号密码可以正常登陆,但是使用eclipse配置链接的时候却登录不上。下面是主要的报错信息:

 The Network Adapter could not establish the connectio

主要意思是网络适配器无法建立连接。
按照我的习惯,我第一反应就是将异常百度,然后大家的答案都差不多,然后我就照人家说的从以下这个方面来检查:

1、IP错误。
2、防火墙
3、监听器

一直检查下去都感觉不出问题所在,然后到了监听器这里,有些朋友说是由于监听器没打开,然后我就去服务那里查找,我这里安装的是oracle的客户端,根本没有这个服务啊。忙活了好久,一直都没结果,整个人都不好了。后来,经过一个女同事的点拨,才发现错误的根本原因是数据库配置没写对。

这个是tns的数据库配置

hn_vnet36 =
    (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)
        (HOST =  61.187.11.11)(PORT = 9522)
      )
    )
    (CONNECT_DATA =
      (SERVICE_NAME = vet)
    )
  )

而我刚开始在ecplise配置的是,我确保账号密码是正确的。

jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@61.187.11.11:1521:bsmp
jdbc.username=TEST
jdbc.password=TEST

其实,按照上面tns的配置,端口号那里应该是9522而不是1521,我是太习惯以为oracle就是1521这个端口,还有实例应该是vet而不是bsmp。所以正确的配置应该是下面这个

jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@61.187.11.11:9522:vet
jdbc.username=TEST
jdbc.password=TEST

所以说当本地客户端可以链接上数据库,但是ecplise却不可以的时候,耐心检查下配置,不要老是习惯以为。当然还有另外一个检验的方式,就是在oracle客户端输入你在ecplise配置的数据库信息,数据库那里填写ip和实例,比如61.187.11.11/bsmp来检查,如果登录不上,那就好好检查下。

2、给.net项目新增一个菜单链接

对于做这个,我总是很习惯使用谷歌浏览器打开需要添加的网页,然后邮件查看源代码来了解页面结构,根据页面结构去查找对应的源文件,跟着复制旁边的结构,添加一个链接。

但是这次找文件的方法却不对。我一直都以为.net项目的页面结构都在.aspx文件中,然后把服务器中的.aspx文件都翻个遍,但是就是找不到,好郁闷。后来我以为是使用js操作dom的,把主页的js都打开看一下,还是没找到,烦躁。我还用了服务器(xp)系统自带的查找文件功能去查关键字,还是没找到,简直崩溃啊。

后来经过我老大的指点,正确的方式应该是用vs2010打开这个项目,按下ctrl + f 在当前项目查找关键字,最后在一个.Master文件中找到了页面结构,终于找到了。

后面还遇到个小问题,就是如何将html嵌到主页的右边(点击左边的菜单即出现右边的html)。我老大是建议我用iframe标签,但是我却不大会。我先是参考原来的,发现写法是

  <ul>
  <li class="title"><b><a href="<% =ResolveUrl("~/DataQuery/List.aspx?t=yxdata")%>">记录查询</a></b></li>
  </ul>

我前端的同事建议我照着这个List.aspx的模样改成我需要的页面结构即可,不过我发现好像有点麻烦(说白了就是不懂.net)。后来我通过写个js勉强解决了问题,设置frameborder="0"把难看的边框去掉。

<script type="text/javascript">
    var btn = document.getElementById('vnet');
    var manZone = document.getElementById('man_zone');
    btn.onclick = function () {
        console.log("xxx");
       manZone.innerHTML = '<iframe frameborder="0" width="772" height="492" src="<% =ResolveUrl("~/DataQuery/hnvnet.html")%>"></iframe>';
    }
  
</script>

3、java.util.zip.ZipException: invalid CEN header (bad signature)异常处理

其实这个异常我是第二次遇到了,第一次是在过年前,当时也是百度了和花了很久的时间才解决的。这次遇到的时候,凭着上次的残缺记忆还是花了一两天的时间才解决的,其实解决方案是很简单的,下面我来全程回顾一下这个神奇的异常。

  1. 首先我在ecplise完成编码并测试,一切运行正常。
  2. 然后打成war包,使用ftp上传到中转服务器,然后在内网服务器使用SecureFX 将war包取出来,直接放进tomcat,完成。

部署是很简单,正常来说tomcat会自动将war包解压。但是我等了一会儿war包还是没解压。我就感觉是不是tomcat有问题,然后将tomcat服务重启,结果还是没解压。
这就奇怪了,为什么会这样???

当遇到这种问题的时候,不要慌张,这个时候应该去查看tomcat的日志。其实我建议大家遇到问题的时候首选去看日志,而不是主观臆断,这样更靠近问题的核心一点。
我打开tomcat的log目录,然后看到了一下的日志信息:

二月 27, 2018 1:50:23 下午 org.apache.catalina.startup.HostConfig deployWAR
信息: Deploying web application archive D:\Program Files\Tomcat-7.0.84\webapps\hn-query-billing.war
二月 27, 2018 1:50:23 下午 org.apache.catalina.startup.ContextConfig beforeStart
严重: Exception fixing docBase for context [/hn-query-billing]
java.util.zip.ZipException: invalid CEN header (bad signature)
	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:154)
	at java.util.jar.JarFile.<init>(JarFile.java:91)
	at sun.net.www.protocol.jar.URLJarFile.<init>(URLJarFile.java:93)
	at sun.net.www.protocol.jar.URLJarFile.getJarFile(URLJarFile.java:69)
	at sun.net.www.protocol.jar.JarFileFactory.get(JarFileFactory.java:109)
	at sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:122)
	at sun.net.www.protocol.jar.JarURLConnection.getJarFile(JarURLConnection.java:89)
	at org.apache.catalina.startup.ExpandWar.expand(ExpandWar.java:111)
	at org.apache.catalina.startup.ContextConfig.fixDocBase(ContextConfig.java:737)
	at org.apache.catalina.startup.ContextConfig.beforeStart(ContextConfig.java:862)
	at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:390)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
	at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
	at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:388)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:144)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1015)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:991)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
	at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1127)
	at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:2020)
	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:745)

二月 27, 2018 1:50:23 下午 org.apache.catalina.core.StandardContext resourcesStart
严重: Error starting static Resources
java.lang.IllegalArgumentException: Invalid or unreadable WAR file : invalid CEN header (bad signature)
	at org.apache.naming.resources.WARDirContext.setDocBase(WARDirContext.java:136)
	at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:5238)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5429)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1015)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:991)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
	at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1127)
	at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:2020)
	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:745)

二月 27, 2018 1:50:23 下午 org.apache.catalina.core.ContainerBase addChildInternal
严重: ContainerBase.addChild: start: 
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/hn-query-billing]]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:162)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1015)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:991)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
	at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1127)
	at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:2020)
	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:745)
Caused by: org.apache.catalina.LifecycleException: Error in resourceStart()
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5430)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	... 10 more

二月 27, 2018 1:50:23 下午 org.apache.catalina.startup.HostConfig deployWAR
严重: Error deploying web application archive D:\Program Files\Tomcat-7.0.84\webapps\hn-query-billing.war
java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/hn-query-billing]]
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1019)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:991)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
	at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1127)
	at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:2020)
	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:745)

二月 27, 2018 1:50:23 下午 org.apache.catalina.startup.HostConfig deployWAR
信息: Deployment of web application archive D:\Program Files\Tomcat-7.0.84\webapps\hn-query-billing.war has finished in 47 ms
二月 27, 2018 1:51:34 下午 org.apache.catalina.startup.HostConfig undeploy
信息: Undeploying context [/hn-query-billing]

然后我就很习惯的百度异常java.util.zip.ZipException: invalid CEN header (bad signature)结果大家给出的结论是jar包下载不完全引起的(我这个是maven项目 )。

  • 失败方案一

很多人建议将maven仓库下记录最后更新的配置文件删除,让maven自动重新下载。但是我在想,这个方法我第一次遇到就试过了,不成功。难道我每次都要删除配置文件才可以吗。

  • 失败方案二

然后我换个了方案。我在想,既然是jar包下载不完全引起的,那我换个方法重新下载不就行了。然后参考了重新下载所有未下载成功的maven包(含大量未下载的方法),重新打成war包再部署到服务器还是不行。

  • 失败方案三

我以为是没更新项目,然后在方案二的基础上执行项目右键 maven - update project。这个时候在打成war包,但是这个包却只有100kb大小,然后我就重新再eclipse跑这个项目,控制台发现以下异常信息:
这里写图片描述

然后我再想,我在pom.xml配置有这个包啊,怎么会这样。其实根本原因就是执行 maven - update project的时候将全部的jar包删掉了,导致war包变小,启动报错。这个时候可参考maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener 将jar包重新补进来。下面是正常的图片。
这里写图片描述

失败方案四

试了很多方案都失败,都快看到人生的尽头了。然后我就在想,同一个war包,本地都跑正常,难道是因为部署环境不一样造成的吗?本地环境是windows 64位的,jdk 和tomcat自然都是64位的。而内网服务器是32位的,jdk 和tomcat都是32位的。难道说是这个原因??
然后我就把服务器32位的tomcat7放到本地,将war包放进去,结果会有警告信息,但是可以正常访问运行。难道是ecplise使用jdk 64位编译出来的项目在32位jdk 上面跑不了??然后我就在ecplise上将项目的jdk手动改为32位的,重新打包,放进本地的32位tomcat去跑,结果本地正常,内网服务器还是原来的问题。

  • 成功方案

后来我在重新仔细看了一下异常信息,将下面这两行信息百度。

java.lang.IllegalArgumentException: Invalid or unreadable WAR file : invalid CEN header (bad signature)

这个博客启动tomcat,解压war包时出现unzip异常
给了我一点启发,会不会是上传的时候导致丢失??但是我使用的是SecureFX,不知道怎么设置下载属性啊。然后我就将war包打成zip包,再上传,部署,结果成功。

根据这些现象和探究结果,我得出的结论是使用SecureFX上传到内网服务器导致war包部分文件丢失(war包也是压缩包啊,为什么会丢失??),所以打成zip文件上传就OK了。一个很小的细节,花了我好多的时间。

这个是一个maven web的空白模板代码,配置文件什么的都写好了,就差根据业务写代码了。
下面是下载地址:
http://download.csdn.net/download/qq_32574435/10263802

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值