ClassFormatError:类文件javax/mail/MessaginException中非本机或抽象的方法中缺少代码属性
在spring mvc web应用程序上使用javaMail api发送电子邮件时,我遇到了一个奇怪的ClassFormatError:类文件javax/mail/MessaginException中非本机或抽象的方法中缺少代码属性,java,spring,jakarta-mail,javabeans,classformaterror,Java,Spring,Jakarta Mail,Javabeans,Classformaterror,在spring mvc web应用程序上使用javaMail api发送电子邮件时,我遇到了一个奇怪的ClassFormatError 下面是我的mail-cfg.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc"
ClassFormatError
下面是我的mail-cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<bean id="mailSource" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="${mail.host}" />
<property name="port" value="${mail.port}" />
<property name="username" value="${mail.username}" />
<property name="password" value="${mail.password}" />
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
</props>
</property>
</bean>
<bean id="mailHelper" class="com.jr.freedom.util.MailHelper">
<property name="mailSender" ref="mailSource"></property>
<property name="messageText"
value="Thank you for reigistering to the Freedom Application. Please copy and paste your activation code below \n\n"></property>
</bean>
</beans>
当类路径中有多个冲突的JAR时,通常会出现此错误。一个更常见的原因是,如果您在类路径中包含一个工件,该工件应该由应用程序容器提供。查看POM,您有几个冗余和重叠的依赖项。删除这些:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.3</version>
</dependency>
<dependency>
<groupId>javaee</groupId>
<artifactId>javaee-api</artifactId>
<version>5</version>
</dependency>
javax.servlet
servlet api
2.5
假如
javax.validation
验证api
1.0.0.GA
javax.servlet
jstl
1.2
javax.mail
邮件
1.4.3
java企业版
JavaEEAPI
5.
并将Java EE依赖项的范围更改为“提供”:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
爪哇
JavaEEAPI
6
假如
最后,确保您正在部署一个支持JavaEE6的web服务器,错误应该会消失
---编辑---
刚刚注意到您正在编译到Java5遵从性级别。更改此项:
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
1.5
1.5
并将源代码和目标值设为1.6。javax:javaeeapi用于编译,而不是运行,包括单元测试。如果您需要适合运行的类,请运行JavaEE应用程序服务器
另外,正确的名字是,不是JEE,我有一个类似的问题,。。。因此,当我运行JUnit时发生了一个错误:
Absent Code attribute in method that is not native or abstract in class file javax/servlet/http/HttpServlet
我通过添加以下依赖项(第一个)来解决它:
org.glassfish.main.extras
玻璃鱼嵌入所有
3.1.2.2
测试
在使用jmock和maven运行junits时,我也遇到了同样的异常:
构造函数中出现异常:testDoExecute(java.lang.ClassFormatError:在java.lang.ClassLoader.defineClass1(本机方法)的类文件javax/servlet/http/Cookie中,方法中缺少非本机或抽象的代码属性
这是由于您的代码尝试访问的类在项目中使用的javaee api jar中不可用,因为您的代码针对不完整的类进行编译,如JavaEE6 api,而您的单元测试尝试访问不存在的代码。JUnit只会失败,并将测试标记为错误,打印类似上述异常的内容
可以通过添加javax.servlet jar/依赖项或更改如下所示的javaee jar版本来解决此问题:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
**OR**
<dependency>
<groupId>javax.j2ee</groupId>
<artifactId>j2ee</artifactId>
<version>1.4</version>
<scope>provided</scope>
</dependency>
javax.servlet
servlet api
2.5
**或**
javax.j2ee
j2ee
1.4
假如
PS:请添加与项目中其他现有jar兼容的jar版本。我遇到了一个非常类似的问题,因为我在Spring引导模块所依赖的模块中添加了带有
javax的类。validation
validation。我的Spring引导模块没有javaee依赖项,而是显式地添加了excluding这没有帮助
解决方案包括spring boot starter验证
对我的spring boot模块的依赖性:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
org.springframework.boot
.我只是好奇你是否有理由认为两者都需要。POM还有其他问题,请参见下文。嗨,我刚刚在tom cat中部署了我的web应用程序,出现了类似的异常java.lang.ClassNotFoundException:javax.mail.internet.MimeMessageTomcat不是完整的java应用程序服务器(它只支持servlet和JSP)。和TomEE+是您应该使用的。或Glassfish。或JBoss。另一方面,如果您觉得有帮助,请接受我的回答。这是我需要删除的非常多的内容?例如删除java邮件?我将更新我的帖子,向您展示我的新pom。在进行更改后,它仍然不起作用javaee api包括您正在使用的所有EE库注意,我已经从nuke的依赖项列表中删除了commons lang。是的,我删除了commons langlang@jonney-添加回commons lang依赖项,并更改您的源/目标遵从性级别,如我编辑的答案所示。我在提供的范围内使用了javax:javaee api:6.0依赖项,添加此依赖项解决了我的所有问题谢谢!对我也有帮助。唯一的一点是,如果您对JavaEEAPI有依赖关系,并且提供了作用域,请记住放置这个新的依赖关系(glassfish embedded all)在pom else junit中,添加的依赖项必须是依赖项列表中的第一个,如中所示solution@Lorenzo你是对的,依赖必须是第一位的。这对我来说很有效!你能解释一下为什么会这样吗?
<dependency>
<groupId>org.glassfish.main.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.1.2.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
**OR**
<dependency>
<groupId>javax.j2ee</groupId>
<artifactId>j2ee</artifactId>
<version>1.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>