2011-01-02 3 views
0

В TOMCAT приложения JSP У меня есть этот макет каталога:Классы не видя друг друга в JSP

webapps/ 
    myProjectName/ 
     index.jsp 
     WEB-INF/ 
      classes/ 
       mypackage/ 
        class1.java 
        class2.java 

Я пытаюсь скомпилировать class1.java, который ссылается на class2.java. Она закодирована в форме вроде этого:

package mypackage; 

public class class1 extends class2 {} 

и class2 выглядит следующим образом:

package mypackage; 

public class class2 {} 

однако, я получаю сообщение об ошибке на class1 говорят, что Class2 не может быть найден. Сначала я скомпилировал класс2, который скомпилировался просто отлично, но когда я попытался скомпилировать класс1, он потерпел неудачу, сказав, что class2 не может быть найден. Я попытался добавить каталог в моем пути к классам (Ubuntu), добавив в/и т.д./enviornment:

/usr/local/tomcat/webapps/myProjectName/WEB-INF/classes 

, но он по-прежнему не компилируется.

Любая идея, что не так?

Точный вывод ошибок заключается в следующем:

javac "Page.java" (in directory: /usr/local/tomcat/webapps/developers/WEB-INF/classes/library) 
Page.java:20: cannot find symbol 
symbol : class DynamicPage 
location: class library.Page 
     DynamicPage dynamicClasses = {new registerPage()}; 
     ^
Page.java:20: illegal initializer for <none> 
     DynamicPage dynamicClasses = {new registerPage()}; 
            ^
Page.java:20: cannot find symbol 
symbol : class registerPage 
location: class library.Page 
     DynamicPage dynamicClasses = {new registerPage()}; 
            ^
Page.java:34: cannot find symbol 
symbol : class DynamicPage 
location: class library.Page 
      DynamicPage selected = null; 
      ^
Page.java:35: cannot find symbol 
symbol : class DynamicPage 
location: class library.Page 
      for (DynamicPage dp: dynamicClasses) { 
       ^
5 errors 
Compilation failed. 
+0

так что «mypackage» на самом деле «библиотека», «класс2» на самом деле «DynamicPage», а «class1» - это «Страница», правильно? Некоторые из кода, показанного в сообщениях об ошибках, не имеют смысла, поэтому может оказаться полезным показать источник DynamicPage, если он не слишком длинный. Например, инициализатор выглядит неправильно, а for-loop выглядит странно (если DynamicPage не реализует Iterable , что не является интуитивным относительно того, почему это было бы). –

+0

Да. Ссылки на страницы DynamicPage в коде, но он дает ошибку, говоря, что класс не может быть найден. –

+0

В ответ на ваше редактирование, Bert F, лучший пример проблемы, с которой я столкнулся, заключается в том, что DynamicPage является интерфейсом и отлично компилируется. RegisterPage - это класс, который реализует DynamicPage, но не может видеть DyanamicPage и, таким образом, компилируется с ошибкой. –

ответ

2

Я не понимаю, почему некоторые люди так против использования Eclipse или Netbeans (или любой IDE). Я понимаю, что некоторые люди предпочитают ручной привод в автоматическом режиме, потому что вы склонны ощущать сырую мощность двигателя. Я научился ездить по автомату, а затем привык к руководству по вождению. Я владею ручным драйвером, теперь изучаю вождение с автоматическим. Я могу даже сейчас работать с экскаваторами, довольно опытно (я вырыл яму для дома, который я строю).

То же самое с Java. Вы разрешаете Netbeans или Eclipse строить для вас всю структуру веб-приложений, а затем проверяете структуру. Играйте с муравейником. Учитесь у IDE, обманывая его.

Я знаю, что некоторые люди считают, что без IDE вы подвергнете себя процессу сырой компиляции и, следовательно, получите «более глубокое» понимание процесса сборки. ДЕЙСТВИТЕЛЬНО? Не тратьте свое время. Пусть IDE сделает это за вас. Вы быстрее узнаете процесс сборки, если хотите проверить файлы и структуру, созданные в среде IDE.

+0

Я попытался использовать netbeans, но он не поддерживает сервер, который я установил, tomcat 7.0 (только 6.0 был опцией). Вы рекомендуете установить Tomcat 6.0 и использовать netbeans? –

+0

Я думаю, что «глубже» - слишком большое слово, но способность компилировать два родственных класса вручную и понимание инфраструктуры classpath/sourcepath/package/directory/jar должно быть предварительным условием. Это займет не более 2-3 часов, чтобы пройти этот этап и намного проще без IDE. Я осмеливаюсь, чтобы кто-нибудь получил базовое понимание структуры веб-приложения, посмотрев на скрипт мультика nbproject/build-private.xml, созданный netbeans :-) – fdreger

