11

尝试运行以下代码以使用 tomcat 上下文文件获取 javax.mail.Session 对象时,我一直收到此错误。

        Context initCtx = new InitialContext();
        Context envCtx = (Context) initCtx.lookup("java:comp/env");
        Session session = (javax.mail.Session) envCtx.lookup("mail/session");

这是 context.xml 中的资源声明。

  <Resource name="mail/Session" auth="Container"
        type="javax.mail.Session"
        mail.smtp.host="host"
        mail.smtp.user="user"
        mail.smtp.password="password"
        mail.smtp.auth="false"/>

我知道这可能是因为我的应用程序服务器库(tomcat)文件夹和我的应用程序库文件夹中的 javax.mail.Session 具有相同的库,我已经从我的应用程序库文件夹中消除了尽可能多的重复库文件(例如mail.jar)我可以看到将 javax.mail.Session 作为库的一部分,现在我处于仍然收到此错误并且不确定其他库可能是此问题的根源的地步,或者是我不知道的其他问题吗?

人们会建议我做什么来找到这个问题的根源?

谢谢。

4

4 回答 4

20

这个问题发生在服务器上,因为Tomcat的lib和你的应用程序都有自己的副本mail.jar(在WEB-INF/lib中),所以类加载器可以加载两个不同的Session。如果你mail.jar从你的应用程序中删除,这个问题将是解决了。

于 2013-12-27T04:20:46.137 回答
8

你可能不再有这个问题,但是下一个人来这里:

如果您使用的是 maven,<scope>provided</scope>请在 pom.xml 中添加您的 javax.mail 依赖项。

例如,就我而言:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>YOUR_VERSION</version>
    <scope>provided</scope> <!-- This line is new -->
</dependency>

这为我解决了这个问题。

于 2015-05-27T20:12:27.587 回答
2

在 maven javax.mail 中使用提供的范围 提供的邮件 1.4

于 2014-05-23T21:51:07.340 回答
1

如果您的服务器的 lib 中已经有 mail.jar,请将其从您的应用程序/pom 文件中删除,此问题将得到解决。

于 2015-03-22T06:27:24.873 回答