简体   繁体   中英

NoClassDefFoundError: Tomcat 7 unable to load classes from jar

Somewhat of a beginner question, but searching unfortunately did not help me. I have created a simple class in java that simulates a dieroll, as seen below:

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;
    }

}

The reason it's packaged in "java" is due to maven. Dice.class is contained in Game-0.1-SNAPSHOT.jar in the WEB-INF/lib directory.

I am trying to use Dice in the following jsp:

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

This is the Error that occurs:

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)

What am I doing wrong?

This is expected Tomcat 7 behavior. Some packaged are restricted by Tomcat. The list of packaged/class which cannot be load you can find at

$CATALINA_BASE/conf/catalina.properties

There is java. pattern.

It might be that Tomcat refuses to load application classes from package java.*.

Move the class to another package and try again.

There are two issues here.

  1. src/main/java is the default folder for Java source files in Maven. Package folders (classpath) starts under the java folder. The war plugin places the compiled classes/packages under WEB-INF/classes folder.

  2. As of Java Language specification, java and javax packages are reserved and should not be used for regular classes. Also, as michal observed, Tomcat does not load some classes.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM