我的JSF网络应用程序在访问文件(如图像,css,js)时发出随机错误:“zip file closed”。它部署在Jetty 7上。看起来有些文件未加载(页面上缺少一些图像)。
java.lang.IllegalStateException: zip file closed
at java.util.zip.ZipFile.ensureOpen(ZipFile.java:403)
at java.util.zip.ZipFile.entries(ZipFile.java:298)
at java.util.jar.JarFile.entries(JarFile.java:217)
at org.eclipse.jetty.util.resource.JarFileResource.list(JarFileResource.java:261)
at org.eclipse.jetty.util.resource.ResourceCollection.list(ResourceCollection.java:421)
at org.eclipse.jetty.util.resource.Resource.getListHTML(Resource.java:509)
at org.eclipse.jetty.servlet.DefaultServlet.sendDirectory(DefaultServlet.java:741)
at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:564)
当我从带有jetty的maven插件(7.x)运行它时:run或jetty:run-war然后我没有得到任何错误。 更重要的是,访问Web上下文的根路径只会在独立的jetty上运行时出现“zip file closed”错误,但是当从maven pluging运行时没有这样的错误,那就是那些目录视图。
我的web.xml:
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
的pom.xml:
....
<dependencies>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
....
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>7.5.1.v20110908</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
</configuration>
<dependencies>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.1.3</version>
</dependency>
</dependencies>
</plugin>
知道它会是什么吗?
答案 0 :(得分:6)
此issue已在jetty-7.6.0.RC2中修复。该错误是由JVM缓存jar url连接流引起的。
根据错误报告,您还需要将以下内容添加到jetty.xml:
<Set class="org.eclipse.jetty.util.resource.Resource" name="defaultUseCaches">false</Set>
答案 1 :(得分:1)
Jetty在WEB-INF / lib的jar文件中查找您的资源。当它搜索jsf-impl.jar时,它可能以某种方式关闭,可能是由JSF请求。也许jsf会自己处理资源并对文件本身进行混乱。
无论如何,解决方案似乎是将jsf jar从war文件中移出。将你的jsf依赖范围设置为提供,以便maven不将它们打包在war文件中,并将它们放在服务器上,可能在jetty standalone的lib文件夹中。
答案 2 :(得分:1)
我遇到了同样的问题,并设法通过转到etc\webdefault.xml
并将此参数更改为false
来解决此问题:
<init-param>
<param-name>gzip</param-name>
<param-value>true</param-value>
</init-param>