web-dev-qa-db-ja.com

Java Session.getInstanceでのメールの問題

Java mail;を使用しようとすると、次の例外が発生します。

Java.lang.NoClassDefFoundError: com/Sun/mail/util/MailLogger
    at javax.mail.Session.initLogger(Session.Java:226)
    at javax.mail.Session.<init>(Session.Java:210)
    at javax.mail.Session.getInstance(Session.Java:247)
    at com.secondstory.mailsender.MailSender.createSmtpSession(MailSender.Java:67)
    at com.secondstory.mailsender.MailSender.sendSimpleMessage(MailSender.Java:38)
    at com.secondstory.mailsender.MailSender.generateLostPasswordEmail(MailSender.Java:79)
    at com.secondstory.mailsender.MailSenderTest.shouldReturnTrueWithCredentialsSet(MailSenderTest.Java:49)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.Java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.Java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.Java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.Java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.Java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.Java:309)
    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:459)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:675)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.Java:382)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.Java:192)
Caused by: Java.lang.ClassNotFoundException: com.Sun.mail.util.MailLogger
    at Java.net.URLClassLoader$1.run(URLClassLoader.Java:366)
    at Java.net.URLClassLoader$1.run(URLClassLoader.Java:355)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.net.URLClassLoader.findClass(URLClassLoader.Java:354)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:425)
    at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:308)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:358)
    ... 30 more

スタックオーバーフローを広範囲に検索した後(多分十分ではないかもしれません-見てみましょう!)これも機能させるには、maven pom内に2つのjarが必要であることがわかりました。私が持っている2つの依存関係は次のとおりです。

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.5.2</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency> 

何かが変更されましたが、それが何であるかは完全にはわかりません-これは以前は機能していました。この要素が失敗する場所で私が書いたコードは次のとおりです。

private static Session createSmtpSession() {
    final Properties props = new Properties();
    props.setProperty("mail.Host", "Host");
    props.setProperty("mail.smtp.auth", "true");
    props.setProperty("mail.smtp.starttls.enable", "true");
    props.setProperty("mail.transport.protocol", "smtp");
    //props.setProperty("mail.debug", "true");

    return Session.getInstance(props, new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(
                            "username", "password");
                }
            });
}

私はいくつかの設定を欠いていますか、またはこれは私が持っている現在の設定で動作しますか?

ありがとう

15
Biscuit128

これをMaven POMに追加してみてください:

<dependency>
    <groupId>com.Sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.5.2</version>
</dependency>
31
Magic Wand

問題は、あなたがjavax.mail-api.jar。それは間違ったライブラリです。 JavaMailはJava EE仕様であり、その仕様のインターフェースはそのjavax.mail-api-1.6.1.jar、これはコンパイル時にのみ機能します。仕様の実装を提供しないため、実行時に機能しません。

実行時にJavaMail仕様の実装を使用する必要があります。リファレンス実装は https://javaee.github.io/javamail/ にあります(ただし、他にもあります。たとえば、Java EEアプリケーションサーバーには通常、 )。

ために javax.mail-api.jarhttps://javaee.github.io/javamail/ はこう言います:

JavaMail API定義のみ。コンパイルに適しています。 Mavenの「提供された」依存関係スコープでのみ使用する

具体的には、あなたのケースではjavax.mail.jarまたはmailapi.jar +使用する特定のプロトコルのjarファイル。例えば ​​mailapi.jar + smtp.jar smtp(s)サポートのみが必要な場合。

Mavenを使用すると、

<dependency>
    <groupId>com.Sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.1</version>
</dependency>
0
Mark Rotteveel