Maven 和 Tomcat 中的 Jar 冲突?

问题描述 投票:0回答:3

我在加载 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。

java tomcat jar maven struts2
3个回答
7
投票

我认为 tomcat 没有捆绑 slf4j,因此从

tomcat/lib
中删除它是正确的步骤。

那么,

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

为了确保一切都清理干净,请致电

mvn clean


2
投票

似乎有一些东西正在拉入 servlet-api-2.4.jar,它不应该作为 web 应用程序的一部分进行部署。 如果您的项目中有 servlet-api 作为依赖项,请确保它的范围为 provided。 这告诉maven使用它来编译而不是打包。 (请参阅此 Maven FAQ 条目依赖机制简介)。

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

mvn
依赖:树

打印出传递依赖项列表以及它们来自哪里。 在输出中,搜索具有未提供范围的 servlet-api 依赖项。 然后,您可以通过在 POM 中向其祖先依赖项添加排除来删除违规者。


0
投票

面临同样的问题。我发现javax.servlet和servlet-api是传递引用的,如下图所示: (P.S.使用依赖分析器插件查找jar依赖信息) enter image description here

我只是排除了这个冲突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>
© www.soinside.com 2019 - 2024. All rights reserved.