为什么Tomcat无法找到SMTPTransport(Session,URLName)?

我们有一个发送邮件的Web应用程序。 出于某种原因,它的安装已经决定它找不到使用(Session,URLName)参数的SMTPTransport的构造函数。

堆栈跟踪的相关位:

 javax.mail.NoSuchProviderException: Provider class does not have a constructor(Session, URLName): protocol=smtp; type=javax.mail.Provider$Type@1dedf78; class=com.sun.mail.smtp.SMTPTransport; vendor=Sun Microsystems, Inc
        at javax.mail.Session.getService(Session.java:499)
        at javax.mail.Session.getTransport(Session.java:387)
        at javax.mail.Session.getTransport(Session.java:347)
        at javax.mail.Session.getTransport(Session.java:376)
        at javax.mail.Transport.send(Transport.java:67)
        at javax.mail.Transport.send(Transport.java:48)
...
Caused by: java.lang.NoSuchMethodException: com.sun.mail.smtp.SMTPTransport.<init>(javax.mail.Session, javax.mail.URLName)
        at java.lang.Class.getConstructor0(Class.java:2706)
        at java.lang.Class.getConstructor(Class.java:1657)
        at javax.mail.Session.getService(Session.java:496)
        ... 8 more

我们已经检查过SMTPTransport确实存在于类路径中(这并不奇怪,因为我们没有得到ClassNotFoundException),并且它是类路径中该类的唯一副本。 它在tomcat / lib中。 我们的webapp不包括重复。 $ JAVA_HOME / jre / lib中没有重复。

我甚至已经去反编译这个类来验证它实际上是否有构造函数。

我做了一些Google搜索,发现其他人看到了相同的错误,但没有解决问题。


我的同事,我想出了为什么我们看到这一点。 我在这里发布了它:https://plus.google.com/105513684958738872125/posts/LBnjehZoss6

综上所述:

当我在寻找一个重复的SMTPTransport类时,没有发现任何东西。 真正的罪魁祸首是一个重复的javax.mail.Session类,它已经被添加到我的webapp中。 这导致了Tomcat分层类加载器的问题。

当in-webapp Session类尝试将自己传递给Tomcat级别的SMTPTransport时,该类不会识别该Session类型(已由不同的类加载器加载)与其构造函数所需的类型。

从webapp中删除重复的javax.mail类可以解决问题。

链接地址: http://www.djcxy.com/p/9351.html

上一篇: Why can't Tomcat find SMTPTransport(Session, URLName)?

下一篇: OpenID Architecture for Java