如何解决与Classloader相关的java.lang.LinkageError'从Tomee发送电子邮件时?

时间:2014-05-10 13:50:49

标签: email java-ee tomee

我正在尝试从我在Tomee 1.6上运行的代码发送电子邮件

我在tomee.xml文件中有以下条目。

    <Resource
    id="abc_mail"
    type="javax.mail.Session"
    >
        mail.transport.protocol=smtp
        mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
        mail.smtp.socketFactory.fallback=false
        mail.smtp.host=smtp.gmail.com
        mail.smtp.port=465
        mail.smtp.auth=true
        mail.smtp.user=xyz@gmail.com
        password=xyzpass
    </Resource>

我有一个带有以下声明的ejb。

@Resource(name = "abc_mail")//, type = javax.mail.Session.class)
Session abcMailSession;

发送电子邮件的代码如下:

public void sendMessage(String addressTo, String subject, String messageText) {
        try {
            Message message = new MimeMessage(abcMailSession);
            message.setFrom(new InternetAddress("abc@xyz.com"));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(addressTo));
            message.setSubject(subject);
            message.setText(messageText);

            Transport.send(message);

            logger.info("Message sent successfully.");

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }

调用此方法时,我收到以下错误。

Caused by: java.lang.LinkageError: loader constraint violation: when resolving method "org.apache.geronimo.mail.util.SessionUtil.getBooleanProperty(Ljavax/mail/Session;Ljava/lang/String;Z)Z" the class loader (instance of org/apache/openejb/util/classloader/URLClassLoaderFirst) of the current class, javax/mail/internet/MimeMessage, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, org/apache/geronimo/mail/util/SessionUtil, have different Class objects for the type vax/mail/Session;Ljava/lang/String;Z)Z used in the signature
at javax.mail.internet.MimeMessage.isStrictAddressing(MimeMessage.java:1460)
at javax.mail.internet.MimeMessage.addRecipientsToList(MimeMessage.java:428)
at javax.mail.internet.MimeMessage.getAllRecipients(MimeMessage.java:400)
at javax.mail.Transport.send(Transport.java:48)
at co.uk.dakia.core.interfaces.impl.NotificationManagerImpl.sendMessage(NotificationManagerImpl.java:88)
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.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:182)
at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:164)
at org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:180)
at org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:99)
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.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:182)
at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:164)
at org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:80)
at org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:212)
at org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:181)
at org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:268)
at org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:263)
at org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:86)
at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:303)
... 47 more

为什么我会收到此错误?我无法弄清堆栈跟踪中的第一行。

1 个答案:

答案 0 :(得分:0)

我现在已经解决了这个问题。发生错误是因为同一个类由两个不同的类加载器(tomcat和openejb)加载,所讨论的类是javax.mail.Session 我将以下属性添加到tomee的system.properties文件

openejb.classloader.forced-skip=javax.mail

这样做可以防止openejb类加载器加载javax.mail类,因此只有tomcat类加载器加载发送电子邮件所需的所有相关类。