2011-09-28 30 views
7

Chúng tôi có một ứng dụng web gửi thư. Đối với một số lý do, một cài đặt của nó đã quyết định rằng nó không thể tìm thấy các nhà xây dựng cho SMTPTransport mà mất (Session, URLName) đối số.Tại sao Tomcat không thể tìm SMTPTransport (Phiên, URLName)?

bit có liên quan của stack trace:

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 

Chúng tôi đã kiểm tra thấy SMTPTransport không tồn tại trong classpath (mà không phải là đáng ngạc nhiên, bởi vì chúng tôi không nhận được một ClassNotFoundException), và đó là bản sao duy nhất của lớp đó trong classpath. Đó là trong tomcat/lib. Webapp của chúng tôi không bao gồm một bản sao. Không có bản sao trong $ JAVA_HOME/jre/lib.

Tôi thậm chí đã đi xa đến mức dịch ngược lớp học để xác minh rằng nó thực tế là có Trình xây dựng được đề cập.

Tôi đã thực hiện một chút googling và đã tìm thấy những người khác có seen the same error, nhưng không khắc phục được sự cố.

Trả lời

3

Đồng nghiệp của tôi và tôi đã tìm ra lý do tại sao chúng tôi thấy điều này. Tôi gửi về nó ở đây: https://plus.google.com/105513684958738872125/posts/LBnjehZoss6

Nói tóm lại:

Trong khi tôi đang tìm kiếm một lớp SMTPTransport trùng lặp, chẳng có ai được tìm thấy. Thủ phạm thực sự là một lớp javax.mail.Session trùng lặp đã được thêm vào webapp của tôi. Điều này gây ra vấn đề với các trình nạp lớp phân cấp của Tomcat.

Khi lớp trong ứng dụng Phiên làm việc cố gắng tự chuyển sang SMTPTransport cấp Tomcat, người đó không nhận ra loại phiên (đã được nạp bởi trình nạp lớp khác) làm loại cần thiết cho nó constructor.

Xóa lớp javax.mail trùng lặp khỏi webapp khắc phục sự cố.

Các vấn đề liên quan