Test par rapport à l’API Java EE 6

J’écris un ajout à JAX-RS et j’ai inclus l’API Java EE 6 comme dépendance de Maven.

 javax javaee-api 6.0 provided  

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’ai une erreur:

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

Si j’inclus Jersey en tant qu’implémentation JAX-RS au lieu de l’API Java EE, 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éthodes: à partir du blog java.net

Vous pouvez comstackr votre code avec ce fichier jar, mais bien sûr, vous ne pouvez pas exécuter votre application car elle ne contient que 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: Atsortingbut Code absent dans la méthode qui n’est ni natif ni abstrait dans le fichier de classe javax / mail / Session

Afin d’exécuter une application Java EE 5, vous aurez toujours besoin d’un conteneur Java EE 5, comme par exemple le serveur d’application GlassFish.

J’ai essayé d’append Jersy avec la scope du test mais cela n’a pas fonctionné.

  javax javaee-api 6.0 provided   com.sun.jersey jersey-server ${jersey-version} test  

Comment puis-je tester un logiciel qui ne dépend que de l’API Java EE officielle?

Solution

Le fournisseur (Jersey) doit être placé avant l’API (javeee-api) dans le fichier pom.xml.

  com.sun.jersey jersey-server ${jersey-version} test   javax javaee-api 6.0 provided  

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 :

  ...   glassfish-extras-repository http://download.java.net/maven/glassfish/org/glassfish/extras   ...   org.glassfish.extras glassfish-embedded-all 3.0.1 test   javax javaee-api 6.0 provided  ...  ...  

Il est important de déclarer l’artefact ” glassfish-embedded-all avant javaee-api .

Pour ma part, l’implémentation de JBoss est plus petite que celle de Glassfish, donc j’utilise:

   org.jboss.spec jboss-javaee-6.0 ${version.jboss-javaee-6.0} pom  

test ne devrait pas non plus nuire.

Une alternative qui est agnostique pour le fournisseur JSR est

  javax.ws.rs jsr311-api provided   javax javaee-api 6.0 provided  

Cela vous permet d’échanger Jersey avec un autre fournisseur. Pour Glassfish 3.1.2, il utilise le jersey-server 1.11 , qui utilise la version 1.1 de jsr311 selon le pom du maillot.