2011-09-28 3 views
7

메일을 보내는 웹 응용 프로그램이 있습니다. 어떤 이유로 세션을 설치하면 (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가 점점하지 않을 때문에, 놀라운 일이 아니다있는) 클래스 패스에 존재하고 있음을 않는 것을 확인했습니다 classpath에있는 해당 클래스의 유일한 사본. 그것은 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의 계층 적 클래스 로더에 문제가 발생했습니다.

in-webapp 세션 클래스가 Tomcat 수준의 SMTPTransport에 자신을 전달하려고 시도했을 때 해당 세션 유형 (다른 클래스 로더에 의해로드 된)을 해당 세션 유형에 해당 유형으로 인식하지 못했습니다. 건설자.

webapp에서 중복 된 javax.mail 클래스를 제거하면 문제가 해결됩니다.

관련 문제