2016-06-19 8 views
3

NetBeansとMavenを使用してJEEプロジェクトを構築しています。このプロジェクトには、EJBモジュール、Webモジュール、およびSEクラスライブラリが含まれています。いつものように、WebモジュールにはEJBモジュールが依存しています。彼らはどちらもクラスライブラリを依存関係として持っています。このプロジェクトは、GlassFishまたはJBoss、さらに最近ではWildFlyを使用して何年も働いてきたプロジェクトの変更コピーです。元のプロジェクトは、Antを使用してビルドおよびデプロイされました。今私はMavenを使用しています。新しい(maven)プロジェクトは、GlassFishを使用してもうまく動作しますが、WildFly 10は使用しません。キャストステートメントにClassCastExceptionがスローされます。問題の原因を突き止めるために、私は簡単なテストを行った。その結果は全く奇妙です。ここにあります:完全に奇妙なClassCastException

私は3つのインターフェイスを作成しました.1つはクラスライブラリに、もう1つは各モジュールに1つ作成しました。これらは次のとおりである:

// interface at the class library 
package jee2ap102.lib; 
public interface I01 { 
} 

// interface at the EJB module 
package jee2ap102.ejb; 
public interface I0101 extends jee2ap102.lib.I01 { 
} 

// interface at the Web module 
package jee2ap102.web; 
public interface I010101 extends jee2ap102.ejb.I0101 { 
} 

は、次にWebモジュールでIは、Beanを作成し、以下の方法を追加しました:

public String check() { 
    boolean b; 
    b = jee2ap102.lib.I01.class.isAssignableFrom(jee2ap102.ejb.I0101.class); 
    b = jee2ap102.lib.I01.class.isAssignableFrom(jee2ap102.web.I010101.class); 
    b = jee2ap102.ejb.I0101.class.isAssignableFrom(jee2ap102.web.I010101.class); 
} 

を3つのステートメントがtrueを返す必要がありますが、最後のものだけが行います。 これによると、階層のルートであるクラスライブラリにあるインタフェースI01は、ライブラリ(EJBまたはWebモジュールのいずれか)の外部にあるインタフェースから、それらのインタフェースが拡張されているかどうかにかかわらず割り当て可能ではありませんそれはです。一貫して、I0101またはI010101をI01にキャストしようとすると、ClassCastExceptionがスローされます。

この問題を理解し解決するためには、本当に助けていただければ幸いです。

+0

あなたのクラスが異なるクラスローダーを使用してロードされた場合、あなたはこの奇妙な動作をするかもしれません。私は耳のモジュールを使用する前に同様の問題を見たことがあります。 –

答えて

2

私のコメントによると、war arhiveはlib jarとは異なるクラスローダを使用している可能性が最も高い問題です。これは記述されていますin this question

+0

こんにちは!ご回答有難うございます。あなたがクラスローダーに言及するまで私は無知でした。私は最終的に問題と解決策を見つけることができました。私は、私のようなメイヴン・グリーンホーンに起こる可能性が高いと思う。問題は、クラスモジュールの依存関係をEJBモジュールからコピーすることでWebモジュールに追加したことで、少し違う必要があることに気が付きませんでした。解決策は、** scope提供された**要素をWebモジュール依存関係に追加することでした。 –

+0

思い出しているように、EJBモジュールの依存関係により、Mavenはクラスライブラリをearのlibディレクトリに追加します。 Webモジュールの依存関係により、Mavenはクラスライブラリをwarのlibディレクトリにも追加していました。だから、私は同じ瓶を2回持つことになり、クラスローダーはそれらを両方ともロードしなければなりません。 ** Webモジュールの** scopeを使用すると、Mavenは戦争にjarファイルを追加することができず、したがって両方のモジュールが唯一のjarファイルを共有します。問題が解決しました。再度、感謝します。 –

+0

ところで、私はこの質問への回答を追加できませんでした。なぜなら、それは別の質問の重複としてマークされていて、その質問に答えを加えるのは適切ではないようです。私がやっていなかったクラスローダーで遊んでいる "**。 –