Maven загружает Servlet API дважды - PullRequest
2 голосов
/ 21 апреля 2011

Я получаю ClassCastException для org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

В логах вижу, что мой javax.servlet.Filter загружается дважды.

Однажды из моего местного хранилища Maven

[Loaded javax.servlet.Filter from file:/C:/Users/xxxx/.m2/repository/javax/servlet/servlet-api/2.5/servlet-api-2.5.jar]

И еще один от кота

[Loaded javax.servlet.Filter from file:/C:/Apache.org/apache-tomcat-6.0.32/lib/servlet-api.jar]

Как только загружается вторая версия фильтра, в журнале сервера появляется следующее исключение:

Apr 20, 2011 2:42:21 PM org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter struts2
java.lang.ClassCastException:    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter cannot be cast to javax.servlet.Filter
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4071)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4725)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:675)
at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:601)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1315)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1061)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
at org.apache.catalina.core.StandardService.start(StandardService.java:525)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Apr 20, 2011 2:42:21 PM org.apache.catalina.core.StandardContext start
SEVERE: Error filterStart

Вот фрагмент моего pom.xml

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <type>jar</type>
    <scope>provided</scope>
    <optional>false</optional>
</dependency>

Спасибо за внимание.

Ответы [ 2 ]

4 голосов
/ 21 апреля 2011

Вы должны пометить зависимость servlet-api в вашем pom.xml как <scope>provided</scope>, чтобы maven не включал ее в окончательную сборку. Затем выполните mvn clean package

3 голосов
/ 21 апреля 2011

Попытка очистить все взорвавшиеся войны из вашего временного каталога tomcat. Иногда этот мусор вызывает загрузку нескольких версий класса. Особенно, если вы поменяли ваш pom.xml за это время. Сделайте это и оставьте область как provided

...