2010-08-06 2 views
46

Я пишу дополнение к JAX-RS и включаю API Java EE 6 в качестве зависимости от Maven.Тестирование на Java EE 6 API

<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 без тел методов: From the java.net blog

You can compile you code with this jar, but of course you cannnot run your application with it since it contains only the Java EE 5 APIs and does not contain any method bodies. If you try to run, you would get this exception:

Exception in thread "main" java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/mail/Session

In order to execute a Java EE 5 application, you'll still need a Java EE 5 container, like for example the GlassFish application server.

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

Решение

Поставщик (Джерси) должен быть помещен перед тем на 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> 
+5

Вот некоторые связанные проблемы с проницательными ответами: http://www.google.com/search?q=%22java.lang.ClassFormatError%3A+Absent+Code+attribute+in+method+that+is+not + native + или + abstract + in + class + file% 22 – BalusC

+0

Я действительно грызла свои ногти этой проблемой, прежде чем я столкнулся с этим вопросом. Благодаря! –

ответ

28

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

+1

Возможно также попробовать артефакт 'jersey-server' (но объявить его ** перед **' javaee-api'). –

+0

Мне не нужен полный сервер приложений, такой как GlassFish, но ваш намек разместить поставщика (GlassFish или, в моем случае, Jersy) до того, как API станет решением! – deamon

+0

Просто обратите внимание, что URL-адрес репозитория должен быть http://download.java.net/maven/glassfish/ – hohonuuli

8

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

+0

Проблема с реализацией JBoss заключается в том, что у него много сбоев сходимости зависимостей. –

1

Альтернатива, которая является поставщиком 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, it uses jersey-server 1.11, который использует версию jsr311 версии 1.1 в соответствии с номером трикотажа.

+0

Вопрос об модульном тесте, который не обязательно запускается в контейнере EE. –

Смежные вопросы