java.lang.NoClassDefFoundError:无法初始化类javax.mail.internet.InternetAddress

时间:2014-01-14 21:37:10

标签: java jsp servlets tomcat7 javamail

我正在尝试使用JavaMail API发送电子邮件。这是我在servlet上的代码:

package com.lsp.web;

import com.lsp.service.Mailer;
import javax.ejb.EJB;
import javax.mail.MessagingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "contact", urlPatterns = {"/contact"})
public class ContactServlet extends SpringInjectedServlet {
@EJB
private Mailer emailBean;

@Override
public void init() throws ServletException {

}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doPost(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String customerEmail = req.getParameter("email");
    String subject = req.getParameter("subject");
    String body = req.getParameter("message");

    String error = null;
    String succMess = null;

    try {
        javax.mail.internet.InternetAddress ia = new javax.mail.internet.InternetAddress(customerEmail);
        ia.validate();
        emailBean.send(customerEmail, subject, body);
        req.setAttribute("succMessage", succMess);
        req.getRequestDispatcher("sent.jsp").forward(req, resp);

    } catch (javax.mail.internet.AddressException ae) {
        error = "您指出的邮箱地址不存在";
        req.setAttribute("errorMessage", error);
        req.getRequestDispatcher("contact.jsp").forward(req, resp);
    }
    catch (MessagingException mex) {
        error = "发送失败";
        req.setAttribute("errorMessage", error);
        req.getRequestDispatcher("contact.jsp").forward(req, resp);
    }
}
}

在我检查用户地址的行:

javax.mail.internet.InternetAddress ia = new javax.mail.internet.InternetAddress(customerEmail);
ia.validate();

我有一个例外。 java.lang.NoClassDefFoundError:无法初始化类javax.mail.internet.InternetAddress

在pom.xml中,我添加了这些行:

<!--JavaMail API-->
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>javax.mail-api</artifactId>
        <version>1.5.1</version>
    </dependency>

    <!--EJB-->
    <dependency>
        <groupId>javax.ejb</groupId>
        <artifactId>ejb-api</artifactId>
        <version>3.0</version>
    </dependency>

我正在使用Tomcat。 有人能告诉我为什么会这样,以及我如何解决这个问题。

谢谢。

3 个答案:

答案 0 :(得分:0)

你得到一个java.lang.NoClassDefFoundError,这意味着JVM无法初始化类,而不是它找不到类ClassNotFoundException的类。 NoClassDefFoundError可能是由ClassNotFoundException引起的,但不一定是这种情况。

要查找原因,请停止服务器,删除日志并重新开始。然后重现错误并尝试在日志文件中查找第一个异常及其原因。如果幸运的话,这就是NoClassDefFoundError的原因。

您也可以在问题中指出您正在使用的服务器。如何解决错误可能会有所不同。

答案 1 :(得分:0)

在构建时添加依赖项不会使Tomcat在运行时可用。您需要将javax.mail.jar文件添加到应用程序的WEB-INF / lib目录或Tomcat的lib目录中。

当然,如果您使用完整的Java EE应用程序服务器而不是Tomcat,则不会出现此问题...: - )

答案 2 :(得分:0)

请参阅:https://stackoverflow.com/a/28935760/1128668您已将mail-api.jar添加到项目中。这是API规范。解决方法是替换它:

<!-- DO NOT USE - it's just the API, not an implementation -->
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>

使用该api的参考实现:

<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>

我知道包名中有sun,但这是最新版本。