2014-07-17 3 views
15

Java 메일을 사용하려고 할 때 다음 예외가 발생합니다.Session.getInstance로 Java 메일 발행

java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger 
    at javax.mail.Session.initLogger(Session.java:226) 
    at javax.mail.Session.<init>(Session.java:210) 
    at javax.mail.Session.getInstance(Session.java:247) 
    at com.secondstory.mailsender.MailSender.createSmtpSession(MailSender.java:67) 
    at com.secondstory.mailsender.MailSender.sendSimpleMessage(MailSender.java:38) 
    at com.secondstory.mailsender.MailSender.generateLostPasswordEmail(MailSender.java:79) 
    at com.secondstory.mailsender.MailSenderTest.shouldReturnTrueWithCredentialsSet(MailSenderTest.java:49) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: java.lang.ClassNotFoundException: com.sun.mail.util.MailLogger 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    ... 30 more 

광범위하게 스택 오버플로를 검색 한 후 (아마 광범위하게 충분 - 볼 수 있습니다!) 나는 우리가 너무 일이 우리 받는다는 치어 내부에 두 개의 항아리 필요하다는 것을 발견했다. 내가 가진 두 가지 의존성은 다음과 같습니다.

<dependency> 
    <groupId>javax.mail</groupId> 
    <artifactId>javax.mail-api</artifactId> 
    <version>1.5.2</version> 
    <scope>runtime</scope> 
</dependency> 
<dependency> 
    <groupId>javax.activation</groupId> 
    <artifactId>activation</artifactId> 
    <version>1.1.1</version> 
</dependency> 

뭔가가 변경되었지만 그게 무엇인지 완전히 확신 할 수 없습니다. 이 요소가 실패한 곳에서 작성한 코드는 다음과 같습니다.

private static Session createSmtpSession() { 
    final Properties props = new Properties(); 
    props.setProperty("mail.host", "host"); 
    props.setProperty("mail.smtp.auth", "true"); 
    props.setProperty("mail.smtp.starttls.enable", "true"); 
    props.setProperty("mail.transport.protocol", "smtp"); 
    //props.setProperty("mail.debug", "true"); 

    return Session.getInstance(props, new javax.mail.Authenticator() { 
       protected PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication(
          "username", "password"); 
       } 
      }); 
} 

일부 설정이 누락되었거나 현재 가지고있는 설정에서이 설정을 사용해야합니까?

감사 메이븐 POM으로이 추가

답변

30

시도 :

<dependency> 
    <groupId>com.sun.mail</groupId> 
    <artifactId>javax.mail</artifactId> 
    <version>1.5.2</version> 
</dependency> 
+0

그래 빙고 - 정말 감사합니다 :) – Biscuit128

+11

으로는 [JavaMail에 프로젝트 페이지 (https://java.net/projects에 설명/javamail/pages/Home), com.sun.mail : javax.mail은 전체 구현입니다. 응용 프로그램을 실행하는 경우 필요한 것입니다. 애플리케이션을 컴파일하기 만하면 (예 : 실행을 위해 다른 곳으로 배포하려는 경우), javax.mail : javax.mail-api 만 있으면됩니다. 이전 JDK를 사용하는 경우 javax.activation 만 필요합니다. 최신 JDK에 포함되어 있습니다. –