【问题标题】:NoClassDefFoundError: Tomcat 7 unable to load classes from jarNoClassDefFoundError:Tomcat 7 无法从 jar 加载类
【发布时间】:2013-06-01 13:51:14
【问题描述】:

有点像初学者的问题,但不幸的是搜索对我没有帮助。我在 java 中创建了一个模拟 dieroll 的简单类,如下所示:

package java.com.game.util;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Dice {

    private static Random randomGenerator = new Random();

    public static int rollOne(){
        return randomGenerator.nextInt(6)+1;
    }

    public static List<Integer> roll(int amountOfDice){
        List<Integer> rolls = new ArrayList<Integer>();
        for (int i = amountOfDice ; i > 0; i--){
            rolls.add(rollOne());
        }
        return rolls;
    }

}

之所以打包成“java”是因为maven。 Dice.class 包含在 WEB-INF/lib 目录下的 Game-0.1-SNAPSHOT.jar 中。

我正在尝试在以下 jsp 中使用 Dice:

<H1>Test</H1>
<%= java.com.game.util.Dice.rollOne() %>

这是发生的错误:

org.apache.jasper.JasperException: An exception occurred processing JSP page /game/index.jsp at line 2

1: <H1>Some Heading</H1>
2: <%= java.com.game.util.Dice.rollOne() %>


Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:455)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

root cause

javax.servlet.ServletException: java.lang.NoClassDefFoundError: java/com/game/util/Dice
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:912)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:841)
    org.apache.jsp.game.index_jsp._jspService(index_jsp.java:69)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

root cause

java.lang.NoClassDefFoundError: java/com/game/util/Dice
    org.apache.jsp.game.index_jsp._jspService(index_jsp.java:63)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

我做错了什么?

【问题讨论】:

  • 我确定 Maven真的不要求您创建以 java 开头的包。我会先尝试解决这个问题。
  • 这是正确的答案。让 src/main 成为源根目录而不是 src/main/java 的愚蠢无话可说……我觉得我应该自己弄清楚,但我花了几个小时试图找出错误。

标签: java jsp tomcat tomcat7


【解决方案1】:

这里有两个问题。

  1. src/main/java 是 Maven 中 Java 源文件的默认文件夹。 包文件夹(类路径)在 java 文件夹下开始。战争 插件将编译好的类/包放在 WEB-INF/classes 下 文件夹。

  2. 从 Java 语言规范开始,java 和 javax 包 已保留,不应用于常规课程。另外,作为 michal 观察到,Tomcat 不加载某些类。

【讨论】:

    【解决方案2】:

    这是预期的 Tomcat 7 行为。一些打包受Tomcat的限制。 您可以在

    找到无法加载的打包/类列表

    $CATALINA_BASE/conf/catalina.properties

    java. 模式。

    【讨论】:

      【解决方案3】:

      可能是Tomcat拒绝从包java.*加载应用程序类。

      将该类移至另一个包并重试。

      【讨论】:

      • 我考虑过这一点并试图改变它,但它破坏了我使用 maven 的自动构建。将更改它并报告回来。感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 2013-01-11
      相关资源
      最近更新 更多