JSF2 на Jetty выдает случайное «zip-файл закрыт», но работает при запуске из плагина maven jetty (jetty: run)

#jsf-2 #jetty

#jsf-2 #jetty

Вопрос:

мое веб-приложение 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-файл закрыт» только при запуске на автономном jetty, но такой ошибки нет при запуске из 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>   
  

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

Комментарии:

1. Мы сталкиваемся с теми же проблемами на SUSE Linux Enterprise Server 11 SP1, мы попытались понизить jetty.maven.plugin до версии 7.2.2, но проблема сохраняется. Ошибки zip являются случайными, и перезагрузка в браузере устраняет проблему для пользователя (что означает, что извлекается отсутствующий img или css). Однако для нас это не решение. Мы убедились, что ресурсы распакованы в файловой системе и что Jetty имеет разрешение на доступ к ним. У кого-нибудь еще такая же проблема или, желательно, решение?

Ответ №1:

Эта проблема была исправлена в jetty-7.6.0.RC2. Ошибка вызвана потоками подключения JVM к jar url.

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

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

Комментарии:

1. Я использую jetty-serverlet , исправит ли 7.6.16 эту проблему?

2. Согласно отслеживателю проблем, это должно быть исправлено в версиях> = 7.5.4. Вы видите это в 7.6.16?

Ответ №2:

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

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

Ответ №3:

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

 <init-param>
  <param-name>gzip</param-name>
  <param-value>true</param-value>
</init-param>