Я часами пытался выяснить, почему я получил java.lang.NoClassDefFoundError
, и я сузил причину до пути к классу Tomcat.
Я использовал приведенный ниже код, чтобы увидеть, что содержат переменные пути:
out.println("Classpath: '" + System.getProperty( "java.class.path" ) + "'" );
out.println("Ext dirs: '" + System.getProperty( "java.ext.dirs" ) + "'" );
out.println("Library path: '" + System.getProperty( "java.library.path" ) + "'" );
out.println("Path separator: '" + System.getProperty( "path.separator" ) + "'" );
И вывод:
Classpath: ':/usr/local/tomcat/bin/bootstrap.jar'
Ext dirs: '/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/ext:/usr/java/packages/lib/ext'
Library path: '/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/i386/server:/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/i386:/usr/lib/jvm/java-6-sun-1.6.0.16/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib'
Path separator: ':'
Как видите, Classpath НЕ начинается с "." как и должно быть, и я считаю, что поэтому моя программа не может найти классы, которые я импортирую из подкаталогов в моем веб-приложении.
Чтобы увидеть, где установлен путь к классам, я сделал grep -R bootstrap.jar /usr/local/tomcat/
и натолкнулся на это: CLASSPATH="$CLASSPATH":"$CATALINA_HOME"/bin/bootstrap.jar
(в файле /usr/local/tomcat/bin/catalina.sh
)
Это заставляет меня поверить, что по какой-то причине $ CLASSPATH здесь пуст. Однако echo $CLASSPATH
успешно возвращает .:/usr/lib/jvm/java-6-sun/bin:/usr/local/tomcat/lib/servlet-api.jar
Кто-нибудь может помочь здесь определить проблему?
РЕДАКТИРОВАТЬ: Все мои файлы сервлетов находятся в WEB-INF/classes/controllers/
, и библиотеки, которые я пытаюсь загрузить, являются файлами классов в подкаталогах.
Например, если ClassName.class
находится в каталоге WEB-INF / classes / controllers / packagename /, я добавляю package packagename
к началу ClassName.java
и импортирую его, используя import packagename.*
в someServlet.java
.
EDIT2: я решил свою проблему. Моя главная проблема заключалась в том, что, как написано ниже, не использовались правильные имена пакетов. Кроме того, я пытался скомпилировать из каталога classes/controllers/
вместо компиляции из classes/
. Спасибо всем за помощь!