Я пишу дополнение к JAX-RS и включил Java EE 6 API в качестве зависимости Maven.
javax
javaee-api
6.0
provided
Затем у меня есть небольшой тестовый пример:
@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 и не содержит никаких методов тела. Если вы пытаетесь бежать, вы получите это исключение:
Исключение в потоке "main" java.lang.ClassFormatError: отсутствует Атрибут кода в методе, который не является родной или абстрактный в файле класса javax / mail / Session
Для выполнения Java EE 5 приложение, вам все равно понадобится Java ЕЕ 5 контейнер, как, например, Сервер приложений GlassFish.
Я пытался добавить Jersy с областью test
, но она не работала.
javax
javaee-api
6.0
provided
com.sun.jersey
jersey-server
${jersey-version}
test
Как можно протестировать программное обеспечение, которое зависит только от официального API Java EE?
Решение
Поставщик (Джерси) должен быть помещен перед API (javeee-api) в pom.xml.
com.sun.jersey
jersey-server
${jersey-version}
test
javax
javaee-api
6.0
provided
Не уверен, что это решит вашу проблему, но 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
].