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

Cod*_*ine 7 java email tomcat jakarta-mail

我们有一个发送邮件的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
Run Code Online (Sandbox Code Playgroud)

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

我甚至已经反过来反编译该类以验证它实际上确实有问题的构造函数.

我已经做了一些谷歌搜索,并找到了其他人看到相同的错误,但没有解决问题.

Cod*_*ine 4

我和我的同事明白了为什么我们会看到这个。我在这里发布了它: https://plus.google.com/105513684958738872125/posts/LBnjehZoss6

总之:

当我寻找重复的 SMTPTransport 类时,却没有找到。真正的罪魁祸首是一个重复的 javax.mail.Session 类,它已添加到我的 web 应用程序中。这导致 Tomcat 的分层类加载器出现问题。

当 web 应用程序内的 Session 类尝试将自身传递给 Tomcat 级 SMTPTransport 时,该类无法将该 Session 类型(已由不同的类加载器加载)识别为其构造函数所需的类型。

从 web 应用程序中删除重复的 javax.mail 类可以解决该问题。