1

我目前正在开发一个发送电子邮件的 java webapp。因为我在 Tomcat 7 上部署它,所以我mail/Session在我的context.xml文件中配置了资源并将最新版本的复制mail.jar到 Tomcat 的 lib 文件夹中。

当我部署并运行我的 Web 应用程序时,我得到以下异常:

java.lang.ClassCastException: javax.mail.Session cannot be cast to javax.mail.Session

这是我用来在课堂上发送电子邮件的代码:

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

Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
InternetAddress toIA[] = new InternetAddress[1];
toIA[0] = new InternetAddress(to);
message.setRecipients(Message.RecipientType.TO, toIA);
message.setSubject(subject);
message.setContent(mensagem, "text/plain");
Transport.send(message);

我知道这可能会被抛出,因为我mail.jar在 Tomcat lib 文件夹和我的 web app lib 文件夹中都有,问题是我不能简单地从 Maven 中删除依赖项pom.xml,因为如果我这样做,Eclipse 会说它找不到某些类(例如Session)。

如果我的 web 应用程序中没有相应的 JAR,我该如何使用负责发送电子邮件的类?

4

1 回答 1

6

将特定依赖项的范围标记providedpom.xml

<scope>provided</scope>

假如

这很像 compile,但表示您希望 JDK 或容器在运行时提供依赖项。例如,在为 Java 企业版构建 Web 应用程序时,您可以将 Servlet API 和相关 Java EE API 的依赖设置为提供的范围,因为 Web 容器提供了这些类。此范围仅在编译和测试类路径上可用,并且不可传递。

这样的依赖项不会在导出时与您的应用程序一起打包,因为假定将部署应用程序的容器提供了它。官方文档中有更多信息。

于 2013-11-08T00:49:58.743 回答