2013-08-12 7 views
9

다음 코드를 실행하여 tomcat 컨텍스트 파일을 사용하여 javax.mail.Session 객체를 얻으려고하면이 오류가 발생합니다. .java.lang.ClassCastException : javax.mail.Session을 javax.mail.Session으로 캐스팅 할 수 없음

 Context initCtx = new InitialContext(); 
     Context envCtx = (Context) initCtx.lookup("java:comp/env"); 
     Session session = (javax.mail.Session) envCtx.lookup("mail/session"); 

이것은 context.xml의 리소스 선언입니다.

<Resource name="mail/Session" auth="Container" 
     type="javax.mail.Session" 
     mail.smtp.host="host" 
     mail.smtp.user="user" 
     mail.smtp.password="password" 
     mail.smtp.auth="false"/> 

나는이 때문에 내 응용 프로그램 서버 라이브러리 (바람둥이) 폴더에 내 응용 프로그램 라이브러리 폴더에 javax.mail.Session에 대해 동일한 라이브러리를 필요로 할 수 있습니다 이해, 나는 많은 중복 된 라이브러리 파일을 제거했다 내 응용 프로그램 라이브러리 폴더 (예 : mail.jar)에서 볼 수있는 javax.mail.Session은 라이브러리의 일부로, 지금 나는 여전히이 오류가 발생하고 다른 라이브러리가 무엇인지 모르는 시점에 있습니다 이 문제의 원인인가, 아니면 내가 모르는 다른 문제인가?

이 문제의 근원을 찾기 위해 내가 제안하는 것은 무엇입니까?

감사합니다. 톰캣의 lib 디렉토리와 응용 프로그램 모두 (WEB-INF/lib에) mail.jar 자신의 복사본을 가지고, 그래서 클래스 로더는 당신이에서 mail.jar을 삭제 두 개의 서로 다른 Session.If를로드 할 수 있기 때문에

+0

tomcat을 다시 시작하십시오. 예외가 여전히 발생하면 javax.mail.Session이 아직 남아있는 장소를 놓친 것입니다. – Henry

+7

문제점에 대한 정확한 해결책을 모르지만 한 가지 더 많은 이유가 있습니다. javax.mail.Session은 2 개의 다른 클래스 로더에 의해로드됩니다 – serejja

+0

Maven을 사용하고 있습니까? –

답변

16

이 문제는 서버에서 발생하여 이 문제는 해결 될 것입니다. 받는다는 javax.mail 이미 서버의 lib에서 mail.jar가, 응용 프로그램/POM 파일에서 삭제하는 경우 1.4 이

+0

다른 상황 : Maven을 사용할 때, 충돌하는 mail.jar은 pom의 직접적인 의존성 중 하나에 대한 간접적 인 의존성을 사용하여 가져올 수 있습니다. 이 경우 간접적 종속성을 찾아 내야하며 간접 종속성이 포함되지 않도록 '제외/제외'를 사용해야합니다. –

1

사용 제공 범위, 이 문제는 해결 될 것이다.

1

을 제공 메일

+0

이 의견은 내 문제를 해결하는 데 도움이되었습니다 – Scott

4

당신은 아마 더 이상이 문제가 발생하지 않지만, 다음 사람이 여기에 오기를하고 있습니다 :

당신이 받는다는을 사용하는 경우의 pom.xml에 javax.mail 의존성에 <scope>provided</scope>를 추가합니다. 내 경우에는 예를 들어

:

<dependency> 
    <groupId>javax.mail</groupId> 
    <artifactId>mail</artifactId> 
    <version>YOUR_VERSION</version> 
    <scope>provided</scope> <!-- This line is new --> 
</dependency> 

이 나를 위해 문제를 해결했다.

+0

Tomcat을 재시작하고 적용하려면 응용 프로그램을 다시 배포해야했습니다. – svarog

관련 문제