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

时间:2019-07-12 00:03:44

标签: java spring-boot tomcat javamail

尝试在Tomcat(而不是嵌入式Tomcat)上部署Spring Boot应用程序。我已经在Tomcat服务器配置上配置了Java邮件会话,并且试图在我的应用程序中将其作为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

我尝试从Tomcat的库中删除javax.mail.jar,但这会导致Tomcat启动出错,因为它无法创建邮件会话。我也尝试过删除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邮件会话。我不知道这些是否只是不相容的愿望,但我不明白为什么要这么做。

1 个答案:

答案 0 :(得分:0)

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