2014-07-17 39 views
15

Tôi nhận được ngoại lệ sau khi cố gắng sử dụng thư java;Vấn đề về Thư Java với Session.getInstance

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 

Sau khi tìm kiếm tràn ngăn xếp (có thể không đủ rộng - hãy xem!) Tôi thấy rằng chúng tôi cần hai lọ bên trong maven của chúng tôi cho công việc này quá. Hai phụ thuộc tôi có được như sau;

<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> 

Điều gì đó đã thay đổi nhưng tôi không hoàn toàn chắc chắn nó là gì - như trước đây. Mã tôi đã viết nơi yếu tố này không thành công như sau;

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"); 
       } 
      }); 
} 

Am tôi thiếu một số cấu hình hoặc nên làm việc này với các thiết lập hiện tại mà tôi có?

Cảm ơn

Trả lời

30

Hãy thử thêm này vào Maven POM:

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

Yup bingo - cảm ơn rất nhiều :) – Biscuit128

+11

Như đã giải thích trên [Trang dự án JavaMail] (https://java.net/projects/javamail/pages/Home), com.sun.mail: javax.mail là toàn bộ việc triển khai; đó là những gì bạn cần nếu bạn đang chạy một ứng dụng. Nếu bạn chỉ cần biên dịch ứng dụng của mình (ví dụ: nếu bạn định triển khai nó ở nơi khác để chạy), tất cả những gì bạn cần là javax.mail: javax.mail-api. Bạn chỉ cần javax.activation nếu bạn đang sử dụng JDK cũ hơn; nó được bao gồm trong các JDK mới hơn. –

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