2013-05-29 1 views
80

Hallo Ich benutze Java-Mail-API zum Lesen und Parsen von E-Mails. Es funktioniert gut mit Servlet-Code. Jetzt versuche ich einen J Unit Testfall für den gleichen Zweck zu schreiben. Aber auf der Leitung "Session session = Session.getDefaultInstance (Eigenschaften):" Ich bin immer Ausnahme wie java.lang.NoClassDefFoundError: com/sun/mail/util/MailLoggerjava.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger für JUnit Testfall für Java-Mail

und der volle Stack-Trace ist als

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 

Darf ich wissen, wo ich falsch liege?

Antwort

55

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

Oracle docs:

The JavaMail API is available as an optional package for use with Java SE platform and is also included in the Java EE platform.

99%, dass Sie Ihre Tests in SE-Umgebung ausgeführt werden, was bedeutet, was Sie über das Hinzufügen es manuell zu Ihrem Classpath zu stören, wenn Tests ausgeführt werden.

Wenn Sie mit Maven die folgende Abhängigkeit hinzufügen (möchten Sie vielleicht Version ändern):

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

Ya Mine ist ein mvn Projekt, bei dem ich schon Abhängigkeit für JAMA Mail.But immer gleiche Ausnahme java.lang.NoClassDefFoundError hinzugefügt haben: com/sun/mail/util/MailLogger – user2215139

+0

@ user2215139 Sie sind sicher, dass Sie‘ Ich habe es in den Testbereich aufgenommen, wie ' test'? Wenn ja, was ist die Gruppen-/Artefakt-ID? –

+0

ya haben soeben jetzt Test und Abhängigkeit ist \t \t \t javax.mail \t \t \t javax.mail-api \t \t \t 1.4.7 \t \t \t Test \t \t aber immer noch die gleiche Ausnahme – user2215139

3

Bitte sehen http://mvnrepository.com/artifact/javax.mail/mail/, können Sie jar herunterladen oder die Maven-Abhängigkeit verwenden, je nach Projekttyp. Das sollte eigentlich alles abdecken und Sie werden keine NoClassDefFoundError-Ausnahme bekommen.

110

Das javax.mail-api-Artefakt eignet sich nur zum Kompilieren. Sie müssen Code ausführen, daher benötigen Sie eine vollständige Implementierung von JavaMail. Verwendung:

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

Die Versionsnummer wird wahrscheinlich unterscheiden: https://mvnrepository.com/artifact/com.sun.mail/javax.mail

+0

Das funktioniert wirklich für mich – Rameshwar

+1

Dies behebt auch 'java.lang.NoClassDefFoundError: com/sun/mail/util/PropUtil' sowie' Konnte nicht javax.mail.internet.InternetAddress 'Fehler initialisieren. – GlenPeterson

+1

Mein Problem gelöst, danke, ich wusste nicht, dass die javax.mail-API die Implementierung nicht enthält. – Peter

44

Ich verwende die folgenden Maven Abhängigkeiten Java-Mail-Funktion zu erhalten. Der erste enthält die javax.mail-API (ohne Implementierung) und der zweite 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> 
+0

http://mvnrepository.com/artifact/com.sun.mail/javax.mail – Xdg

+5

Sie müssen die API nicht einschließen, wenn Sie die Implementierung haben. – GlenPeterson

+1

Guter Punkt @GlenPeterson, habe ich nicht erkannt, dass von der Lösung oben, aber wenn ich in die com.sun.mail Jar der Javax.mail API ist in ihm enthalten. – Peter

1

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

Grüße

0

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

Verwandte Themen