8

javaee-apiに対してプログラムをコンパイルします。ただし、JUnitテストでは、 java.lang.ClassFormatError:クラスファイルjavax / persistence / Persistenceでネイティブまたは抽象ではないメソッドにコード属性がないなどのエラーを回避するために、glassfishのjavaee.jarなどの特定の実装を使用する必要があります( 1も参照)。

したがって、glassfish実装でのみ使用可能なメソッドの使用は避け、アーティファクトを一般的なAPIでコンパイルしたいのですが、実装jarでjunitを実行します。ただし、どちらも同じ名前のクラスとインターフェイスを提供するため、クラスローダーで問題が発生します。

この問題を解決するための最良の方法は何ですか?この問題をMavenで解決できますか?

どうもありがとう

4

1 に答える 1

14

これは可能だと思います。実際、バージョン2.0.9以降、MavenはPOMオーダーを使用してクラスパスを構築するため、今すぐ操作できます。そして、これを依存関係スコープと組み合わせると、あなたが望むものを達成することが可能になるはずです。実際には、GlassFishのjavaee依存関係(テストスコープを使用)を依存関係のjavaee-api配置する場合、前者はテストクラスパスで後者の前に配置する必要があるため、単体テストで使用され、後者はコンパイル中に使用されます。理論的には、これは機能するはずですが、少し壊れやすいので、注意深く文書化する必要があります。

そのようなもの(架空のGFv3 jarを使用):

<dependencies>
  <dependency><!-- this one will be first on the test classpath -->
    <groupId>org.glassfish</groupId>
    <artifactId>javaee</artifactId>
    <version>6.0</version>
    <scope>test</scope>
  <dependency>
  <dependency><!-- this one will be used during compile -->
    <groupId>javax.javaee-api</groupId>
    <artifactId>javaee-api</artifactId>
    <version>6.0</version>
    <scope>provided</scope>
  <dependency>
  ...
</dependencies>
于 2010-01-22T10:26:42.567 に答える