2010-08-06 28 views
46

que escribir una adición a JAX-RS y contó con la API de Java EE 6 como una dependencia Maven.Pruebas basadas en Java EE 6 API

<dependency> 
    <groupId>javax</groupId> 
    <artifactId>javaee-api</artifactId> 
    <version>6.0</version> 
    <scope>provided</scope> 
</dependency> 

Entonces tengo un poco de caso de prueba:

@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)); 
    } 

Pero me da un error:

java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/ws/rs/core/MediaType 
    ... 

Si incluyo Jersey como una aplicación JAX-RS en lugar de Java EE API todo está bien.

Gracias a la insinuación de BalusC sé lo que me había imaginado: Java EE 6 sólo es una API y sin código de método: 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.

He intentado añadir Jersy con test alcance pero no lo hicieron trabajo.

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

¿Cómo puedo probar el software que solo depende de la API oficial de Java EE?

Solución

El proveedor (Jersey) tiene que ser colocado antes la API (javeee-api) en el 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

Estos son algunos problemas relacionados con las respuestas perspicaces: http://www.google.com/search?q=%22java.lang.ClassFormatError%3A+Absent+Code+attribute+in+method+hat+is+not + nativo + o + abstracto + en + clase + archivo% 22 – BalusC

+0

Realmente estaba mordiéndome las uñas con este problema antes de toparme con esta pregunta. ¡Gracias! –

Respuesta

28

No estoy seguro de que esto resuelva su problema, pero GlassFish Embedded proporciona una implementación de Java EE 6. Agregue esto a su 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> 

Es importante declarar la glassfish-embedded-all artefacto antes la javaee-api.

+1

Quizás también intente con el artefacto 'jersey-server' (pero lo declare ** antes de ** el' javaee-api'). –

+0

No necesito un servidor de aplicaciones completo como GlassFish, pero su sugerencia es colocar el proveedor (GlassFish o, en mi caso, Jersy) antes de que la API fuera la solución. – deamon

+0

Sólo una nota de que la URL del repositorio debe ser en realidad http://download.java.net/maven/glassfish/ – hohonuuli

8

En cuanto a mí, la implementación de JBoss es más pequeño que todo el Glassfish, así que estoy usando:

<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> también debe hacer ningún daño.

+0

Problema con la implementación de JBoss es que tiene una gran cantidad de fallas de convergencia de dependencia. –

1

Una alternativa que es el proveedor JSR agnóstico es

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

Esto le permite cambiar Jersey con un proveedor diferente. Para Glassfish 3.1.2, it uses jersey-server 1.11, que usa jsr311 versión 1.1 según el jersey pom.

+0

La pregunta es acerca de la prueba unitaria, que no necesariamente se ejecuta en un contenedor EE. –