NoClassDefFoundError:Tomcat 7无法从jar加载类

时间:2013-06-05 18:19:27

标签: java jsp tomcat tomcat7

有点像初学者的问题,但不幸的是,搜索并没有帮助我。我在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)

我做错了什么?

3 个答案:

答案 0 :(得分:1)

这是Tomcat 7的预期行为。一些打包受Tomcat限制。 无法加载的打包/类列表,您可以在

找到
  

$ CATALINA_BASE / CONF / catalina.properties

java.模式。

答案 1 :(得分:0)

可能是Tomcat拒绝从包java。*。

加载应用程序类

将课程移至另一个包,然后重试。

答案 2 :(得分:0)

这里有两个问题。

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

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