+0

Использование Tomcat 6. Tomcat 7 слишком шлепает новое. –

0

Выполнить это в вашей папке классов:

javac -cp /usr/local/tomcat/webapps/myProjectName/WEB-INF/classes *.java 

Вам необходимо включить во время пути к классам компиляции.

+0

По-прежнему не найдена ошибка. –

+0

Вы должны добавить ~/WEB-INF/classes в -cp. Не так ли? – duffymo

+1

Можете ли вы вставить выходные данные из javac с флагом -verbose? – Zeki

0

У вас не должно быть .java исходных файлов в любом месте в WEB-INF. Храните компиляцию и упаковку отдельно.

0

Есть некоторые другие ошибки, кроме не узнавая классов, но когда дело доходит до вашего вопроса:

  • ничего к классам не добавить, что это не имеет значения,
  • не изменять настройки системы, они не имеют значения,
  • не беспокоиться об упаковке пока еще - вы все еще изучаете основы,
  • не используйте строку Javac Zeki, она не будет работать (* .java будет только компилировать файлы в классах/каталог, и вы хотите скомпилировать классы под mypackage).

И самое главное: не думайте, что это сложно или что для этого требуется сложная настройка. Это очень просто, и очень важно, чтобы вы сразу начали изучать Java.

Когда javac компилирует класс и обнаруживает, что он использует какой-либо другой класс, он ищет его в двух местах, называемых classpath (для скомпилированной версии) и sourcepath (для источников). Оба они по умолчанию включают текущий рабочий каталог. Обратите внимание, что это не то же самое, что каталог, содержащий файл .java.

Точное расположение файла .java или .class внутри пути к классам всегда зависит от пакета (но вы уже это знали). В вашем случае, если вы:

cd WEB-INF/classes/mypackage 
javac class1.java 

ваш SourcePath является WEB-INF/классы/MyPackage, необходимое класс mypackage.class2, поэтому, вопреки интуиции, Javac будет искать файл WEB-INF/классы/MyPackage/MyPackage/class2.java. Такой файл не существует, и вы получаете сообщение об ошибке.

С другой стороны, представьте себе:

cd WEB-INF/classes 
javac mypackage/class1.java 

теперь ваш SourcePath является WEB-INF/классы, необходимое класс mypackage.class2, Javac будет искать файл WEB-INF/классы/MyPackage/class2 .java - и он найдет его без проблем.

Мораль: при компиляции всегда пишите javac в верхнем каталоге ваших источников, прежде всего пакетов. Таким образом, ваши пакеты совпадают с каталогами, как видно из javac, и компиляция безупречна.

После того, как вам удалось точно понять все происходящее, обязательно переключитесь на Netbeans (и в параллельной нити узнайте муравей, а затем maven). Он устанавливает свою собственную копию tomcat 6, которую вы можете использовать для разработки вашего приложения; tomcat 7 совместим с нисходящим потоком, поэтому установка вашего приложения будет именно вопросом копирования файла войны (построенного netbeans) на ваш tomcat 7 webapps.

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