java.lang.NoClassDefFoundError: com / sun / mail / util / MailLogger для тестового випадку JUnit для пошти Java


127

Я використовую API Java Mail для читання та розбору електронних листів. Це добре працює з кодом сервлета.

Зараз я намагаюся написати тестовий випадок JUnit з тією ж метою. Але на лінії Session session = Session.getDefaultInstance(properties);я отримую такий виняток:

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

Хтось може сказати мені, де я помиляюся.

Відповіді:


116

com.sun.mail.util.MailLoggerє частиною API JavaMail . Він уже включений у середовище EE (саме тому ви можете використовувати його на своєму прямому сервері), але він не включений у середовище SE.

Документи Oracle :

API JavaMail доступний як необов'язковий пакет для використання з платформою Java SE і також включений у платформу Java EE.

99% того, що ви запускаєте свої тести в середовищі SE, що означає, що вам потрібно потурбуватись про те, щоб додати його вручну до свого класного шляху під час виконання тестів.

Якщо ви використовуєте maven, додайте таку залежність (ви можете змінити версію):

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

63
Артефакт javax.mail-api корисний лише для компіляції. Насправді потрібно запустити код, тому вам потрібна повна реалізація JavaMail. Використовуйте <groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId>.
Білл Шеннон

150

javax.mail-apiАртефакт гарний тільки для компіляції проти.

Насправді потрібно запустити код, тому вам потрібна повна реалізація API JavaMail. Використовуй це:

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

ПРИМІТКА. Номер версії, ймовірно, відрізнятиметься. Перевірте останню версію тут .


3
Це також виправляє java.lang.NoClassDefFoundError: com/sun/mail/util/PropUtil, а також Could not initialize class javax.mail.internet.InternetAddressпомилки.
GlenPeterson


52

Для використання Java-пошти я використовую такі залежності Maven. Перший включає API javax.mail (без його реалізації), а другий - реалізацію API SQL 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
Вам не потрібно включати api, якщо у вас є реалізація.
GlenPeterson

1
Хороший момент @GlenPeterson, я не зрозумів, що з рішення вище, але коли я заглянув у банку com.sun.mail, в нього включений api javax.mail.
Пітер




1

Це трапляється також, якщо ваш код очікує Java Mail 1.4, а ваші банки - Java Mail 1.3. Сталося зі мною, коли оновив чайник Пентахо

З повагою

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.