Я пишу дополнение к JAX-RS и включаю API Java EE 6 в качестве зависимости от 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 вместо Java EE API, все будет в порядке.
Благодаря подсказке BalusC я знаю, что я догадался: Java EE 6 - это только API без тел методов: Из блога java.net
Вы можете скомпилировать код с этим jar, но, конечно, вы не можете запустить ваше приложение с ним, так как содержит только API Java EE 5 и не содержит никаких тел метода. Если вы пытаетесь запустить, вы получите это исключение:
Исключение в потоке "main" java.lang.ClassFormatError: Отсутствует Атрибут кода в методе, который не является родной или абстрактный в файле класса javax/почта/Session
Чтобы выполнить Java EE 5 приложения, вам все равно понадобится Java ЕЕ 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>
Как я могу проверить программное обеспечение, которое зависит только от официального 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>