web-dev-qa-db-fra.com

Problème de messagerie Java avec Session.getInstance

Je reçois l'exception suivante lorsque j'essaie d'utiliser le courrier Java.

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

Après avoir longuement cherché le dépassement de pile (peut-être pas assez - voyons!), Nous avons constaté que nous avions besoin de deux bocaux à l'intérieur de notre pommeau pour fonctionner aussi. Les deux dépendances que j'ai sont les suivantes:

<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> 

Quelque chose a changé mais je ne suis pas tout à fait sûr de ce que c'est - car cela fonctionnait auparavant. Le code que j'ai écrit à l'endroit où cet élément échoue est le suivant:

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");
                }
            });
}

Est-ce qu'il me manque une configuration ou est-ce que cela devrait fonctionner avec la configuration actuelle que j'ai?

Merci

15
Biscuit128

Essayez d’ajouter ceci dans Maven POM:

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

Le problème est que vous essayez d'utiliser javax.mail-api.jar. C'est la mauvaise bibliothèque. JavaMail est une spécification Java EE, les interfaces de cette spécification sont publiées dans ce javax.mail-api-1.6.1.jar, qui ne fonctionne que lors de la compilation. Il ne fournit pas d'implémentation de la spécification, il ne fonctionne donc pas au moment de l'exécution.

Vous devez utiliser une implémentation de la spécification JavaMail au moment de l'exécution. Vous pouvez trouver l'implémentation de référence sur https://javaee.github.io/javamail/ (mais il en existe d'autres, par exemple les serveurs d'applications Java EE en incluent généralement un).

Pour javax.mail-api.jar, https://javaee.github.io/javamail/ dit:

Les définitions d’API JavaMail uniquement, appropriées pour la compilation; utilisation uniquement avec une portée de dépendance Maven «fournie»

Spécifiquement, dans votre cas, vous avez besoin de javax.mail.jar ou mailapi.jar + les fichiers JAR des protocoles spécifiques que vous souhaitez utiliser. Par exemple, mailapi.jar + smtp.jar si vous avez uniquement besoin de la prise en charge de smtp (s).

Avec Maven, vous pouvez utiliser

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