Сервлет Java не скомпилируется - не может найти javax.servlet - PullRequest
1 голос
/ 13 ноября 2011

У меня большие проблемы с компиляцией Java-сервлетов. Насколько я вижу, я сделал все, что мне нужно, правильно установил Tomcat 7 и Tomcat работает. Как я понимаю, мне нужно добавить пакет servlet.jar в мой classpath. Кажется, в моей системе нет servlet.jar, но из того, что я могу понять из документации tomcat, теперь это servlet-api.jar.

Я сделал это, отредактировав путь к классам в /etc/environment:

PATH = "/ USR / местные / SBIN: / USR / местные / бен: / USR / SBIN: / USR / бен: / SBIN: / бен: / USR / игры" CLASSPATH = "/ USR / доли / tomcat7 / Библиотека / сервлет-api.jar"

К сожалению, все еще не повезло, я не могу скомпилировать Java-сервлеты, и я все еще получаю предупреждения о пропущенных символах для javax.servlets.

Я использую Ubuntu 11.10 x64. Есть идеи?

Ответы [ 3 ]

3 голосов
/ 13 ноября 2011

Я сделал это, отредактировав путь к классам в /etc/environment:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" CLASSPATH="/usr/share/tomcat7/lib/servlet-api.jar"

Это выглядит хорошо. PATH не имеет отношения к конкретной проблеме, хотя. Это никак не использовалось Java. Он используется только платформой операционной системы для поиска исполняемых файлов. CLASSPATH аналогичен, но используется только Java для поиска классов, которые должны использоваться во время компиляции и / или выполнения.

Ваша проблема, скорее всего, вызвана тем, что вы использовали -cp или -classpath аргумент команды javac. В этом случае переменная окружения CLASSPATH будет игнорироваться (кстати, это также относится к команде java, даже если используется аргумент -jar).

Вам необходимо указать путь к классу только с помощью либо CLASSPATH переменная среды , либо аргумент -cp или -classpath. Общая рекомендация - вообще забыть о переменной окружения CLASSPATH, поскольку это считается плохой практикой, когда вы хотите сделать немного больше, чем просто "Hello World". Вы можете указать несколько путей в аргументе -cp или -classpath, используя :.

$ cd /path/to/package/root/of/your/servlet/code
$ javac -cp .:/path/to/servlet-api.jar com/example/YourServlet.java

Если вы устали повторять этот ввод каждый раз, просто поместите его в сценарий .sh, или воспользуйтесь инструментом сборки, таким как Ant, который позволяет конфигурировать файл XML, или просто используйте IDE, например Eclipse, Netbeans или IntelliJ. который сделает все это автоматически, когда вы просто сохраните исходный файл.

2 голосов
/ 13 ноября 2011

javax.servlets определяется в servlet-api.jar, поэтому ваша проблема должна быть как-то связана с вашей конфигурацией.Что вы используете для компиляции?Вы вводите команды javac напрямую или используете инструмент сборки, такой как maven, или ant, или eclipse события?Я бы порекомендовал maven, потому что он обрабатывает зависимости для вас с помощью одного файла конфигурации.Действительно легко подобрать тоже.

В maven вам нужно начать с установки / настройки maven и начать проект с заданной файловой структурой (это упрощенно, но достаточно):

/src/main/java - The root of your java files
/src/main/webapp - The root of your webapp
/pom.xml - Maven configuration file

Итак, полноеСписок файлов для сервлета может быть следующим:

/src/main/java/com/mycompany/myapp/MyServlet.java
/src/main/webapp/WEB-INF/web.xml
/src/main/webapp/index.jsp
/pom.xml

Первые 3 строки (кроме корневой файловой структуры) такие же, как и для любого веб-приложения, последняя - ваш файл конфигурации, который будет выглядетьнапример:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany</groupId>
  <artifactId>myapp</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <type>jar</type>
      <scope>provided</scope>
    </dependency>
  </dependencies>
</project>

Важная часть здесь заключается в том, что зависимость от servlet-api обрабатывается maven, поэтому нет необходимости загружать ее, устанавливать пути к классам или что-то еще.После того, как вы установили эту файловую структуру и отредактировали pom, вы просто перемещаете консоль в корень и вводите mvn package.Это загрузит ваши зависимости, скомпилирует ваш код и упакует вашу войну.Существует гораздо больше, чем Maven предлагает с минимальными изменениями.В отличие от муравья, это потребует:

для добавления

2 голосов
/ 13 ноября 2011

У вас не должно быть переменной среды CLASSPATH.

Лучший способ сделать это - использовать аргумент -classpath для javac.exe при компиляции и java.exe при запуске. Добавьте сюда сервлет-api.jar Tomcat.

Еще одно предложение - выучить муравья. Это инструмент сборки на основе XML, Java. Его легче изучать и использовать, чем Maven. Я бы начал с этого.

...