解決了異常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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章