2012-12-07 32 views
5

我目前正在嘗試將我們的構建從手動過程(MyEclipse/export as war)更改爲自動Maven構建。Tomcat 7.0.29 servlet-api類加載程序問題

由MyEclipse構建的戰爭應用程序在我們的Tomcat 7.0.29安裝(Windows 7)上部署並運行得很好。在MyEclipse構建路徑中,我們配置了一個用戶庫(tomcat),其中包含$CATALINA_HOME/lib的所有罐子。

我們有一些使用javax.servlet.http。* classes(HttpSessionEvent等)的servlet監聽器和過濾器。它們包裝在WEB-INF\classes\com\mycompany\filters

部署由Maven構建的戰爭時,我在HttpSessionEvent類上獲得NoClassDefFoundError。我用-verbose:class JVM選項做了一個跟蹤,我看到加載的最後一個類是我的來自 c:\apache\webapps\myapp\WEB-INF\classes\com\mycompany\filters目錄的過濾器。然後我嘗試加載/查找HttpSessionEvent並且無法這樣做。

servlet-api.jar當然是在我的$CATALINA_HOME\lib目錄中。

在我的pom.xml我有這種依賴性

<dependency> 
     <groupId>org.apache.tomcat</groupId> 
     <artifactId>tomcat-servlet-api</artifactId> 
     <version>7.0.29</version> 
     <scope>provided</scope> 
    </dependency> 

我在任何地方沒有任何其他的servlet-api.jar文件的文件在我的路徑/類路徑(doublechecked的lib/ext目錄和我的JDK和JRE的核準目錄還有)

我Maven的依賴性:樹是這個樣子:

[INFO] +- log4j:log4j:jar:1.2.15:compile 
[INFO] | \- javax.mail:mail:jar:1.4:compile 
[INFO] +- jstl:jstl:jar:1.2:compile 
[INFO] +- org.jdom:jdom:jar:1.1:provided 
[INFO] +- com.sun.xml.rpc:jaxrpc-impl:jar:1.1.3_01:provided 
[INFO] | +- javax.xml:jaxrpc-api:jar:1.1:provided 
[INFO] | +- com.sun.xml.messaging.saaj:saaj-impl:jar:1.3:provided 
[INFO] | | \- javax.xml.soap:saaj-api:jar:1.3:provided 
[INFO] | +- com.sun.xml.rpc:jaxrpc-spi:jar:1.1.3_01:provided 
[INFO] | \- com.sun.xml.fastinfoset:FastInfoset:jar:1.0.2:provided 
[INFO] +- org.apache.lucene:lucene-core:jar:3.6.0:compile 
[INFO] +- org.springframework:spring-context:jar:3.1.0.RELEASE:compile 
[INFO] | +- org.springframework:spring-beans:jar:3.1.0.RELEASE:compile 
[INFO] | +- org.springframework:spring-core:jar:3.1.0.RELEASE:compile 
[INFO] | | \- commons-logging:commons-logging:jar:1.1.1:compile 
[INFO] | +- org.springframework:spring-expression:jar:3.1.0.RELEASE:compile 
[INFO] | \- org.springframework:spring-asm:jar:3.1.0.RELEASE:compile 
[INFO] +- org.springframework:spring-web:jar:3.1.0.RELEASE:compile 
[INFO] | \- aopalliance:aopalliance:jar:1.0:compile 
[INFO] +- org.springframework:spring-orm:jar:3.1.0.RELEASE:compile 
[INFO] | +- org.springframework:spring-jdbc:jar:3.1.0.RELEASE:compile 
[INFO] | \- org.springframework:spring-tx:jar:3.1.0.RELEASE:compile 
[INFO] +- org.springframework:spring-aop:jar:3.1.0.RELEASE:compile 
[INFO] +- org.springframework:spring-test:jar:3.1.0.RELEASE:test 
[INFO] +- org.aspectj:aspectjrt:jar:1.7.1:compile 
[INFO] +- org.aspectj:aspectjweaver:jar:1.7.1:compile 
[INFO] +- javax.faces:javax.faces-api:jar:2.1:compile 
[INFO] +- com.sun.faces:jsf-impl:jar:2.1.15:compile 
[INFO] +- org.primefaces:primefaces:jar:3.4.2:compile 
[INFO] +- org.richfaces.core:richfaces-core-api:jar:4.2.3.Final:compile 
[INFO] | \- com.google.guava:guava:jar:11.0.2:compile 
[INFO] |  \- com.google.code.findbugs:jsr305:jar:1.3.9:compile 
[INFO] +- org.richfaces.ui:richfaces-components-ui:jar:4.2.3.Final:compile 
[INFO] | \- org.richfaces.ui:richfaces-components-api:jar:4.2.3.Final:compile 
[INFO] +- org.apache.tomcat:tomcat-servlet-api:jar:7.0.29:provided 
[INFO] +- org.slf4j:slf4j-log4j12:jar:1.7.2:compile 
[INFO] | \- org.slf4j:slf4j-api:jar:1.7.2:compile 
[INFO] +- org.hibernate:hibernate-core:jar:3.6.2.Final:compile 
[INFO] | +- antlr:antlr:jar:2.7.6:compile 
[INFO] | +- commons-collections:commons-collections:jar:3.1:compile 
[INFO] | +- dom4j:dom4j:jar:1.6.1:compile 
[INFO] | +- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile 
[INFO] | +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.0.Final:compile 
[INFO] | \- javax.transaction:jta:jar:1.1:compile 
[INFO] +- org.hibernate:hibernate-entitymanager:jar:3.6.2.Final:compile 
[INFO] | +- cglib:cglib:jar:2.2:compile 
[INFO] | | \- asm:asm:jar:3.1:compile 
[INFO] | \- javassist:javassist:jar:3.12.0.GA:compile 
[INFO] +- org.hibernate:hibernate-validator:jar:4.1.0.Final:compile 
[INFO] | \- javax.validation:validation-api:jar:1.0.0.GA:compile 
[INFO] +- org.apache.commons:commons-email:jar:1.2:compile 
[INFO] | \- javax.activation:activation:jar:1.1:compile 
[INFO] +- junit:junit:jar:4.11:test 
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test 
[INFO] \- com.h2database:h2:jar:1.3.170:test 

