我在加载 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并重新运行war,但仍然出现另一个错误:
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。
我认为 tomcat 没有捆绑 slf4j,因此从
tomcat/lib
中删除它是正确的步骤。
那么,
servlet-api-x.jar
中不应该有WEB-INF/lib
,因为它与tomcat捆绑在一起。在 Maven pom 中将其标记为 <scope>provided</scope>
。
为了确保一切都清理干净,请致电
mvn clean
似乎有一些东西正在拉入 servlet-api-2.4.jar,它不应该作为 web 应用程序的一部分进行部署。 如果您的项目中有 servlet-api 作为依赖项,请确保它的范围为 provided。 这告诉maven使用它来编译而不是打包。 (请参阅此 Maven FAQ 条目和依赖机制简介)。
但是,servlet-api 也可能被拉入,因为它是从项目依赖项之一传递引用的。 如果是这种情况,请尝试运行:
mvn
依赖:树
打印出传递依赖项列表以及它们来自哪里。 在输出中,搜索具有未提供范围的 servlet-api 依赖项。 然后,您可以通过在 POM 中向其祖先依赖项添加排除来删除违规者。
面临同样的问题。我发现javax.servlet和servlet-api是传递引用的,如下图所示: (P.S.使用依赖分析器插件查找jar依赖信息)
我只是排除了这个冲突jar,问题就解决了。
<dependency>
<groupId>com.company.css</groupId>
<artifactId>css-attend-service</artifactId>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>org.mortbay.jetty</groupId>
</exclusion>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet</artifactId>
</exclusion>
</exclusions>
</dependency>