Не удалось импортировать javax.servlet - PullRequest
2 голосов
/ 29 октября 2009

Я знаю, что это распространенная ошибка, но потерпите меня. Я преследовал проблему CLASSPATH, и я не думаю , что это проблема. Я получаю такую ​​ошибку.

./src/process.java:2: package javax.servlet does not exist
import javax.servlet.*;

Я установил Tomcat и Java SDK, и я знаю, что Tomcat должен предоставлять API сервлета. Но какой файл он точно ищет?

У меня есть следующие настройки: JAVA_HOME = / USR / Java / jdk1.6.0_16 CLASSPATH = / USR / доли / Java; / USR / доли / Java / tomcat6

Базовый каталог для tomcat: / usr / share / tomcat6 В этом каталоге / usr / share / tomcat6 / lib это просто символическая ссылка на / usr / share / java / tomcat6

tomcat6-servlet-2.5-api-6.0.18.jar находится в / usr / share / java / tomcat6, есть ли еще что-то, о чем мне нужно рассказать javac, чтобы он использовал эту библиотеку? Мне нужна еще одна библиотека?

Для справки: я пытаюсь запустить сервлет hello world. Код выглядит следующим образом:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class process extends HttpServlet {

public void doGet( HttpServletRequest request, 
                   HttpServletResponse response)
              throws ServletException, IOException {

    PrintWriter out = response.getWriter();
    out.println("Hello World");

}
}

Когда я компилирую это с помощью javac, я получаю следующие ошибки (среди прочих, которые являются основной причиной):

./src/process.java:2: package javax.servlet does not exist
import javax.servlet.*;
^
./src/process.java:3: package javax.servlet.http does not exist
import javax.servlet.http.*;
^

Я также попытался указать classpath в командной строке с параметром -cp, но в итоге получил те же результаты.

Ответы [ 2 ]

5 голосов
/ 29 октября 2009

Вам нужно указать путь к классу, чтобы он указывал , в частности, на ваш JAR:

CLASSPATH=/usr/share/java/tomcat/tomcat6-servlet-2.5-api-6.0.18.jar

Когда вы указываете папку в classpath, она используется только для поиска всех классов в этой папке. JAR сами по себе являются библиотеками (упакованными папками, если хотите) классов и, следовательно, должны быть перечислены по отдельности. Так, например, вы можете сделать что-то вроде:

CLASSPATH=/some/location/myjar1.jar:/other/location/myjar2.jar:/some/classes/folder

, в этом случае вам будут доступны все классы из директорий myjar1.jar, myjar2,jar и /some/classes/folder. Если бы у вас было myjar3.jar в /some/classes/folder, вышеприведенное объявление НЕ добавило бы его в classpath.

Обновление Как указывалось McDowell , Java 6 допускает подстановочные знаки в classpath, которые будут собирать все файлы jar в указанной папке. Подстановочные знаки работают только для JAR , классы не выбираются, если папка не указана снова без подстановочных знаков. Подстановочные знаки также не являются рекурсивными. Итак:

CLASSPATH=/loc1/*:/loc1:/loc2/*

сделает доступными все jar и все классы в папке /loc1 и все jar (но не классы) в папке /loc2. Более глубокие вложенные банки (/loc1/nested/some.jar) не будут подняты.

0 голосов
/ 21 апреля 2014

Вы пишете что-то в консоли или * .bat-файле.

SET CLASSPATH = C: \ java \ apache-tomcat-7.0.53 \ lib \ servlet-api.jar

...