我们有一个发送邮件的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中。我们的网络应用程序不包含重复项。 $ JAVA_HOME/jre/lib中没有重复项。

我什至可以对类进行反编译以验证其是否确实存在构造函数。

我做了一些谷歌搜索,发现其他人有seen the same error,但是没有解决此问题的方法。

最佳答案

我和我的同事弄清楚了为什么我们会看到这种情况。我在这里发布了有关它的信息:
https://plus.google.com/105513684958738872125/posts/LBnjehZoss6

总之:

当我在寻找重复的SMTPTransport类时,没有找到。真正的罪魁祸首是重复的javax.mail.Session类,该类已添加到我的webapp中。这导致了Tomcat的分层类加载器的问题。

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

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

10-04 10:10