2013-06-05 3 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 содержится в Game-0.1-SNAPSHOT.jar в каталоге WEB-INF/lib.

Я пытаюсь использовать Dice в следующем 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 - это папка по умолчанию для исходных файлов Java в Maven. Папки пакетов (classpath) запускаются под папкой java. Плагин войны помещает скомпилированные классы/пакеты в папку WEB-INF/classes .

  2. Что касается спецификации языка Java, пакеты java и javax зарезервированы и не должны использоваться для обычных классов. Кроме того, как отмечает michal, Tomcat не загружает некоторые классы.

0

Возможно, Tomcat отказывается загружать классы приложений из пакета java. *.

Переместить класс в другой пакет и повторите попытку.

+0

Я рассмотрел это и попытался изменить его, но он сломал мою автоматическую сборку с maven. Изменит его и отчитается. Спасибо за помощь! – user2456872

1

Ожидается поведение Tomcat 7. Некоторые упакованные ограничены Tomcat. Список упакованного/класс, который не может быть нагрузить вы можете найти на

$CATALINA_BASE/conf/catalina.properties

Существует java. картина.

Смежные вопросы