JAX-RSへの追加を記述し、Maven依存関係としてJavaEE 6 APIを含めました。
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
次に、小さなテストケースがあります。
@Test
public void testIsWriteable() {
class SpecialViewable extends Viewable {
public SpecialViewable() {
super("test");
}
}
FreeMarkerViewProcessor processor = new FreeMarkerViewProcessor(null);
assertTrue(processor.isWriteable(SpecialViewable.class, null, null,
MediaType.WILDCARD_TYPE));
}
しかし、エラーが発生します:
Java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/ws/rs/core/MediaType
...
JavaEE APIの代わりにJAX-RS実装としてJerseyを含める場合、すべてが問題ありません。
BalusCのヒントのおかげで、私が推測したことがわかります:JavaEE 6はメソッド本体のないAPIにすぎません: Java.netブログから
このjarを使用してコードをコンパイルできますが、JavaEE 5 APIのみが含まれ、メソッド本体が含まれていないため、もちろんこのjarを使用してアプリケーションを実行することはできません。実行しようとすると、次の例外が発生します。
スレッド「メイン」の例外Java.lang.ClassFormatError:クラスファイルjavax/mail/Sessionのネイティブまたは抽象ではないメソッドにコード属性がありません
JavaEE 5アプリケーションを実行するには、GlassFishアプリケーションサーバーなどのJavaEE 5コンテナが必要です。
test
スコープでJersyを追加しようとしましたが、機能しませんでした。
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey-version}</version>
<scope>test</scope>
</dependency>
公式のJavaEE APIのみに依存するソフトウェアをテストするにはどうすればよいですか?
ソリューション
プロバイダー(ジャージー)は、pom.xmlのAPI(javeee-api)の前に配置する必要があります。
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
これで問題が解決するかどうかはわかりませんが、GlassFish EmbeddedはJava EE 6実装を提供します。これをpom.xml
に追加してください:
<project>
...
<repositories>
<repository>
<id>glassfish-extras-repository</id>
<url>http://download.Java.net/maven/glassfish/org/glassfish/extras</url>
</repository>
</repositories>
...
<dependencies>
<dependency>
<groupId>org.glassfish.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.0.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
...
</dependencies>
...
</project>
glassfish-embedded-all
アーティファクトbeforejavaee-api
を宣言することが重要です。
私の場合、JBossの実装はGlassfish全体よりも小さいため、以下を使用しています。
<dependency>
<groupId>org.jboss.spec</groupId>
<artifactId>jboss-javaee-6.0</artifactId>
<version>${version.jboss-javaee-6.0}</version>
<type>pom</type>
</dependency>
<scope>test</scope>
も害を及ぼしません。
JSRプロバイダーにとらわれない代替策は、
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
これにより、ジャージーを別のプロバイダーと交換できます。 Glassfish 3.1.2の場合、 jersey-server
1.11を使用 で、ジャージーpomに応じてjsr311
バージョン1.1を使用します。