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.

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>

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 .


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>

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




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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.