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