編集:上記のjavaee-endorsed-api
アプローチはおそらくうまくいくでしょうが、それは私に意欲を与えます。もう生産も維持もされていないと思います。さらに、そのpom.xml
中に含まれているのは、ある時点でそれが呼び出されたことを反映しておりjavaee-compact-api
、実装クラスをどのように取り除くかを確認できます。対照的に、承認済みとして使用するAPI jarをチェリーピッキングすることは(以下で推奨するように)、より安定していて柔軟性があるようです。javaee-endorsed-api
最後に、それでもこのアプローチを使用したい場合は、私が推奨する一般的なアプローチを使用して、javaee-endorsed-api.jar
代わりにポイントすることができます。
ライアン; 同じ旅で、これに関する長い道のり(StackOverflow、java.netフォーラムなどに触れる)をくまなく調べました。
java.endorsed.dirs
ご存知のように、ユニットテストまたは統合テストでは、Systemプロパティを設定する必要があります。
秘訣は、テストを実行しているJVMがそれを取得するような方法でこれを実行する必要があることです。そして、それはSurefireをどのように実行しているかによって異なります。
何らかの理由でSurefireをフォークしないように設定している場合、これはおそらく悪いことであり、ここで構成を再評価する必要があります。
java.endorsed.dirs
Surefireをフォークに設定している場合は、次のように単純にsystemPropertyVariables
スタンザに含めることができると思うかもしれません。
<systemPropertyVariables>
<java.endorsed.dirs>weWillGetToThisInAMoment</java.endorsed.dirs>
</systemPropertyVariables>
...しかし、それは間違っているでしょう。その理由は、実際に実行されているプログラムはと呼ばれるものForkedBooter
であり、ForkedBooter
プログラムによって単体テストのシステムプロパティを設定するためです。つまり、<systemPropertyVariables>
スタンザが読み取られるまでには、ForkedBooter
もう手遅れです。
ただし、Surefire構成では次のように使用できます。<argLine>
<configuration>
<argLine>-Djava.endorsed.dirs=weWillGetToThisInAMoment</argLine>
</configuration>
これで、SurefireがフォークするVMには、承認されたディレクトリが適切に設定されます。それでは、どのような価値を提供するかについて話しましょう。
オーバーライドするAPIを選択します。あなたの場合、javax.annotation.*
は正当な選択です。関連するjarを格納するローカルMavenリポジトリーのディレクトリーを提供したいとします。
これが私が使用する値です:
${settings.localRepository}${file.separator}org${file.separator}glassfish${file.separator}main${file.separator}javaee-api${file-separator}javax.annotation${file.separator}${javaxAnnotationVersion}
${settings.localRepository}
Mavenは、それがローカルのMavenリポジトリーが存在する場所の価値にまで拡大することを保証します。
${file.separator}
System.getProperty("file.separator")
Mavenプロパティ置換での値を取得する方法です。
- 私の場合、 JavaEE6で定義されているようにパッケージをバンドルするGlassFishアーティファクトで
<dependency>
すでに宣言しています。そこで、ここでアーティファクトへのパスを作成しました。また、という名前のプロパティを定義しました。これは、私にとってはに設定されています。javax.annotation
javaxAnnotationVersion
3.1.2
これらすべてを実行すると、SurefireがVMをフォークして単体テストを実行すると、承認されたディレクトリが、javax.annotation
クラスを格納するjarを含むローカルMavenリポジトリ内のディレクトリに設定され、GlassFishが埋め込まれます。プロセス-JavaSE6バージョンのjavax.annotation
代わりにJavaEE6バージョンのクラスを使用します。これがお役に立てば幸いです。