Подтвердить что ты не робот

Java.lang.ClassFormatError: Отсутствует атрибут кода в методе, который не является родным или абстрактным в файле класса javax/mail/MessagingException

У меня есть зависимость от maven для javaee Bibliothek.

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

Я получаю ошибку в Eclipse в некоторых классах.

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

Я добавил javax.mail зависимость.

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

Это не сработало. Любая идея?

4b9b3361

Ответ 1

Это не работает, потому что специально сконструированы классы из javax/javaee-api/provided. Они не используются во время выполнения, поскольку отсутствует реализация методов.

Простое добавление классов из javax.mail/mail/1.4.5 зависимости от пути к классам не помогает, потому что классы из javax/javaee-api/provided уже существуют. Только javax.mail/mail/1.4.5 dependecy решает вашу проблему, но, скорее всего, вам также нужны другие классы из javax/javaee-api/provided.

Что вы можете сделать, так это избавиться от зависимости javax/javaee-api/provided и получить эти классы, например, из зависимостей, предоставляемых целевым сервером приложений. Вы можете использовать, например, следующее:

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

Поскольку предоставлена ​​возможность, она не влияет на создаваемый артефакт. Вот почему вы можете использовать его и с другими серверами приложений, чем с JBoss. Это тот же API, что и в вашей исходной зависимости, но он содержит обычные классы.

Ответ 2

в моем случае, используйте только библиотеку:

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

Запуск с JDK 6 и Tomcat без проблем

Ответ 3

Странно, но для меня работает следующий порядок,

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

Обратное не работает.

Ответ 4

Если вы добавите их к вашему пом в следующем порядке: javax.mail JavaEE-веб-апи вполне логично, что это будет работать, потому что среда выполнения сначала находит необходимый класс (с правильной реализацией) из javax.mail, игнорируя любой аналогичный класс (без реализации) из javaee-web-api.

Ответ 5

В моем случае я использую следующий порядок. Очень хорошо работает с JDK6.

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4</version>
    <scope>provided</scope>
    <exclusions>
        <exclusion>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
        </exclusion>
    </exclusions>
</dependency>

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