Jetty - java.lang.IllegalStateException: zip文件已关闭

10

我在我们的Web服务器上遇到了一些连接错误。

我发现Jetty 7.6解决了引起这个问题的一个bug。是的,我们的应用程序在Jetty 7.5.4下运行时会出现此错误,但我们在另一个运行新版本9的应用程序中也会出现此错误。

你有什么想法吗?

我们随机地遇到这个错误:

java.lang.IllegalStateException: zip file closed
    at java.util.zip.ZipFile.ensureOpen(ZipFile.java:632)
    at java.util.zip.ZipFile.access$200(ZipFile.java:56)
    at java.util.zip.ZipFile$1.hasMoreElements(ZipFile.java:485)
    at java.util.jar.JarFile$1.hasMoreElements(JarFile.java:239)
    at org.eclipse.jetty.util.resource.JarFileResource.exists(JarFileResource.java:163)
    at org.eclipse.jetty.webapp.WebAppContext$Context.getResource(WebAppContext.java:1223)
    at org.eclipse.jetty.servlet.DefaultServlet.getResource(DefaultServlet.java:366)
    at org.eclipse.jetty.server.ResourceCache.lookup(ResourceCache.java:188)
    at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:445)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:547)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:480)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:483)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:941)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:409)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:875)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:219)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
    at org.eclipse.jetty.server.Server.handle(Server.java:345)
    at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441)
    at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:919)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:582)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:218)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:51)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
    at java.lang.Thread.run(Thread.java:722)

1
似乎是一个损坏的 .jar 文件,但不确定。 - Manolo Carrasco Moñino
如果您在Jetty 9上看到此消息,请在bugs.eclipse.org下的RT/Jetty中打开一个错误报告。 - jesse mcconnell
禁用gzip是否是一种好的做法?这样做似乎可以避免出现此错误。<init-param> <param-name>gzip</param-name> <param-value>true</param-value> </init-param> - FrozZerrer
6个回答

8

这主要有两个原因。

  1. 在你的类路径中存在坏/损坏的JAR文件。
  2. JVM内置的URL缓存妨碍了正常运行。

对于坏/损坏的JAR文件,你需要自己隔离并找出是哪一个。可以尝试逐个解压所有JAR文件,直到找到问题所在。

至于JVM URL缓存,则似乎会对动态类加载器(如OSGi或热部署场景)造成问题

针对这种情况,你可以告诉Jetty为每个URLConnection尝试设置URLConnection.setUseCaches(boolean)

要禁用JVM缓存,请将以下XML片段添加到etc/jetty.xml中:

<Set class="org.eclipse.jetty.util.resource.Resource"
     name="defaultUseCaches">false</Set>

我怎样才能知道哪个JAR文件有问题? - FrozZerrer
我认为可能是在这里找到了gwttime-alpha.jar http://code.google.com/p/gwt-time/。因为它是我两个项目之间共同添加的最后一个。它在我的Jetty7运行的项目中是新的,但是在Jetty9下运行的项目中已经看到了这个问题一段时间了。 - FrozZerrer
我还添加了poi-3.9-20121203.jar库。 - FrozZerrer
如果这发生在Jetty9.3中,可以通过将所有连接的缓存设置为false来解决它。 - Ducaz035
1
如果您的项目大量使用类加载器,可能会产生负面影响。(但这不是常见情况) - Joakim Erdfelt
显示剩余2条评论

1

在部署Jenkins war文件后,我遇到了同样的问题;解决方法就是在部署后重新启动服务器。 希望能对您有所帮助。


1
你不需要测试所有文件来确保它们的正确性。只需在 java.util.zip.ZipFile.ensureOpen(ZipFile.java:632) 处设置断点,并检查 ZipFile 类中的 name 字段:private final String name。

1
如果您在代码路径中进行自己的反射操作,也可能出现此问题。

0

我曾经遇到过同样的问题,后来删除了所有的.jar文件,并重新构建了所有.jar文件的路径。现在它正常工作了。


0

我遇到了同样的问题,因为实际的WAR文件已经损坏。尝试重新运行mvn clean install并重新部署。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接