java.lang.LinkageError:加载程序约束冲突:以前为名为“0”的其他类型启动加载;javax/mail/Session“;

java.lang.LinkageError:加载程序约束冲突:以前为名为“0”的其他类型启动加载;javax/mail/Session“;,java,maven,email,jakarta-mail,Java,Maven,Email,Jakarta Mail,当我尝试使用javax.mail api发送电子邮件时,出现以下错误: Caused by: java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/felix/framework/BundleWiringImpl$BundleClassLoaderJava5) previously initiated loading for a different type with name "j

当我尝试使用
javax.mail api
发送电子邮件时,出现以下错误:

Caused by: java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/felix/framework/BundleWiringImpl$BundleClassLoaderJava5) previously initiated loading for a different type with name "javax/mail/Session"
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2279)
        at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1501)
        at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at com.sun.mail.util.PropUtil.getBooleanSessionProperty(PropUtil.java:86)
        at javax.mail.internet.MimeMessage.initStrict(MimeMessage.java:320)
        at javax.mail.internet.MimeMessage.<init>(MimeMessage.java:195)
        at sendEmail(manage.java:216)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:408)
        at org.apache.camel.component.bean.MethodInfo$1.doProceed(MethodInfo.java:279)
        at org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:252)
我的maven依赖性:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.5.5</version>
</dependency>
<dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
        <version>1.5.1</version>
        <scope>provided</scope>
</dependency>

javax.mail
javax.mail-api
1.5.5

请提供帮助。

按照注释中的建议,将您的依赖项添加到javamail,作为提供的依赖项:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.5.5</version>
</dependency>
<dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
        <version>1.5.1</version>
        <scope>provided</scope>
</dependency>

com.sun.mail
javax.mail
1.5.1
假如
这将跳过添加重复的jar,这些jar随后将由不同的类加载器加载

如果不是被迫使用旧版本的javamail,您应该更新到当前最新版本

<dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
        <version>1.5.5</version>
        <scope>provided</scope>
</dependency>

com.sun.mail
javax.mail
1.5.5
假如

我遇到了一个非常类似的问题(关于
org.keydove.keydove saml适配器api public
),通过编辑我的
standalone.xml
,并删除这一行,解决了这个问题:

<profile>
    <subsystem xmlns="urn:jboss:domain:ee:4.0">
        <global-modules>
            <module name="name.of.offending.package"/><!--REMOVE THIS LINE-->
        </global-modules>
    ...

...

更改后,您必须重新启动服务器。祝你好运。

检查所有的罐子。您可能还有另一个mail.jar(而不是-api)。如果是这种情况,请标记mail api jar“提供”以跳过打包,您是否使用普通的Felix作为运行时?还是像卡拉夫这样的容器?您的代码在Karaf4中为我工作,使用
javax.mail
而不是
javax.mail api
作为捆绑依赖项。正如Jan已经提到的,您的bundle类路径最终会出现两个版本。@Jan:我尝试添加“提供”,但得到了相同的错误。请检查您的类路径-所有邮件-*并确保它们都在服务器libs或应用程序libs中,但不是mixed@Ralf:我也在使用karaf(3.0.4版)。你能分享你的依赖代码吗。我尝试过,但我的项目在没有javax.mail-api的情况下无法生成。您可能想使用当前版本-1.5.5。@BillShannon:我尝试过使用版本1.5.5,但得到了相同的错误。我不明白。我想,当你说“我使用了不同的Maven依赖项,它工作了”,这意味着你已经解决了这个问题。如果没有,请准确描述您现在正在做什么,以及您遇到的错误。如果您的解决方案适用于1.5.1版,但不适用于1.5.5版,请告诉我更多信息。@BillShannon根据我对该问题的理解,运行时环境中的某个地方存在冲突的javamail版本。添加1.5.5可能仍然会导致重复版本(运行时为1.5.1,依赖项为1.5.5)。好吧,在“提供”范围内,您将获得所使用的运行时附带的版本。如果您的运行时附带1.5.1,那么您应该在依赖项中使用1.5.1。使用“提供的”范围,您不会得到两个版本,您只会得到运行时中的版本,而不是依赖项中提到的版本。理想情况下,依赖项应该提及运行时提供的相同版本。