JSF2 на Jetty случайным образом выдает «zip file closed», но работает при запуске из подключаемого модуля maven - PullRequest
4 голосов
/ 10 октября 2011

мое веб-приложение JSF выдает случайную ошибку: «файл zip закрыт» при доступе к файлам (таким как изображения, css, js). Он развернут на 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)

Когда я запускаю его из плагина maven (7.x) с помощью jetty: run или jetty: run-war, я не получаю никакой ошибки. Более того, при доступе к корневому пути веб-контекста возникает ошибка «zip file closed» только при работе на автономной пристани, но такой ошибки при запуске с подключением maven нет, тогда это представление каталога.

Мой 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>   

Есть идеи, что бы это могло быть?

Ответы [ 3 ]

6 голосов
/ 09 января 2012

Эта проблема была исправлена ​​в jetty-7.6.0.RC2. Ошибка вызвана потоками соединений JVM-кэширования JAR-URL.

Согласно отчету об ошибке, вам также необходимо добавить в файл jetty.xml следующее:

 <Set class="org.eclipse.jetty.util.resource.Resource" name="defaultUseCaches">false</Set>
1 голос
/ 07 января 2012

У меня была та же проблема, и мне удалось ее решить, перейдя на etc\webdefault.xml и изменив этот параметр на false:

<init-param>
  <param-name>gzip</param-name>
  <param-value>true</param-value>
</init-param>
1 голос
/ 26 октября 2011

Jetty ищет ваши ресурсы в файлах jar в WEB-INF / lib. Когда он ищет jsf-impl.jar, он как-то закрывается, вероятно, по запросу JSF. Возможно, jsf самостоятельно обрабатывает ресурсы и портит сами файлы.

В любом случае, похоже, что решение состоит в том, чтобы убрать jsf-файлы из военного файла. Установите для своей области зависимостей jsf значение предоставлено, чтобы maven не упаковывал их в файл war, а передавал их на сервер, возможно, в папку lib в автономном режиме Jetty.

...