Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ClassFormatError:类文件javax/mail/MessaginException中非本机或抽象的方法中缺少代码属性_Java_Spring_Jakarta Mail_Javabeans_Classformaterror - Fatal编程技术网

ClassFormatError:类文件javax/mail/MessaginException中非本机或抽象的方法中缺少代码属性

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"

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