2013-06-05 106 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.模式封裝/類的列表。