2012-12-07 3 views
5

Ich versuche derzeit, unseren Build von einem manuellen Prozess (MyEclipse/Export als Krieg) zu einem automatischen Maven Build zu ändern.Tomcat 7.0.29 Servlet-Api Classloader Problem

Die von MyEclipse erstellte War-Anwendung wird bereitgestellt und funktioniert problemlos auf unserer Tomcat 7.0.29-Installation (Windows 7). Im MyEclipse-Build-Pfad haben wir eine Benutzerbibliothek (Tomcat) konfiguriert, die alle Jars von $CATALINA_HOME/lib enthält.

Wir haben einige Servlet-Listener und Filter, die javax.servlet.http. * Classes (HttpSessionEvent etc) verwenden. Sie sind verpackt unter WEB-INF\classes\com\mycompany\filters

Bei der Bereitstellung des Krieges von Maven gebaut bekomme ich NoClassDefFoundError auf der HttpSessionEvent Klasse. Ich habe eine Spur mit der Option -verbose: class JVM gemacht und gesehen, dass die letzte geladene Klasse mein Filter aus dem Verzeichnis c:\apache\webapps\myapp\WEB-INF\classes\com\mycompany\filters ist. Ich versuche dann, HttpSessionEvent zu laden/finde und kann dies nicht tun.

Die servlet-api.jar ist natürlich in meinem $CATALINA_HOME\lib Verzeichnis.

In meinem pom.xml Ich habe diese Abhängigkeit

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

ich keine anderen Servlet-api.jar haben Dateien überall in meinem Pfad/Classpath (doublechecked die lib/ext und unterstützt Verzeichnisse meiner jdk und jre auch)

Meine maven Abhängigkeit: Baum sieht wie folgt aus:

[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 

ich habe auf diese für eine Weile im Internet suchen, und von dem, was ich gelesen habe, muss dies einige haben was mit dem Tomcat Classloader zu tun hat. Sehr wahrscheinlich stimmt etwas mit der Verpackung meines Krieges nicht. Ich habe jedoch noch keine Lösung gefunden.

Alle Hinweise werden sehr geschätzt!

+0

Ich würde wahrscheinlich das Projekt klonen und alles außer einem einzigen Servlet oder Filter entfernen und versuchen, ob es funktioniert. Und/oder versuchen Sie, es auf einer anderen Engine, zum Beispiel Jetty, bereitzustellen. – biziclop

Antwort

0

Haben Sie die WEB-INF/lib des eingebauten .war überprüft, um absolut sicher zu sein servlet-api.jar ist nicht da? Die Maven-Abhängigkeit hat den richtigen Umfang, solange ich das beurteilen kann. WEB-INF/lib Ordner

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

Und nein, nicht setzen servlet-api.jar in Ihrem Web-App:

Ihr build Abschnitt in der pom.xml sollte ähnlich sein. Außerdem glaube ich nicht, dass Sie die tomcat Benutzerbibliothek benötigen. Die einzigen Bibliotheken, die Sie benötigen, sind JRE System Library xx und Maven Dependencies.

+0

Danke für die Antwort. Ja, absolut, der gebaute Krieg enthält nicht das Servlet-api.war. In der Tat sollte die servlet-api.jar nicht in das Verzeichnis WEB-INF/lib gestellt werden, sie wird von Tomcat auf jeden Fall ignoriert. Meine Version des War-Plugins ist 2.1.1, ich überprüfe, ob Version 2.2 das behebt (was merkwürdig erscheinen würde) – avhv

+0

Gibt es einen relevanten Unterschied zwischen dem von MyEclipse und dem von Maven gebauten .war? (Übrigens hast du kürzlich eine 'mvn clean' gemacht?) –

+0

Ja, der von MyEclipse gebaute Krieg enthält mehr Gläser, wie Apache Commons Zeug, Lucene etc ... Ich könnte einige Gläser in meinem Maven Build vermissen, aber gegeben Die Tatsache, dass das Projekt bereits kompiliert wird, wird nicht viele sein. BTW, ich habe bereits versucht, alle Gläser aus dem explodierten WEB-INF/lib Verzeichnis zu löschen, alle Gläser aus dem MyEclipse Krieg zu kopieren und neu zu verteilen. Das funktioniert auch nicht (NoClassDefFoundError auf HttpSessionEvent). – avhv

0

Classloading in Tomcat dies wird Ihnen helfen, zu verstehen.

Legen Sie Ihr Glas in /WEB-INF/lib

Anwendung Classloader - Ein Klassenlader wird für jede Web-Anwendung erstellt, die in einer einzigen Tomcat-Instanz bereitgestellt ist.Alle entpackten Klassen und Ressourcen im Verzeichnis/WEB-INF/classes Ihrer Webanwendung, plus Klassen und Ressourcen in JAR-Dateien unter dem Verzeichnis/WEB-INF/lib Ihrer Webanwendung werden für dieses Web sichtbar gemacht Anwendung, aber nicht zu anderen.

+0

Danke, was ich von diesem Link verstehe, ist, dass meine Webapp einen "Webapp" Classloader bekommt (der Klassen aus WEB-INF/classes und WEB-INF/lib/*. Jar laden wird). Der Klassenladeprogramm erbt vom Klassenladeprogramm "Common", das die HttpSessionEvent-Klasse problemlos laden kann. Oder delegiert mein WebApp-Classloader nicht an den übergeordneten Classloader, wenn er keine Klasse findet (was überhaupt keinen Sinn ergibt)? – avhv

+1

'$ CATALINA_HOME \ ** libs **' scheint falsch, es sollte sein '$ CATALINA_HOME \ lib' Verzeichnisname ist in der Frage ungültig? Ist es ein Fehler oder wirklich Gläser sind im Verzeichnis libs platziert? In diesem Fall kann Common Classloader keine Klasse finden. –

+0

Entschuldigung, mein Fehler (Tippfehler), $ CATALINE_HOME = C: \ apache-tomcat-7.0.29 und es befindet sich im Verzeichnis C: \ apache-tomcat-7.0.29 \ lib – avhv

Verwandte Themen