web-dev-qa-db-ja.com

Java EE 6 APIに対するテスト

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>
48
deamon

これで問題が解決するかどうかはわかりませんが、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を宣言することが重要です。

29
Pascal Thivent

私の場合、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>も害を及ぼしません。

8

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を使用します。

1
Snekse