web-dev-qa-db-ja.com

java.lang.NoClassDefFoundError:JavaメールのJUnitテストケースのcom / Sun / mail / util / MailLogger

私はJava Mail APIを使用してメールを読んで解析しています。サーブレットコードで正常に動作しています。

今、私は同じ目的のために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

誰が私が間違っているのか教えてもらえますか?.

104
user2215139

com.Sun.mail.util.MailLoggerJavaMail APIの一部です。 EE環境にはすでに含まれています(そのため、ライブサーバーで使用できます)が、SE環境には含まれていません。

Oracleドキュメント

JavaMail APIは、Java SEプラットフォームで使用するオプションパッケージとして利用でき、Java EEプラットフォームにも含まれています。

99%は、SE環境でテストを実行することを意味します。これは、テストを実行するときにクラスパスに手動でテストを追加することに煩わされることを意味します。

Mavenを使用している場合は、次の依存関係を追加します(バージョンを変更することもできます)。

<dependency>
    <groupId>com.Sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.0</version>
</dependency>
89
Eugene Loy

Javax.mail-apiアーティファクトは、コンパイルに対してのみ有効です。実際にコードを実行する必要があるため、JavaMailの完全な実装が必要です。つかいます:

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

バージョン番号はおそらく異なるでしょう: https://mvnrepository.com/artifact/com.Sun.mail/javax.mail

126
Bill Shannon

次のMaven依存関係を使用して、Javaメールを機能させます。 1つ目はjavax.mail API(実装なし)を含み、2つ目はjavax.mail APIのSun実装です。

<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>
48
Shane Rowatt

このJARをダウンロードして、ライブラリに追加します。 http://Java.net/projects/javamail/downloads/download/javax.mail.jar

4
Joaquin Iurchuk

http://mvnrepository.com/artifact/javax.mail/mail/ を参照してください。プロジェクトのタイプに応じて、jarをダウンロードするか、maven依存関係を使用できます。これでほぼカバーされ、NoClassDefFoundError例外は発生しません。

3
Gaurav B

また、コードがJava Mail 1.4を予期していて、jarがJava Mail 1.3である場合にも発生します。 Pentaho Kettleをアップグレードしたときに私に起こった

よろしく

本当に面白いです。 「javax.mail」ではなく、「com.Sun」のjavax-mail.jarを使用するだけです。
dwonload com.Sunメールjar

0
Resul Rzaeeff