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");
}
});
}
私はいくつかの設定を欠いていますか、またはこれは私が持っている現在の設定で動作しますか?
ありがとう
これをMaven POMに追加してみてください:
<dependency>
<groupId>com.Sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.2</version>
</dependency>
問題は、あなたが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.jar
、 https://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>