java.lang.ClassCastException: javax.mail.Session 无法转换为 javax.mail.Session

12

当我尝试运行以下代码以使用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,现在我还是遇到了这个错误,不确定其他库文件是否可能是这个问题的源头,或者这是我不知道的其他问题?

大家有什么建议可以帮我找到问题的源头吗?

谢谢。


确保重新启动Tomcat。如果仍然抛出异常,则您可能错过了javax.mail.Session仍在的地方。 - Henry
7
我不知道你问题的确切解决方法,但还有一个可能原因(供你深入挖掘)——javax.mail.Session被2个不同的类加载器加载。 - serejja
4个回答

22

这个问题发生在服务器上,因为Tomcat库和您的应用程序都有自己的mail.jar拷贝(在WEB-INF/lib目录下),所以类加载器会加载两个不同的Session。如果您从应用程序中删除mail.jar,这个问题将得到解决。


另一种情况是:当使用Maven时,可能会通过pom中直接依赖的间接依赖项导入冲突的mail.jar。在这种情况下,您必须查找间接依赖项并使用“排除/exclusion”来防止包含间接依赖项。 - Bruno Ranschaert

9

也许您已经不再遇到这个问题,但是对于下一个来到这里的人:

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

例如,在我的情况下:

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

这对我解决了问题。

1
我必须重启Tomcat并重新部署我的应用程序才能生效。 - svarog

2

在Maven中使用提供的范围

javax.mail
mail
1.4
provided


1
如果您的服务器上已经有了mail.jar文件,请从应用程序/pom文件中删除它,这个问题就会解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接