java - Tomcat类路径加载器javax.mail.Session与spring-boot-starter-mail冲突

标签 java spring-boot tomcat jakarta-mail

尝试在 Tomcat(而非嵌入式 Tomcat)上部署 Spring Boot 应用程序。我已经在 Tomcat 服务器配置上配置了一个 Java 邮件 session ,并且我正在尝试在我的应用程序中将其作为 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 文件夹中。我的 pom.xml

中也包含了 spring-boot-starter-mail

我已经尝试从 Tomcat 的库中删除 javax.mail.jar,但这会导致 Tomcat 启动时出错,因为它无法创建邮件 session 。我也试过删除 spring-boot-starter-mail,但这会干扰我的一些需要 JavaMailSender 和其他邮件组件的代码。我试过弄乱 JNDI 导入和类似的东西,但无济于事。我还尝试检查 spring-boot-starter-mail 包含的邮件 jar 的版本,并更新 Tomcat 中的 jar 以匹配。我还检查了 Maven 中的传递依赖项,看看是否引入了不同的邮件实现,但什么也没有。所以我有点没主意了。

这是我在我的 web.xml 中获取 JNDI 值的地方:

<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 邮件 session 。我不知道这些是否只是不相容的愿望,但我不明白为什么它们应该是。

最佳答案

好的,所以解决方案确实是@Bill Shannon 所建议的。我必须将 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 错误消息。感谢所有看过此内容的人,希望这可以解决其他人的问题!

关于java - Tomcat类路径加载器javax.mail.Session与spring-boot-starter-mail冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56998713/

相关文章:

java - 在 jar 启动时预加载 java 类/库?

postgresql - 无法通过 Spring Boot 将 Docker Desktop Kubernetes (Windows) 服务连接到本地 Postgres 数据库

java - 在 WINDOWS 中,如何找到 Tomcat 使用的 Java 版本?

jquery - 在 CFC 上使用 AJAX 时出现 501 错误

tomcat - 具有多个 tomcat 实例的反向代理的 Nginx 配置

java - Tomcat 7/TomEE 1.6 @Webfilter 注释。没有从 Jar 中加载

java - 将另一个 String[] 添加到 String[]

java - 使用EntityManager通过jdbcAuthentication实现Spring Security

java - 如何在 Clojure 中创建可分发的应用程序?

java - Spring Boot中请求字段的条件验证