web-dev-qa-db-fra.com

Test avec Java EE 6 API

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

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.

29
Pascal Thivent

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.

1
Snekse