我一直在尋找這個在互聯網上一段時間,從我讀過這必須有一定的與tomcat類加載器有關。我的戰爭包裝很可能有問題。但是,我還沒有找到解決方案。

任何指針將不勝感激!

+0

我可能會複製該項目,並刪除一切,但一個單獨的servlet或過濾器和嘗試,如果它的工作原理。和/或嘗試將其部署到不同的引擎,例如Jetty。 – biziclop

回答

0

您是否檢查過構建的.war的WEB-INF/lib以絕對確定servlet-api.jar不存在?只要我能說出來,Maven依賴關係就具有合適的範圍。

在pom.xml你build部分應該與此類似:

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.2</version> 
      <configuration> 
       <warName>war_name</warName> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

不,不要把servlet-api.jar在你的web應用程序的文件夾WEB-INF/lib。 另外,我不認爲你需要tomcat用戶庫。您需要的唯一庫是JRE System Library xx和Maven Dependencies

+0

感謝您的回覆。是的,絕對的,構建的戰爭不包含servlet-api.war。實際上,servlet-api.jar不應放在WEB-INF/lib目錄中,在任何情況下,它都會被tomcat忽略。我的戰爭插件的版本是2.1.1,我會檢查,看看2.2版本修復了這個(這似乎很奇怪) – avhv

+0

通過MyEclipse的和一個Maven的內置建成的.war之間的任何相關的區別? (順便說一下有你運行'MVN最近clean'?) –

+0

是,通過內置的MyEclipse戰爭中含有較多的廣口瓶,如Apache公地的東西,Lucene的等...我可能會丟失在我的Maven構建一些罐子,但由於項目已經編譯的事實不會有很多。順便說一下,我已經嘗試從分解的WEB-INF/lib目錄中刪除所有jar,從MyEclipse war複製所有jar並重新部署。這也不起作用(HttpSessionEvent上的NoClassDefFoundError)。 – avhv

0

Classloading in Tomcat這會幫助你理解。

將您在/WEB-INF/lib中的jar

應用的classloader - 爲每個Web應用程序, 部署在一個Tomcat實例創建的類加載器。您網絡應用程序的/ WEB-INF/classes目錄中的所有解壓縮類和 資源, 以及您的Web應用程序的/ WEB-INF/lib 目錄下的JAR文件中的類和資源都可以通過此Web顯示出來 應用程序,但不適用於其他人。

+0

謝謝,我從那個鏈接理解的是,我的webapp得到一個 「的webapp」 類加載器(這將加載從WEB-INF/classes和WEB-INF/lib目錄/ *。JAR類)。類加載器繼承自「Common」類加載器,它應該能夠很好地加載HttpSessionEvent類。或者,當我的webapp類加載器沒有找到類時,它不會委託給父類加載器(根本沒有意義)? – avhv

+1

'$ CATALINA_HOME \ ** **庫'似乎不正確應該是'$ CATALINA_HOME \ lib'目錄名是在問題無效?這是一個錯誤還是真的罐被放在libs目錄中?在這種情況下,通用類加載器將無法找到類。 –

+0

對不起,我的錯誤(錯誤),$ CATALINE_HOME = C:\ Apache的Tomcat的7.0.29和它在目錄C:\ Apache的Tomcat的7.0.29 \ lib中 – avhv