j2ee - Pruebas contra la API de Java EE 6
java ee documentation (3)
En cuanto a mí, la implementación de JBoss es más pequeña que todo 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>
tampoco debería causar daños.
Escribo una adición a JAX-RS e incluí la API de Java EE 6 como una dependencia de Maven.
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
Entonces tengo un pequeño 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 sale 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 implementación de JAX-RS en lugar de la API de Java EE todo está bien.
Gracias a la sugerencia de BalusC sé lo que había adivinado: Java EE 6 es solo una API sin cuerpos de métodos: del blog java.net
Puede compilar su código con este jar pero, por supuesto, no puede ejecutar su aplicación con él, ya que contiene solo las API de Java EE 5 y no contiene ningún cuerpo de método. Si intentas ejecutar, obtendrías esta excepción:
Excepción en el hilo "principal" java.lang.ClassFormatError: atributo de código ausente en el método que no es nativo o abstracto en el archivo de clase javax / mail / Session
Para ejecutar una aplicación Java EE 5, aún necesitará un contenedor Java EE 5, como por ejemplo el servidor de aplicaciones GlassFish.
Intenté agregar a Jersy con el alcance de la test
pero no funcionó.
<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) debe colocarse antes de 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>
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 el artefacto glassfish-embedded-all
antes del javaee-api
.
Una alternativa que es independiente del proveedor de JSR 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 a Jersey con un proveedor diferente. Para Glassfish 3.1.2, utiliza jersey-server
1.11 , que usa jsr311
versión 1.1 de acuerdo con jersey pom.