报表知识库
我要提问

如何解决invalid LOC header错误的问题

在eclipse中引入一报表应用,在启动服务器时,报错:

2011-4-12 9:27:08 org.apache.catalina.core.StandardHost start
信息: XML validation disabled
Exception in thread “main” java.lang.InternalError: jzentry == 0,
jzfile = 503315792,
total = 4417,
name = D:\Program Files\reportHome\webapps\demo\WEB-INF\lib\dm.jar,
i = 2197,
message = invalid LOC header (bad signature)
at java.util.zip.ZipFile$3.nextElement(ZipFile.java:429)
at java.util.zip.ZipFile$3.nextElement(ZipFile.java:415)
at java.util.jar.JarFile$1.nextElement(JarFile.java:221)
at java.util.jar.JarFile$1.nextElement(JarFile.java:220)
at org.apache.catalina.startup.TldConfig.tldScanJar(TldConfig.java:460)
at org.apache.catalina.startup.TldConfig.execute(TldConfig.java:307)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4282)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1083)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:789)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1083)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:478)
at org.apache.catalina.core.StandardService.start(StandardService.java:480)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:2313)
at org.apache.catalina.startup.Catalina.start(Catalina.java:557)

经过 查询一些网上资料,并从java官网上认定这是一个bug。

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4615343

是由于ZipFile.java在处理经过压缩的jar文件的时候会有些问题,如果你的jar文件没有经过签名的话,你可以通过解压缩的方法来回避这个bug的产生。

例如:jar xf xxx.jar

jar cf0 xxx.jar

所以产生这个问题的原因就是由于dm.jar由于某种原因被破坏了(或许是ZipFile处理过程中会对经过压缩过的jar文件进行重新的解压、压缩的过程,而在某一次的处理过程被异常中断或其他原因导致现在的dm.jar不再是之前的dm.jar)。

既然是这样,最简单粗暴有效的方法就是从正常的应用中拷贝一个正常的dm.jar过来覆盖这个被破坏的dm.jar。

替换后,服务器正常启动,功能使用正常。