针对 Java EE 6 API 进行测试

2022-08-31 22:13:15

我编写了 JAX-RS 的补充内容,并将 Java EE 6 API 作为 Maven 依赖项包含在内。

<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
    ...

如果我将 Jersey 作为 JAX-RS 实现而不是 Java EE API,一切都很好。

多亏了BalusC的提示,我知道我猜到了什么:Java EE 6只是一个没有方法体的API:来自 java.net 博客

您可以使用此jar编译代码,但当然不能使用它运行应用程序,因为它仅包含Java EE 5 API并且不包含任何方法体。如果您尝试运行,则会收到以下异常:

线程“main” java.lang.ClassFormatError 中的异常:在类文件 javax/mail/Session 中非本机或抽象的方法中缺少代码属性

为了执行 Java EE 5 应用程序,您仍然需要一个 Java EE 5 容器,例如 GlassFish 应用程序服务器。

我试图添加带有范围的Jersy,但它不起作用。test

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

如何测试仅依赖于官方 Java EE 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>

答案 1

不确定这会解决您的问题,但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-alljavaee-api


答案 2

至于我,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>也应该没有伤害。


推荐