Почему Tomcat не может найти SMTPTransport (Session, URLName)? - PullRequest
7 голосов
/ 28 сентября 2011

У нас есть веб-приложение, которое отправляет почту.По какой-то причине его установка решила, что не может найти конструктор для SMTPTransport, который принимает (Session, URLName) аргументы.

Соответствующие биты трассировки стека:

 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 нет дубликата.

Я даже зашел так далеко, что декомпилировал класс, чтобы убедиться, что он действительно имеет рассматриваемый Конструктор.

IЯ немного погуглил и нашел других людей, которые видели ту же ошибку , но не исправили проблему.

1 Ответ

3 голосов
/ 04 октября 2011

Мы с коллегой выяснили, почему мы это видим. Я написал об этом здесь: https://plus.google.com/105513684958738872125/posts/LBnjehZoss6

В итоге:

Пока я искал дубликат класса SMTPTransport, найти его не удалось. Настоящим виновником был дубликат класса javax.mail.Session, который был добавлен в мое веб-приложение. Это вызвало проблемы с иерархическими загрузчиками классов Tomcat.

Когда класс Session в веб-приложении пытался выдать себя SMTPTransport уровня Tomcat, тот не распознал этот тип Session (который был загружен другим загрузчиком классов) как тип, необходимый для его конструктора. .

Удаление повторяющихся классов javax.mail из веб-приложения решает проблему.

...