Java.lang.ClassFormatError: attribut de Code Absent dans la méthode qui n'est pas native ou abstraite dans le fichier de classe javax / mail/MessagingException

J'ai une dépendance maven pour javaee Bibliothek.

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

Je reçois L'erreur dans Eclipse dans certaines classes.

java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/mail/MessagingException

J'ai ajouté javax.dépendance au courrier.

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.5</version>
</dependency>

Cela n'a pas fonctionné. Une Idée??

23
demandé sur Kayser 2012-08-27 17:24:28

4 réponses

Cela ne fonctionne pas car les classes de la dépendance javax/javaee-api/provided sont spécialement construites. Ils ne sont pas utilisables car l'implémentation des méthodes est manquante.

Ajouter simplement des classes de javax.mail/mail/1.4.5 dépendance au classpath n'aide pas, car les classes de javax/javaee-api/provided sont déjà là. Avoir javax.mail/mail/1.4.5 dependecy seul résout votre problème, mais très probablement vous avez également besoin d'autres classes de javax/javaee-api/provided.

Ce que vous pouvez faire est de se débarrasser de javax/javaee-api/provided dépendance et d'obtenir ces classes par exemple à partir des dépendances fournies par le serveur d'applications cible. Vous pouvez utiliser par exemple:

   <dependency>
        <groupId>org.jboss.spec</groupId>
        <artifactId>jboss-javaee-6.0</artifactId>
        <version>1.0.0.Final</version>
        <type>pom</type>
        <scope>provided</scope>
     </dependency>

Parce que la portée est fournie, elle n'affecte pas l'artefact à construire. C'est pourquoi vous pouvez l'utiliser également avec d'autres serveurs d'applications que JBoss. C'est la même API que dans votre dépendance d'origine, mais elle contient des classes normales .

35
répondu Mikko Maunu 2014-09-02 17:07:34

Dans mon cas, utilisez uniquement la bibliothèque:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4</version>
</dependency>

Exécuter avec JDK 6 et Tomcat sans problèmes

4
répondu Manu Navarro 2012-08-27 13:39:28

Bizarre, mais l'ordre suivant fonctionne pour moi,

    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4</version>
    </dependency>

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

L'inverse ne fonctionnera pas.

4
répondu prayagupd 2016-11-30 06:55:39

Si vous les ajoutez à votre pom dans cet ordre: javax.courrier javaee-web-api il est assez logique que cela fonctionne, car le runtime trouve d'abord la classe nécessaire (avec l'implémentation appropriée) à partir de javax.mail, ignorant toute classe similaire (sans implémentation) de javaee-web-api.

0
répondu Sorin-Alexandru Cristescu 2018-02-22 09:49:15