2012-02-03 18 views
0

私はjetty mavenプラグインを使用してWebアプリケーションをローカルで実行しています。JNDIリソースをプルしようとすると、クラスキャスト例外が発生します。Jettyクラスロードの問題

私はJNDI経由で利用される構成Beanであるリソースオブジェクトを持つjetty configを持っています。

<Configure class="org.mortbay.jetty.Server"> 
    <New class="org.mortbay.jetty.plus.naming.Resource"> 
     <Arg>config/MyConfigObject</Arg> 
     <Arg> 
      <New class="my.config.ConfigObject"> 
       <Set name="foo">bar</Set> 
      </New> 
     </Arg> 
    </New> 
</Configure> 

これは春を経由して取得されます:

は、サーブレットの内部
<bean id="MyConfigObject" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName" value="java:comp/env/config/MyConfigObject" /> 
</bean> 

、私は手動でオブジェクトをつかんだこのクラスはlibディレクトリにあるクラスパス上の別のjarファイルに格納されています。

final MyConfigObject config = (MyConfigObject) applicationContext.getBean("MyConfigObject"); 

しかし、私は、サーブレットにアクセスしようとすると、私が手:

java.lang.ClassCastException: my.config.MyConfigObject cannot be cast to my.config.MyConfigObject 

私はこの問題がクラスの読み込みに起因すると確信していますが、私は100%確実ではありません。 MyConfigObjectのクラスローダはデフォルトのsunクラスローダであり、スレッドの現在のクラスローダはjettyのWebAppClassLoaderです。私のjarファイルは、WEB-INF/libにある、と私も設定をプラグインのmavenでextraClasspathに手動で追加しました:

<plugin> 
       <groupId>org.mortbay.jetty</groupId> 
       <artifactId>maven-jetty-plugin</artifactId> 
       <version>6.1.25</version> 
       <configuration> 
        <jettyConfig>${basedir}/test/jetty.xml</jettyConfig> 
        <webAppSourceDirectory>${basedir}/target/${project.artifactId}</webAppSourceDirectory> 
        <webXml>${basedir}/war/WEB-INF/web.xml</webXml> 
        <webAppConfig> 
         <extraClasspath>${basedir}/target/${project.artifactId}/WEB-INF/lib/myConfigJar-1.0.jar</extraClasspath> 
        </webAppConfig> 
       </configuration> 
       <dependencies> 
        <dependency> 
         <groupId>testing</groupId> 
         <artifactId>myConfigJar</artifactId> 
         <version>1.0</version> 
        </dependency> 
       </dependencies> 
      </plugin> 

私は一種の立ち往生この時点でです。誰もこれを解決する方法を知っていますか?

答えて

1

問題は、あなたがあまりにも多くの場所にリストされている瓶を持っているということです。それをextraClasspathに追加しようとすると実際にはそれが良くなりません。

あなたはそれがWEB-INF/libに言うが、私はそれはまた、あなたはそれを行うにはしたくないあなたのpom.xml

で依存関係としてリストされていますと仮定し、あなたはそれを1つの参照を持っている必要があります。 pom.xmlまたはlibディレクトリ、またはextraClasspathの依存関係として1つの場所にのみ存在します。

(ヒント:pom.xmlは、他の人を取り除くため、ほぼ確実に正しい場所である)

+0

これは有望ですね。私はそれを修正しようと桟橋にすべての種類の瓶を投げた。これはプロジェクトの依存関係、プラグインの依存関係、libフォルダにあり、extraClasspathに含まれています。私はそれを試みます。 – hisdrewness

+0

私はこれを見てからしばらくしてきましたが、私はプラグインの依存関係をjarファイルにするだけで、pom(と基本的にlibはそれが私の戦争がどのように構築されているか)から依存関係を削除するか、提供する。 – hisdrewness

0

webappはでなく、には "my.config.MyConfigObject"クラス(および関連するクラス)が含まれています。

根本的な問題は、クラスを2つの異なるクラスローダーで読み込むことです。あなたのwebappクラスローダーからクラスを削除して、webappがjettyが使用しているのと同じクラスを使用するようにする必要があります。

+0

あなたは何に手の込んだことができることを意味する「などが」?このクラスはwebappプロジェクトの一部ではありません。クラスパス上にある依存プロジェクトにあります。 – hisdrewness

+0

webapp自体に何もjarを参照する必要はありません。それは桟橋のクラスパス上にあるべきです。 – jtahlborn

関連する問題