在Maven和Tomcat中发生冲突?

时间:2011-03-31 07:58:26

标签: java tomcat jar maven struts2

我在加载jar时遇到了一些麻烦。我在Tomcat上部署了Struts2 Web应用程序,导致错误:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:....../Tomcat%206.0/lib/slf4j-log4j12-1.5.8.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:....../Tomcat%206.0/webapps/Timesheet/WEB-INF/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
2011-03-31 14:33:48,302 DEBUG com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadConfigurationFiles:748 - Loading action configurations from: struts-default.xml
2011-03-31 14:33:50,592 DEBUG com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadConfigurationFiles:832 - Loaded action configuration from: struts-default.xml
...
2011-03-31 14:33:50,809 DEBUG com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.register:202 - Loaded type:com.opensymphony.xwork2.util.XWorkConverter name:struts impl:com.opensymphony
.xwork2.util.AnnotationXWorkConverter
Mar 31, 2011 2:33:50 PM org.apache.catalina.core.StandardContext start
SEVERE: Error filterStart
Mar 31, 2011 2:33:50 PM org.apache.catalina.core.StandardContext start
SEVERE: Context [/Timesheet] startup failed due to previous errors

我排除了pom.xml中的所有jar冲突,但它似乎是Tomcat lib中的另一个slf4j-log4j文件。

然后我尝试删除Tomcat / lib中的slf4j-log4j12-1.5.8.jar并重新运行战争,但仍然有另一个错误:

Mar 31, 2011 2:44:51 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(...\Tomcat 6.0\webapps\Timesheet\WEB-INF\lib\servlet-api-2.4.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class:
javax/servlet/Servlet.class
... // Struts file still loaded here, but another Error filterStart: the same as above.

我在这里错过了什么吗?

编辑:我删除了pom.xml中包含的冗余servlet-api:它被另一个jar意外包含。但在排除那个罐子之后我得到了错误:

Mar 31, 2011 4:11:19 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(...\Tomcat 6.0\webapps\Timesheet\WEB-INF\lib\servlet-api-2.4.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class:
javax/servlet/Servlet.class
2011-03-31 16:11:20,234 DEBUG com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadConfigurationFiles:748 - Loading action configurations from: struts-default.xml
2011-03-31 16:11:21,028 DEBUG com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadConfigurationFiles:832 - Loaded action configuration from: struts-default.xml

我的Tomcat中的servlet-api版本为2.5; pom.xml中排除的servlet-api.jar版本为2.4。

2 个答案:

答案 0 :(得分:7)

我不认为tomcat捆绑了slf4j,所以从tomcat/lib删除它是一个合适的步骤。

然后,servlet-api-x.jar中不应该有WEB-INF/lib,因为它与tomcat捆绑在一起。在maven pom中将其标记为<scope>provided</scope>

要确保清理所有内容,请致电mvn clean

答案 1 :(得分:2)

似乎有些东西正在拉入servlet-api-2.4.jar,它不应该被部署为webapp的一部分。如果您将servlet-api作为项目中的依赖项,请确保它具有提供的范围。这告诉maven使用它进行编译,但不能用于打包。 (请参阅this Maven FAQ entryIntroduction to the Dependency Mechanism)。

但是,servlet-api也可能被引入,因为它是从您的一个项目依赖项中过渡引用的。如果是这种情况,请尝试运行:

mvn dependency:tree

打印出传递依赖项列表及其来源。在输出中,使用未提供的作用域搜索servlet-api依赖项。然后,您可以通过在POM中为其祖先依赖项添加排除来删除违规者。