it-swarm.com.de

java.lang.ClassFormatError: Absent Code-Attribut in einer Methode, das nicht systemeigen oder abstrakt in der Klassendatei javax/mail/MessagingException ist

Ich habe eine große Abhängigkeit von Javaee Bibliothek. 

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

Ich bekomme den Fehler in Eclipse in einigen Klassen.

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

Ich habe die Abhängigkeit von javax.mail hinzugefügt. 

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

Es hat nicht funktioniert. Irgendeine Idee??

24
Kayser

Es funktioniert nicht, da Klassen aus javax/javaee-api/provided-Abhängigkeit speziell konstruiert sind. Sie sind keine nutzbare Laufzeit, da die Implementierung von Methoden fehlt. 

Das Hinzufügen von Klassen aus javax.mail/mail/1.4.5-Abhängigkeit zum Klassenpfad hilft nicht, da Klassen aus javax/javaee-api/provided bereits vorhanden sind. Mit javax.mail/mail/1.4.5 dependecy alleine lösen Sie Ihr Problem, wahrscheinlich benötigen Sie aber auch andere Klassen von javax/javaee-api/provided.

Sie können die javax/javaee-api/provided-Abhängigkeit beseitigen und diese Klassen beispielsweise aus den vom Zielanwendungsserver bereitgestellten Abhängigkeiten abrufen. Sie können zum Beispiel folgendes verwenden:

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

Da ein Bereich bereitgestellt wird, hat er keinen Einfluss auf das zu erstellende Artefakt. Deshalb können Sie diesen auch mit anderen Anwendungsservern als JBoss verwenden. Es ist dieselbe API wie in Ihrer ursprünglichen Abhängigkeit, enthält aber normal classes.

36
Mikko Maunu

in meinem Fall benutzen Sie nur die Bibliothek:

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

Laufen Sie mit JDK 6 und Tomcat ohne Probleme

4
Manu Navarro

Seltsam, aber die folgende Reihenfolge funktioniert für mich, 

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

Das Gegenteil funktioniert nicht.

4
prayagupd

Wenn Sie sie Ihrem Pom in dieser Reihenfolge hinzufügen, gilt Folgendes: Javax.mailjavaee-web-apiit ist ziemlich logisch, dass es funktionieren wird, da die Laufzeitumgebung zuerst die erforderliche Klasse findet (mit der richtigen Implementierung) ) aus javax.mail, wobei ähnliche Klassen (ohne Implementierung) von javaee-web-api ignoriert werden.