2012-12-07 14 views
5

私は現在、ビルドを手動プロセス(MyEclipse/export as war)から自動Mavenビルドに変更しようとしています。Tomcat 7.0.29 servlet-apiクラスローダーの問題

MyEclipseによって構築された戦争アプリケーションは、Tomcat 7.0.29のインストール(Windows 7)で展開して正常に動作します。 MyEclipseビルド・パスでは、すべてのjarファイルが$CATALINA_HOME/libからなるユーザー・ライブラリー(tomcat)を構成しました。

javax.servlet.http。*クラス(HttpSessionEventなど)を使用するサーブレットリスナーとフィルタがあります。それらはパッケージ化されています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> 

を持って、私はどこでも私のパス/クラスパスに他のサーブレット-api.jarのファイルを持っていませんが(LIB/extに、私のJDKおよびJREの承認ディレクトリをdoublechecked同様)

私の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

私はおそらく、プロジェクトをクローンし、サーブレットまたはフィルタを除いてすべてを削除して、それが動作すれば試してみます。そして/または別のエンジン、例えば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> 

そして、いや、あなたのWebアプリケーションのWEB-INF/libフォルダにservlet-api.jarを入れないでください。 また、私はtomcatユーザーライブラリが必要ではないと思います。唯一必要なライブラリはJRE System Library xxとMaven Dependenciesです。

+0

返事をありがとう。はい、確かに、ビルドされた戦争にはservlet-api.warは含まれていません。実際、servlet-api.jarはWEB-INF/libディレクトリに入れてはいけません。いずれにせよTomcatでは無視されます。 warプラグインの私のバージョンは2.1.1です。バージョン2.2がこれを修正しているかどうかをチェックします(これは奇妙に見えるでしょう) – avhv

+0

MyEclipseによって構築された.warとMavenによって構築された.warの間に関連性がありますか? (ちなみに、最近あなたは 'mvn clean 'を最近実行していますか?) –

+0

はい、MyEclipseによって構築された戦争は、Apacheのコモンズのもの、luceneのようなより多くのjarファイルを含んでいます。プロジェクトが既にそこにコンパイルされているという事実は、それらの多くはありません。ところで、私はすでに展開されたWEB-INF/libディレクトリからすべてのjarsを削除しようとしました。MyEclipseの戦争からすべてのjarsをコピーして再展開しました。それはどちらも動作しません(HttpSessionEventでもNoClassDefFoundError)。 – avhv

0

Classloading in Tomcatこれは理解に役立ちます。

置きますlibに/WEB-INF /中瓶

アプリケーションクラスローダ - クラスローダは、単一のTomcatインスタンスに を展開されている各Webアプリケーション用に作成されます。Webアプリケーションの/ WEB-INF/classesディレクトリにある リソース、 、Webアプリケーションの/ WEB-INF/lib ディレクトリにあるJARファイルのクラスとリソースは、このWebに表示されます 他のアプリケーションには適用されません。

+0

ありがとう、私はそのリンクから理解して私のwebappは "WEB-INF/classesとWEB-INF/lib/*。jarからクラスを読み込む" Webapp "クラスローダーを取得することです。クラスローダーは "Common"クラスローダーから継承します。このクラスローダーは、HttpSessionEventクラスをうまく読み込めるはずです。または、クラスを見つけられなかった場合、私のwebappクラスローダーは親クラスローダーに委譲しません(それは意味をなさないでしょう)。 – avhv

+1

'$ CATALINA_HOME \ ** libs **'は間違っているようですが、 '$ CATALINA_HOME \ lib'ディレクトリ名が問題になりますか?それは間違いですか、本当にjarファイルはlibsディレクトリに置かれていますか?その場合、共通のクラスローダーはクラスを見つけることができません。 –

+0

申し訳ありませんが、私の間違い(誤字)、$ CATALINE_HOME = C:\ apache-tomcat-7.0.29そしてC:\ apache-tomcat-7.0.29 \ libディレクトリにあります。 – avhv