java.lang.NoClassDefFoundError: com / sun / mail / util / MailLogger für JUnit-Testfall für Java-Mail

127

Ich verwende die Java Mail-API, um E-Mails zu lesen und zu analysieren. Es funktioniert gut mit Servlet-Code.

Jetzt versuche ich, einen JUnit-Testfall für denselben Zweck zu schreiben. Aber online Session session = Session.getDefaultInstance(properties);bekomme ich folgende Ausnahme:

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

Kann mir jemand sagen, wo ich falsch liege.

user2215139
quelle

Antworten:

115

com.sun.mail.util.MailLoggerist Teil von JavaMail API. Es ist bereits in der EE-Umgebung enthalten (daher können Sie es auf Ihrem Live-Server verwenden), ist jedoch nicht in der SE-Umgebung enthalten.

Oracle-Dokumente :

Die JavaMail-API ist als optionales Paket zur Verwendung mit der Java SE-Plattform verfügbar und auch in der Java EE-Plattform enthalten.

99%, dass Sie Ihre Tests in einer SE-Umgebung ausführen, was bedeutet, dass Sie sich die Mühe machen müssen, sie manuell zu Ihrem Klassenpfad hinzuzufügen, wenn Sie Tests ausführen.

Wenn Sie maven verwenden, fügen Sie die folgende Abhängigkeit hinzu (möglicherweise möchten Sie die Version ändern):

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.0</version>
</dependency>
Eugene Loy
quelle
63
Das Artefakt javax.mail-api eignet sich nur zum Kompilieren. Sie müssen tatsächlich Code ausführen, sodass Sie eine vollständige Implementierung von JavaMail benötigen. Verwenden Sie <groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId>.
Bill Shannon
149

Das javax.mail-apiArtefakt eignet sich nur zum Kompilieren .

Sie müssen tatsächlich laufen Code, so dass Sie eine vollständige benötigen Implementierung von Java Mail API. Benutze das:

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

HINWEIS: Die Versionsnummer wird wahrscheinlich abweichen. Schauen Sie sich die neueste Version hier .

Bill Shannon
quelle
3
Dies behebt java.lang.NoClassDefFoundError: com/sun/mail/util/PropUtilauch Could not initialize class javax.mail.internet.InternetAddressFehler.
GlenPeterson
1
Es wird auf der JavaMail-Projektwebseite erklärt .
Bill Shannon
52

Ich verwende die folgenden Maven-Abhängigkeiten, um Java Mail zum Laufen zu bringen. Die erste enthält die javax.mail-API (ohne Implementierung) und die zweite ist die SUN-Implementierung der javax.mail-API.

<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
quelle
9
Sie müssen die API nicht einschließen, wenn Sie die Implementierung haben.
GlenPeterson
1
Guter Punkt @GlenPeterson, das habe ich aus der obigen Lösung nicht erkannt, aber als ich mir das com.sun.mail-Glas angesehen habe, ist die javax.mail-API darin enthalten.
Peter
3

Weitere Informationen finden Sie unter http://mvnrepository.com/artifact/javax.mail/mail/. Je nach Projekttyp können Sie jar herunterladen oder die Maven-Abhängigkeit verwenden. Das sollte es ziemlich genau abdecken und Sie werden keine NoClassDefFoundError-Ausnahme erhalten.

Gaurav B.
quelle
2

Wirklich interessant. Sie müssen nur javax-mail.jar von "com.sun" und nicht "javax.mail" verwenden.
dwonload com.sun mail jar

Resul Rzaeeff
quelle
1

Dies passiert auch, wenn Ihr Code Java Mail 1.4 erwartet und Ihre Jars Java Mail 1.3 sind. Ist mir beim Upgrade von Pentaho Kettle passiert

Grüße

Carlos Rafael Ramirez
quelle