java.lang.NoClassDefFoundError: com / sun / mail / produc / MailLogger cho trường hợp thử nghiệm JUnit cho thư Java


127

Tôi đang sử dụng API Java Mail để đọc và phân tích email. Nó hoạt động tốt với mã Servlet.

Bây giờ tôi đang cố gắng viết một trường hợp thử nghiệm JUnit cho cùng một mục đích. Nhưng trên đường Session session = Session.getDefaultInstance(properties);tôi đang nhận được ngoại lệ sau:

java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger
    at javax.mail.Session.initLogger(Session.java:227)
    at javax.mail.Session.<init>(Session.java:212)
    at javax.mail.Session.getDefaultInstance(Session.java:315)
    at javax.mail.Session.getDefaultInstance(Session.java:355)
    at com.vxl.appanalytix.dataload.fromEmail.EmailParser.parseEmailSubject(EmailParser.java:44)
    at com.vxl.appanalytix.controllers.controllerClasses.GenericEmailServiceClass.readEmailAttachments(GenericEmailServiceClass.java:33)
    at com.vxl.appanalytix.dataload.GenericEmailTestCase.test(GenericEmailTestCase.java:42)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
    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:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.ClassNotFoundException: com.sun.mail.util.MailLogger
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    ... 35 more

Bất cứ ai có thể cho tôi biết tôi đang đi sai ở đâu

Câu trả lời:


115

com.sun.mail.util.MailLoggerlà một phần của API JavaMail . Nó đã được bao gồm trong môi trường EE (đó là lý do tại sao bạn có thể sử dụng nó trên máy chủ trực tiếp của mình), nhưng nó không được bao gồm trong môi trường SE.

Tài liệu của Oracle :

API JavaMail có sẵn dưới dạng gói tùy chọn để sử dụng với nền tảng Java SE và cũng được bao gồm trong nền tảng Java EE.

99% rằng bạn chạy thử nghiệm trong môi trường SE, điều đó có nghĩa là điều bạn phải bận tâm về việc thêm thủ công vào đường dẫn lớp khi chạy thử nghiệm.

Nếu bạn đang sử dụng maven, hãy thêm phần phụ thuộc sau (bạn có thể muốn thay đổi phiên bản):

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

63
Tạo tác javax.mail-api chỉ tốt cho việc biên dịch. Bạn thực sự cần chạy mã, vì vậy bạn cần triển khai JavaMail hoàn chỉnh. Sử dụng <groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId>.
Bill Shannon

149

Các javax.mail-apitạo phẩm chỉ tốt cho việc biên dịch chống lại.

Bạn thực sự cần chạy mã, vì vậy bạn cần triển khai đầy đủ API JavaMail. Dùng cái này:

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

LƯU Ý: Số phiên bản có thể sẽ khác nhau. Kiểm tra phiên bản mới nhất tại đây .


3
Điều này cũng sửa lỗi java.lang.NoClassDefFoundError: com/sun/mail/util/PropUtilcũng như Could not initialize class javax.mail.internet.InternetAddresslỗi.
GlenPeterson

1
Nó được giải thích trên trang web của dự án JavaMail .
Bill Shannon

52

Tôi sử dụng các phụ thuộc maven sau để làm cho thư java hoạt động. Cái đầu tiên bao gồm API javax.mail (không có triển khai) và cái thứ hai là triển khai SUN của API javax.mail.

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.5.5</version>
</dependency>
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.5.5</version>
</dependency>

9
Bạn không cần bao gồm api nếu bạn đã thực hiện.
GlenPeterson

1
Điểm hay @GlenPeterson, tôi đã không nhận ra rằng từ giải pháp trên nhưng khi tôi nhìn vào bình com.sun.mail, api javax.mail được bao gồm trong đó.
Peter




1

Điều này cũng xảy ra nếu mã của bạn đang mong đợi Java Mail 1.4 và các tệp của bạn là Java Mail 1.3. Đã xảy ra với tôi khi nâng cấp Ấm siêu tốc Pentaho

Trân trọng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.