2013-06-05 59 views
3

有点初学者的问题,但不幸的是,搜索没有帮助我。我已经创建了一个简单的Java类,模拟dieroll,如下所示:NoClassDefFoundError:Tomcat 7无法从jar中加载类

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”的原因是由于行家。 Dice.class包含在WEB-INF/lib目录下的Game-0.1-SNAPSHOT.jar中。

我想在下面的JSP使用骰子:

<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) 

我在做什么错?

+1

我相信Maven并没有真的要求你创建以'java'开头的包。我会尽力解决这个问题。 –

+1

这是正确的答案。我的白痴在制作src/main源代码而不是src/main/java时没有任何词语......我觉得我应该自己想清楚了,但是我花了好几个小时试图找出错误。 – user2456872

回答

0

这里有两个问题。

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

  2. 从Java语言规范开始,java和javax软件包 被保留,不应用于常规类。另外,如michal观察到的 ,Tomcat不加载某些类。

0

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

将该类移到另一个包中,然后重试。

+0

我曾考虑过这一点,试图改变它,但它打破了我的自动生成与maven。将改变它并报告回来。感谢您的帮助! – user2456872

1

这是预期的Tomcat 7行为。一些打包受到Tomcat的限制。 不能加载你可以在

$CATALINA_BASE/conf/catalina.properties

发现有java.模式封装/类的列表。