2011-03-31 44 views
2

我在加載jar時遇到了一些麻煩。我部署了一個Struts2的Web應用程序在Tomcat上,它導致錯誤:Maven和Tomcat的罐子衝突?

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-衝突,但它似乎又是slf4j-log4j文件在Tomcat的lib。

然後我試圖刪除SLF4J-log4j12-1.5.8.jar在Tomcat的/ lib目錄並重新運行戰爭,但還是得到了另一個錯誤:

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:它被意外由另一個罐包括在內。但排除那個罐子後,我得到了錯誤:

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。

回答

7

我不認爲tomcat附帶slf4j捆綁,所以從tomcat/lib中刪除它是一個合適的步驟。

然後,你不應該有servlet-api-x.jarWEB-INF/lib,因爲它與tomcat捆綁在一起。在maven pom中將其標記爲<scope>provided</scope>

要確保一切都清理了警鐘mvn clean

+0

我認爲這可能是原因的一部分,但問題仍然存在。您介意查看我更新的問題嗎? – 2011-03-31 09:22:47

+0

@HoàngLong mvn clean,以確保舊罐子不存在於目標 – Bozho 2011-03-31 10:54:07

+1

實際上,「mvn clean」解決了我的問題,即使我沒有在pom.xml中排除servlet-api-2.4.jar。奇怪。 – 2011-04-04 04:31:01

2

看來,事情是在是不應該被部署爲web應用程序的一部分servlet的API-2.4.jar拉動。如果您的項目中有servlet-api作爲依賴項,請確保它的範圍爲,並提供。這告訴maven使用它進行編譯,但不包裝。 (見this Maven FAQ entryIntroduction to the Dependency Mechanism)。

但是,servlet-api可能也被拉進來,因爲它是從你的一個項目依賴項傳遞引用的。如果是這樣的情況下,嘗試運行:

mvndependency:tree

打印出來傳遞依賴,並在那裏,他們都來自列表。在輸出中,使用非提供的範圍搜索servlet-api依賴關係。然後,您可以通過向POM中的祖先依賴項添加排除項來移除違規者。

+0

@Bozho:你說得對,但是在排除servlet-api之後,問題仍然存在。我認爲如果Tomcat提供jar,我不需要將它包含在pom.xml中。是對的嗎? – 2011-03-31 09:25:44

+0

@HoàngLong:在Maven中你仍然需要servlet-api進行編譯,否則在編譯時不會發現任何涉及到基本Servlet/JSP類(HttpServlet,ServletRequest等)的內容。它仍然需要包括在內,但是「提供」範圍。 – prunge 2011-04-01 01:55:01

+0

對不起,但我找不到任何方法來執行此操作。我怎麼能指定一個jar提供,而它被傳遞的依賴拉? – 2011-04-01 08:03:37