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.

pengguna2215139
sumber

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>
Eugene Loy
sumber
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 .

Bill Shannon
sumber
3
Ini juga memperbaiki java.lang.NoClassDefFoundError: com/sun/mail/util/PropUtilserta Could not initialize class javax.mail.internet.InternetAddresskesalahan.
GlenPeterson
1
Itu dijelaskan di halaman web proyek JavaMail .
Bill Shannon
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>
Shane Rowatt
sumber
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
3

Silakan lihat http://mvnrepository.com/artifact/javax.mail/mail/ , Anda dapat mengunduh jar atau menggunakan ketergantungan maven, tergantung pada jenis proyek Anda. Itu seharusnya cukup banyak menutupinya dan Anda tidak akan mendapatkan pengecualian NoClassDefFoundError.

Gaurav B
sumber
2

Sangat menarik. Anda hanya perlu menggunakan javax-mail.jar dari "com.sun" bukan "javax.mail".
dwonload com.sun mail jar

Resul Rzaeeff
sumber
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

Carlos Rafael Ramirez
sumber