2017-11-10 1 views
0

mail-1.4.jar 버전을 사용하여 Gmail받은 편지함을 읽었습니다. 리스너를 구성하기 위해 javax.mail-1.6.0.jar로 업그레이드했습니다. 이 업그레이드 후 이메일 리더 메소드가이 오류를 던지기 시작했습니다. 많은 구글과 maven 의존성 및 버전 변경과 관련된 여러 시도 후에도이 문제를 해결할 수 없습니다. 나는 스탠드에서 동일한 코드를 실행하면java.lang.NoSuchMethodError : javax.mail.internet.ParameterList.combineSegments() V

Properties props = new Properties(); 
props.put("mail.store.protocol", "imaps"); 
Session session = Session.getInstance(props, null); 
Store store = session.getStore(); 
try { 
store.connect("imap.gmail.com", userName, password); 
}catch(Exception e){ 
e.printStackTrace(); 
logger.debug("IMAP Email Listener connection fail"); 
} 

Folder folder = store.getFolder("INBOX"); 
folder.open(Folder.READ_WRITE); 

Message[] msgs = folder.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false)); 

for (int i = 0; i < msgs.length; i++) { 
    try { 
    String subject = msgs[i].getSubject(); 
    logger.debug("subject " + i + ":" + subject); 
    Object content = msgs[i].getContent(); // Here is the exception comes 
    logger.debug("content" + i + ":" + content.toString()); 
    } catch(Exception e) { 

    } 
} 

혼자 자바 클래스 모든 것이 잘 작동 : 아래

java.lang.NoSuchMethodError: javax.mail.internet.ParameterList.combineSegments()V

내 pom.xml 파일 자바 코드 아래

<dependency> 
     <groupId>com.sun.mail</groupId> 
     <artifactId>javax.mail</artifactId> 
     <version>1.6.0</version> 
</dependency> 

에서 받는다는 의존성이다 . 그러나 Tomcat에 war 파일을 배포 할 때 동일한 코드가 작동하지 않습니다.

스택 트레이스 :

java.lang.NoSuchMethodError: javax.mail.internet.ParameterList.combineSegments()V 
com.sun.mail.imap.protocol.BODYSTRUCTURE.parseParameters(BODYSTRUCTURE.java:420) 
com.sun.mail.imap.protocol.BODYSTRUCTURE.<init>(BODYSTRUCTURE.java:239) 
com.sun.mail.imap.protocol.BODYSTRUCTURE.<init>(BODYSTRUCTURE.java:110) 
com.sun.mail.imap.protocol.FetchResponse.parseItem(FetchResponse.java:256) 
com.sun.mail.imap.protocol.FetchResponse.parse(FetchResponse.java:212) 
com.sun.mail.imap.protocol.FetchResponse.<init>(FetchResponse.java:96) 
com.sun.mail.imap.protocol.IMAPProtocol.readResponse(IMAPProtocol.java:409) 
com.sun.mail.iap.Protocol.command(Protocol.java:355) 
com.sun.mail.imap.protocol.IMAPProtocol.fetch(IMAPProtocol.java:2151) 
com.sun.mail.imap.protocol.IMAPProtocol.fetch(IMAPProtocol.java:2143) 
com.sun.mail.imap.protocol.IMAPProtocol.fetchBodyStructure(IMAPProtocol.java:1717) 
com.sun.mail.imap.IMAPMessage.loadBODYSTRUCTURE(IMAPMessage.java:1552) 
com.sun.mail.imap.IMAPMessage.getDataHandler(IMAPMessage.java:808) 
javax.mail.internet.MimeMessage.getContent(MimeMessage.java:927) 
아마 다음 중 하나에 의해 발생
+0

전체 예외 스택 추적을 게시하십시오. JavaMail 1.5에'ParameterList.combineSegments()'가 추가되었고 이전에 JavaMail 1.4를 사용했기 때문에 모든 의존성을 업데이트했는지 확인하십시오. 이 오류는 종속성 트리의 항목이 JavaMail 1.4로 다운 그레이드되었음을 나타낼 수 있습니다. –

+0

stacktrace가 업데이트되었습니다. @MarkRotteveel. 예, pom.xml에서 이전 종속 항목을 제거했습니다. 또한 이전 버전이 war 파일의 lib 폴더에 포함되지 않았 음을 확인했습니다. – manurajhada

+0

[this] (https://stackoverflow.com/questions/31984127/javamail-nosuchmethoderror-javax-mail-internet-parameterlist-combinesegments)가 도움이됩니까? – pirho

답변

1

When I run the same code in stand alone java class everything works fine. But the same code doesn't work when I deploy war file in tomcat.

:

귀하의 Tomcat 서버가 javax.mail의 이전 또는 부적절한 버전을 사용
  • . javax.mail 항아리가 서버의 CLASSPATH 어딘가에 있는지 확인하십시오 (예 : CATALINA_HOME/lib 폴더)
  • 부적절한 버전의 javax.mail을 사용하여 패키지되었을 수 있습니다. 생성 된 패키지 (WAR 파일?)에서 javax.mail jar가 포함되어 있는지 확인하십시오.

EDIT : 클래스가로드 된 JAR 파일을 쉽게 찾으려면 시작시 또는 디버그 출력을 응용 프로그램에 추가하십시오. 클래스가 사용되기 전에 :

System.out.println(ParameterList.class.getResource("Paramete‌rList.class")); 

그리고 위젯 서버에 앱을 배포하십시오. 클래스가로드 된 JAR 파일이 표시됩니다.

+0

클래스 경로에 JavaMail 클래스 사본이 두 개 이상 있으며 동일한 버전이 아닙니다. –

+0

동의합니다. 가능한 유일한 이유는 jar의 이전 버전을 가지고 있기 때문입니다. 그러나 많이 검색했습니다. 다른 버전의 JavaMail이 내 Tomcat 라이브러리 폴더에 있지 않습니다. 내 war 파일의 lib 폴더에는 pom에 포함 된 유일한 버전이 포함되어 있습니다. java.mail이 포함 된 타사 라이브러리 jar 파일이 있습니까? package? – manurajhada

+0

더 나은 디버그 출력을 앱에 추가하십시오 (예 : 시작시). JAR이 클래스에로드 된 것을 보여줍니다 :'System.out.println (ParameterList.class.getResource ("ParameterList.class"));'.그런 다음 가짜 서버에 앱을 패키징하고 배포하여 클래스가로드 된 (잘못된) JAR을 확인하십시오.)'jar : file :/C : /Users/meself/.m2/repository/com/ sun/mail/javax.mail/1.6.0/javax.mail-1.6.0.jar!/javax/mail/internet/ParameterList.class' https://stackoverflow.com/questions/227486/find-where를 참조하십시오. 자세한 내용은 -java-class-is-loaded-from을 참조하십시오. –

관련 문제