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

时间:2013-08-12 11:00:21

标签: java tomcat

尝试运行以下代码以使用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 个答案:

答案 0 :(得分:17)

服务器中出现此问题,因为Tomcat的lib和您的应用程序都有自己的mail.jar副本(在WEB-INF / lib中),因此类加载器可以加载两个不同的Session。如果删除了来自您的应用程序的mail.jar,这个问题将得到解决。

答案 1 :(得分:5)

你可能不再有这个问题了,但是对于下一个来这里的人来说:

如果您正在使用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>

这解决了我的问题。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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