2011-09-28 5 views
7

メールを送信するWebアプリケーションがあります。なんらかの理由で、(Session、URLName)引数を取るSMTPTransportのコンストラクタが見つからないと判断しました。スタックトレースのTomcatがSMTPTransport(Session、URLName)を見つけることができないのはなぜですか?

関連ビットは:

javax.mail.NoSuchProviderException: Provider class does not have a constructor(Session, URLName): protocol=smtp; [email protected]; 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には重複はありません。私もそれが実際でないことを確認するために、これまでデコンパイルクラスとして行ってきた

は、問題のコンストラクタを持っています。

私はちょっとしたことをして、seen the same errorを持っている他の人たちを見つけましたが、問題の修正はありませんでした。

答えて

3

私の同僚と私はなぜこれを見ているのか分かりました。私はここでそれについて投稿:要するに https://plus.google.com/105513684958738872125/posts/LBnjehZoss6

を:

私は重複SMTPTransportクラスを探していましたが、発見される何もありませんでした。真の犯人は、私のwebappに追加された重複したjavax.mail.Sessionクラスでした。これは、Tomcatの階層クラスローダーで問題を引き起こしました。

web-sessionセッションクラスがTomcatレベルのSMTPTransportに自分自身を渡そうとしたとき、そのセッションタイプ(別のクラスローダーによってロードされていた)をそのセッションタイプコンストラクタ。

webappから重複するjavax.mailクラスを削除すると、問題が修正されます。