Тестирование на Java EE 6 API - PullRequest
       32

Тестирование на Java EE 6 API

48 голосов
/ 06 августа 2010

Я пишу дополнение к 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
    ...

Если я включу Джерси в качестве реализации JAX-RS вместо API Java EE, все будет хорошо.

Благодаря подсказке BalusC я знаю, что я догадался: Java EE 6 - это всего лишь API без тел методов: Из блога java.net

Вы можете скомпилировать свой код с этим банка, но, конечно, вы не можете бежать ваше приложение с ним, так как содержит только API Java EE 5 и не содержит никаких методов тела. Если вы пытаетесь бежать, вы получите это Исключение:

Исключение в теме "главная" java.lang.ClassFormatError: отсутствует Атрибут кода в методе, который не является родной или абстрактный в файле класса javax / почта / Session

Чтобы выполнить Java EE 5 приложение, вам все равно понадобится Java ЕЕ 5 контейнер, как, например, Сервер приложений GlassFish.

Я пытался добавить Джерси с 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>

Как я могу протестировать программное обеспечение, которое зависит только от официального API Java EE?

Решение

Поставщик (Джерси) должен быть размещен перед API (javeee-api) в pom.xml.

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

Ответы [ 3 ]

29 голосов
/ 06 августа 2010

Не уверен, что это решит вашу проблему, но 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 артефакт до javaee-api.

8 голосов
/ 21 ноября 2012

Что касается меня, реализация 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> также не должно причинять вреда.

1 голос
/ 23 февраля 2013

Альтернативой, независимой от поставщика 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 , в котором используется jsr311 версия 1.1 в соответствии с коэффициентом джерси.

...