J'écris un ajout à JAX-RS et j'ai inclus l'API Java EE 6 comme dépendance Maven.
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
Ensuite, j'ai un petit cas de test:
@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));
}
Mais j'obtiens une erreur:
Java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/ws/rs/core/MediaType
...
Si j'inclus Jersey comme implémentation JAX-RS au lieu de Java EE API, tout va bien.
Grâce à l'indice de BalusC, je sais ce que j'avais deviné: Java EE 6 n'est qu'une API sans corps de méthode: Du blog Java.net
Vous pouvez compiler votre code avec ce fichier jar, mais bien sûr vous ne pouvez pas exécuter votre application avec lui car il contient uniquement les API Java EE 5 et ne contient aucun corps de méthode. Si vous essayez d'exécuter , vous obtiendrez cette exception:
Exception dans le thread "main" Java.lang.ClassFormatError: attribut de code absent dans la méthode qui n'est pas natif ou abstrait dans le fichier de classe javax/mail/Session
Pour exécuter une application Java EE 5, vous aurez toujours besoin d'un conteneur Java EE 5), comme par exemple le serveur d'applications GlassFish.
J'ai essayé d'ajouter Jersy avec test
scope mais cela n'a pas fonctionné.
<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>
Comment puis-je tester un logiciel qui ne dépend que de l'API officielle Java EE)?
Solution
Le fournisseur (Jersey) doit être placé avant l'API (javeee-api) dans le 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>
Vous n'êtes pas sûr que cela résoudra votre problème, mais GlassFish Embedded fournit une implémentation Java EE 6. Ajoutez ceci à votre 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>
Il est important de déclarer le glassfish-embedded-all
artefact avant le javaee-api
.
Une alternative indépendante du fournisseur JSR est
<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>
Cela vous permet d'échanger Jersey avec un autre fournisseur. Pour Glassfish 3.1.2, il utilise jersey-server
1.11 , qui utilise jsr311
version 1.1 selon le pom du maillot.