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>
Это не сработало. Любая идея?
Ответы
Ответ 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>