Я пытаюсь использовать сервлет GZipFilter, предоставленный в libts jetty-servlets
lib. Мое веб-приложение работает на Tomcat, а не на Jetty. Я знаю, что Jetty - это еще один механизм сервлетов, но я должен использовать отдельные компоненты.
Я использую maven
для создания своего приложения. Всякий раз, когда я включаю jetty-servlets
в моем помпе, мое веб-приложение отказывается начинать, не получив объявление GzipFilter
в web.xml
.
Ошибка заключается в следующем,
Mar 31, 2014 3:03:32 PM org.apache.catalina.core.StandardContext filterStart SEVERE: Exception starting filter GzipFilter java.lang.NoClassDefFoundError: javax/servlet/AsyncListener at java.lang.Class.getDeclaredConstructors0(Native Method) at java.lang.Class.privateGetDeclaredConstructors(Class.java:2493) at java.lang.Class.getConstructor0(Class.java:2803) at java.lang.Class.newInstance(Class.java:345) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
Я знал, что Jetty-Servlets имеет зависимость от servlets-api, поэтому я исключил его из зависимости в maven.
Мой фрагмент pom.xml
выглядит,
<dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-servlets</artifactId> <version>9.1.0.M0</version> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </exclusion> </exclusions> </dependency>
Мой фрагмент web.xml
выглядит так:
<filter> <filter-name>GzipFilter</filter-name> <filter-class>org.eclipse.jetty.servlets.GzipFilter</filter-class> <init-param> <param-name>mimeTypes</param-name> <param-value>text/html,text/plain,text/xml,application/xhtml+xml,text/css,application/javascript,image/svg+xml</param-value> </init-param> </filter> <filter-mapping> <filter-name>GzipFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Отсутствующий класс javax.servlet.AsyncListener
является частью Servlet Spec 3.0, что имеет смысл, потому что Jetty 9.0.x следует этой спецификации. Возможно, вы используете более старую версию Tomcat? Версия Tomcat до 7.0.x не реализует это, и в этом случае у вас есть проблема.
См. Также этот вопрос.
exclusion
? Всякий раз, когда я создавал сервлеты с Maven, я использовал параметр<scope>provided</scope>
дляservlet-api
. См. Stackoverflow.com/questions/1979957/… и stackoverflow.com/questions/2846673/…