Загрузчик classpath Tomcat javax.mail - PullRequest
0 голосов
/ 12 июля 2019

Попытка развернуть приложение Spring Boot на Tomcat (не на встроенном Tomcat). Я настроил почтовый сеанс Java в конфигурации сервера Tomcat и пытаюсь получить доступ к нему в качестве значения JNDI в моем приложении. По какой-то причине мое приложение получает ошибку и показывает это:

Caused by: java.lang.IllegalArgumentException: The local resource link [support] that refers to global resource [mail/support] was expected to return an instance of [javax.mail.Session] but returned an instance of [javax.mail.Session]
        at org.apache.naming.factory.ResourceLinkFactory.getObjectInstance(ResourceLinkFactory.java:163)
        at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:840)

Я включил javax.mail.jar в папку Tomcat /lib. Я также включил spring-boot-starter-mail в мои pom.xml

Я попытался удалить javax.mail.jar из библиотеки Tomcat, но это вызывает ошибку при запуске Tomcat, поскольку он не может создать почтовый сеанс. Я также пытался удалить spring-boot-starter-mail, но это мешает некоторым из моего кода, который требует JavaMailSender и других почтовых компонентов. Я пытался возиться с импортом JNDI и тому подобным, но безрезультатно Я также попытался проверить версию почтового фляги, включенную spring-boot-starter-mail, и обновить флягу в Tomcat, чтобы соответствовать. Я также проверил свои транзитивные зависимости в Maven, чтобы увидеть, загружается ли другая реализация почты, и ничего нет. Так что я отчасти из идей.

Вот где я получаю значение JNDI в моем файле web.xml:

<resource-ref>
        <description>The mail session configured in Tomcat</description>
        <res-ref-name>mail/support</res-ref-name>
        <res-type>javax.mail.Session</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>

Вот что я настроил в Tomcat server.xml:

<GlobalNamingResources>
<Resource name="mail/support"
              auth="Container"
              type="javax.mail.Session"
              mail.smtp.host="smtp.XXX.XXX"
              mail.smtp.user="support"
              mail.smtp.from="support@XXX.org" />
</GlobalNamingResources>

А вот что находится в context.xml:

<Context>
<ResourceLink global="mail/support" name="mail/support" type="javax.mail.Session" />
</Context>

Я бы хотел использовать spring-boot-starter-mail и использовать глобально настроенный почтовый сеанс JNDI. Я не знаю, являются ли это просто несовместимыми желаниями, но я не понимаю, почему они должны быть такими.

1 Ответ

0 голосов
/ 16 июля 2019

Хорошо, так что решение действительно было тем, что предложил @ Билл Шеннон.Мне пришлось включить зависимость com.sun.mail в область действия Maven provided.Моя конкретная проблема заключалась в том, что в проекте уже использовалась зависимость spring-boot-starter-mail, которая включает в себя com.sun.mail jar.Поэтому я должен был исключить это из моей зависимости от Maven.Таким образом, полная зависимость Maven, связанная с почтой, выглядит следующим образом:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.5.6</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <exclusions>
        <exclusion>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Это кажется немного очевидным.Я думаю, что моим основным источником путаницы было странное сообщение об ошибке Tomcat.Спасибо всем, кто взглянул на это, надеюсь, это решит проблему для кого-то еще!

...