CLASSPATH Tomcat отличается от Java и не включает "." Как я могу изменить это? - PullRequest
3 голосов
/ 23 октября 2009

Я часами пытался выяснить, почему я получил 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/. Спасибо всем за помощь!

Ответы [ 3 ]

7 голосов
/ 23 октября 2009

Путь к классу Tomcat не должен начинаться с .. На самом деле, добавление . в путь к классам - это просто удобный способ указать java искать классы в текущем каталоге, не используя -cp при использовании его в командной строке.

На самом деле, в большинстве случаев вам не нужно настраивать classpath Tomcat. Чтобы Tomcat мог найти ваши классы, вам нужно развернуть приложение в виде стандартизированного WAR (веб-архива), имеющего определенную структуру. Примерно так:

.
|-- WEB-INF
|   |-- classes
|   |   `-- com
|   |       `-- mycompany
|   |           `-- MyServlet.class
|   |-- lib
|   |   |-- bar.jar
|   |   `-- foo.jar
|   `-- web.xml
|-- application.jsp
|-- image.gif
`-- index.html

Каталог WEB-INF/classes - это место, где должны находиться ваши скомпилированные классы, именно здесь Tomcat будет их искать. Если вы поместите ваши классы в WEB-INF/classes/controllers, controllers будет считаться частью имени пакета (что, скорее всего, не то, что вы хотите). Итак, у вас есть два варианта:

  1. удалить этот controllers каталог
  2. или добавьте его к имени пакета.

Но они взаимоисключающие, вы не можете иметь и то и другое.

7 голосов
/ 23 октября 2009

Классы, необходимые в веб-приложении, должны находиться в веб-приложении в папке WEB-INF / classes или упакованы в файлы JAR, расположенные в WEB-INF / lib. Обычно для этого не следует использовать общие настройки пути к классам сервлетов, как вы, похоже, пытаетесь это сделать.

2 голосов
/ 23 октября 2009

CLASSPATH - это , а не «предполагается» начинать с ".". Поскольку его целью является конфигурация среды выполнения, он может принимать любое значение по вашему выбору. Также обратите внимание, что использование переменной среды CLASSPATH не рекомендуется с Java 1.1 (выпущенной в начале 1997 года) - не менее 12 лет.

Путь к классу веб-приложения, с другой стороны, четко указан. Переместите содержимое каталога controllers (и любых других недопустимых подкаталогов) в WEB-INF/classes/, чтобы каталог пакета был непосредственным потомком classes.

...