java.lang.NoClassDefFoundError: com / sun / mail / util / MailLogger untuk JUnit test case untuk Java mail


127

Saya menggunakan Java Mail API untuk membaca dan memilah email. Ini berfungsi baik dengan kode Servlet.

Sekarang saya mencoba untuk menulis test case JUnit untuk tujuan yang sama. Tetapi secara online Session session = Session.getDefaultInstance(properties);saya mendapatkan pengecualian berikut:

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

Adakah yang bisa memberitahu saya di mana saya salah.

Jawaban:


116

com.sun.mail.util.MailLoggeradalah bagian dari JavaMail API. Itu sudah termasuk dalam lingkungan EE (itu sebabnya Anda bisa menggunakannya di server langsung Anda), tetapi itu tidak termasuk dalam lingkungan SE.

Oracle docs :

JavaMail API tersedia sebagai paket opsional untuk digunakan dengan platform Java SE dan juga termasuk dalam platform Java EE.

99% Anda menjalankan tes di lingkungan SE yang berarti Anda harus repot menambahkannya secara manual ke jalur kelas saat menjalankan tes.

Jika Anda menggunakan maven, tambahkan ketergantungan berikut (Anda mungkin ingin mengubah versi):

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

63
Artefak javax.mail-api hanya baik untuk dikompilasi. Anda sebenarnya perlu menjalankan kode, sehingga Anda memerlukan implementasi JavaMail yang lengkap. Gunakan <groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId>.
Bill Shannon

150

The javax.mail-apiartefak hanya baik untuk kompilasi terhadap.

Anda sebenarnya perlu menjalankan kode, sehingga Anda membutuhkan implementasi JavaMail API yang lengkap. Gunakan ini:

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

CATATAN: Nomor versi mungkin akan berbeda. Periksa versi terbaru di sini .


3
Ini juga memperbaiki java.lang.NoClassDefFoundError: com/sun/mail/util/PropUtilserta Could not initialize class javax.mail.internet.InternetAddresskesalahan.
GlenPeterson


52

Saya menggunakan dependensi pakar berikut untuk membuat surat java berfungsi. Yang pertama termasuk API javax.mail (tanpa implementasi) dan yang kedua adalah implementasi SUN dari 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
Anda tidak perlu memasukkan api jika Anda memiliki implementasinya.
GlenPeterson

1
Good point @ GlenPeterson, saya tidak menyadari bahwa dari solusi di atas tetapi ketika saya melihat ke jar com.sun.mail, javax.mail api termasuk di dalamnya.
Peter




1

Ini terjadi juga jika kode Anda mengharapkan Java Mail 1.4 dan toples Anda adalah Java Mail 1.3. Terjadi pada saya ketika meningkatkan Ketel Pentaho

Salam

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.