0

commons-codec 1.5のクラスBase64を使用したいのですが、サーバーでコードを実行すると、これは正常に機能します。私のアプリケーションはWebsphere7.0で実行されます。

しかし、JUnitテストを実行すると、次のようにクラスに尋ねると、間違ったBase64クラスが選択されます。

System.out.println(Base64.class.getProtectionDomain().getCodeSource().getLocation());

出力は次のとおりです。file:/ C:/EProg/IBM/SDP80/runtimes/base_v7/plugins/com.ibm.ws.prereq.soap.jar

それは間違いなく間違ったバージョンです。

また、バージョンが間違っているためにエラーが発生します。

java.lang.NoSuchMethodError:org / apache / commons / codec / binary / Base64.decodeBase64(Ljava / lang / String;)

クレイジーなことは、それは私が1つのテストを選択し、それを実行:EclipseのJUnitテストで実行する場合にのみ発生することです。Mavenですべてを実行すると、すべてが正常に機能します。

JUnit4.8.1とEclipseIndigoService Release 2を、Websphere、GWT、Maven用のプラグインとともに使用しています。」

4

2 に答える 2

3

com.ibm.ws.prereq.soap.jarはOSGiバンドルであり、WebSphere(OSGiコンテナー上に構築されている)では、そのパッケージはOSGiバンドルによってエクスポートされないため、のクラスはアプリケーションに表示されません(ファイルorg.apache.commons.codec.binaryを確認することで、エクスポートされたパッケージのリストを調べることができます)META-INF/MANIFEST.MFcom.ibm.ws.prereq.soap.jar)。これが、WebSphereでアプリケーションを実行するときに問題が発生しない理由を説明しています。

一方、そのJARをEclipseのJavaプロジェクトに追加すると、OSGiバンドルではなく、単純なJARのように扱われ、すべてのパッケージが表示されます。commons-codecあなたの場合、これは別の依存関係との競合を引き起こします。

Mavenでこの問題が発生しない理由はcom.ibm.ws.prereq.soap.jar、Eclipseプロジェクトの依存関係のみであり、Mavenプロジェクトの依存関係ではないためだと思います。

残念ながら、その問題を解決するための(単純な)方法は多くありません。1つは、Javaプロジェクトから削除するcom.ibm.ws.prereq.soap.jarことです(実際にApache SOAPを使用しているとは思えません)。もう1つは、順序を変更して、他のcommons-codec依存関係がの前になるようにすることcom.ibm.ws.prereq.soap.jarです。

于 2012-10-06T18:06:27.090 に答える
0

クラスパスの問題のようです。より正確には、EclipseとMavenの統合。Eclipseの依存関係を調査し、依存関係の管理にMavenを使用していることを確認します。これは、mvn eclipse:eclipseコマンドを実行するか、M2Eclipseプラグインを使用するかの2つの方法で実行できます。後者を使用する場合は、プロジェクトのコンテキストメニューに依存関係の更新オプションがあります。

于 2012-10-05T16:40:33.760 に答える