2009-11-30 2 views
34

Недавно я переключился на J2EE с .NET, и я смущен тем, где положить файлы JAR. Я знаю, что Java-путь CLASSPATH, WEB-INF и Eclipse - это все места, где JAR можно хранить, но я смущен о том, какую папку использовать, когда и почему.CLASSPATH, Java Buld Path (eclipse) и WEB-INF LIB: что использовать, когда и почему?

Прежде всего, у нас есть CLASSPATH. Обычно я устанавливаю это, перейдя в «Переменные среды» внутри «Мой компьютер». Я знаю, что это место по умолчанию, где компилятор Java ищет файлы JAR. Когда я добавляю папку или JAR в переменную среды CLASSPATH, почему она игнорируется Eclipse, компилятором Java и веб-сервером?

Кроме того, я знаю, что WEB-INF \ LIB - это место, где вы можете поместить файлы JAR, которые будет использовать ваше веб-приложение. Тем не менее, я поставил JAR в WEB-INF \ LIB только для того, чтобы их игнорировать. В каких ситуациях я должен помещать JAR в папку WEB-INF \ LIB? Как заставить Eclipse или веб-сервер их замечать?

Пока что единственное, что работает для меня, - это фактически изменить путь сборки Java для проекта Eclipse. Я выберу нужные JAR и нажмите «Добавить внешние JAR». В большинстве случаев, когда я это делаю, Eclipse узнает мои JAR и читает классы в нем. Тем не менее, я столкнулся с кучей странных случайных ошибок, делая это (в основном, полагаю, что это зависит от зависимостей). По какой-то причине я просто чувствую, что это неправильный способ делать что-то, и что мне не хватает какой-то важной информации. Когда я должен вручную добавлять внешние JAR внутри Eclipse, и когда я должен делать что-то по-другому? Каким образом Eclipse Java Build Path, похоже, не знает о папках в моей переменной среды CLASSPATH?

Действительно, я хотел бы получить лучшее представление о CLASSPATH, пути построения Java Eclipse и папке WEB-INF/LIB - о целях, которые они обслуживают, о взаимоотношениях между ними и о том, где я должен помещать мои JAR в разных ситуациях. Я был бы признателен за любые советы, которые вы могли бы мне дать, или любые статьи, которые вы могли бы порекомендовать.

спасибо.

+0

О, и еще один вопрос - если моему веб-приложению требуется определенный JAR, мне нужно добавить этот JAR в конфигурацию запуска как а также путь сборки проекта? Являются ли прогон конфигурации и путь сборки всегда полностью разделяющими вещи или когда-либо влияют на другие? – sangfroid

+0

(и да, предполагается, что я запускаю свой веб-проект из Eclipse) – sangfroid

+0

Как мы можем это сделать для страниц EAR/lib? http://stackoverflow.com/questions/29753457/jasper-reports-package-net-sf-jasperreports-engine-does-not-exist-exception-in С уважением, –

ответ

30

CLASSPATH, установленный в вашей среде, влияет только на автономные приложения Java, то есть на то, что вы запускаете из командной строки или значка. Как вы заметили, Eclipse игнорирует это. Он устанавливает свои собственные пути для каждого проекта.

javac и java, если они вызваны из командной строки, должны/должны соблюдать этот путь, но это уже не считается большой практикой. Оказалось, что каждое приложение нуждается в собственном наборе вещей, поэтому глобальный CLASSPATH на самом деле не делает ничего хорошего. Современной практикой является просто указать путь к классу с опцией -cp в командной строке для javac или java.

Автономный сервер веб-приложений также создаст свой собственный путь к классам. Из командной строки или графического интерфейса WebAppServers обычно запускаются скриптом (.BAT или .sh), который устанавливает путь к классам с использованием -cp. У Tomcat есть каталог с именем common или common/lib, где он ожидает увидеть библиотеки, которые должны быть доступны для сервера и всех запущенных под ним программ. Но вам, как правило, не нужно/не нужно связываться с этим, так как обычные приложения для предоставления своих библиотечных коллекций в WEB-INF/lib.

Итак, для веб-приложения вы поместили свои varous jars в каталог lib под WEB-INF, предполагая, что Eclipse предварительно создает такую ​​структуру каталогов для вас.

Все необходимые вам библиотеки также должны быть известны Eclipse. В Проводнике проектов я выбираю все их количество сразу, щелкните правой кнопкой мыши и выберите Build Path | add to build path. Это проще, чем рушиться по пути создания проекта Eclipse вручную.

+1

Следует иметь в виду, что Eclipse распознает все 'jar' под' WEB-INF/lib', и нам не нужно добавлять их в путь сборки. Это необходимо только для этих «jar» на другом пути. – FaithReaper

2

Если вы имеете дело с веб-приложениями,/WEB-INF/lib является переносным местом для размещения JAR. Здесь веб-серверы контейнеры сервлетов ожидают найти файлы jar приложения.

2

Eclipse требует указать путь к вашим библиотекам, jar-файлам (по вкладке Свойства -> Путь сборки Java -> Библиотеки). Это можно найти в файле проекта .classpath.

Обычно у вас есть JRE libs на его пути (который тоже будет на вашем пути к классу), поэтому добавление библиотек в путь к классам и обновление пути сборки eclipse будут работать.

Каталог WEB-INF должен быть местом, которое содержит необходимую информацию для вашего веб-приложения.

2

Я не эксперт Затмение, но я думаю, что ваша проблема может ответить так:

1) CLASSPATH является переменной среды, которая считывается при запуске программы Java и используется загрузчиком классов для выяснить, где находятся классы.

Я бы изменил переменную CLASSPATH только в том случае, если вы запускаете java-программу из сценария, так как это позволяет вам удобно запускать программу и следить за тем, чтобы классы были найдены. Это не будет иметь место для вас, поскольку вы разрабатываете веб-приложение.

2) WEB-INF/lib - это каталог, в котором рассматривается загрузчик классов контейнера веб-приложения (например, tomcat или glassfish), если вашему веб-приложению необходимо разрешить класс. Поэтому вы помещаете туда классы, которые используются в вашем веб-приложении.

Некоторые IDE включают файлы библиотек/.jar, которые вы используете в проекте, автоматически в пакет.

3) Библиотека Eclipse/classpath, разрешающая во время разработки. Я бы предположил, но приношу извинения за то, что вы предпочли, поскольку это действительно не нужно делать;), что вы можете определить библиотеку (добавить внешние .jar-файлы в проекты) и автозаполнение/все другие интересные функции должны начать работать с этим, так как вы в основном делаете эти классы видимыми для среды IDE с этим действием. Я также предполагаю, что вы можете затем пометить те библиотеки, которые будут автоматически добавлены в веб-проекты и т. Д., С помощью среды IDE.

В целом хорошее чтение о том, как классы находятся во время исполнения, - here (это официальная документация солнца). Также хорошим местом для чтения является документация класса ClassLoader.

+0

(1) Нет, Eclipse хочет, чтобы библиотеки, явно полученные через путь построения проекта. (2) Документация загрузчика классов Sun является авторитетной, полной и учебной, но когда дело доходит до работы в среде IDE, это полезно только в качестве справочной информации. Eclipse, много работает для абстрагирования этих вопросов для пользователя; в целом полезный, это может ввести в заблуждение для новичков. –

11

Java имеет долгую историю, и опыт показал, что некоторые идеи были хорошими, а некоторые были плохими.

Переменная среды CLASSPATH была начальным способом рассказать машине Java, где можно найти классы из вашей программы и хорошо работает для программ командной строки. Было быстро установлено, что это не должно быть глобальным (как правило, в конечном итоге все испортить), но и для каждой программы. Это можно сделать, создав сценарий оболочки/BAT-файл, который устанавливает переменную и запускает машину Java.

Все было хорошо, тогда люди захотели написать материал веб-сервера на Java.API-интерфейс Servlet был создан, когда веб-приложение является автономным блоком - это привело к тому, что CLASSPATH для для каждого веб-приложения является распакованными файлами под WEB-INF/classes плюс jar-файлы в разделе WEB-INF/Lib. И только это. Это означает, что глобальная переменная CLASSPATH игнорируется. Обнаружено, что это ОЧЕНЬ хорошая вещь, поэтому концепция перенесена в другое место.

Например, «исполняемый jar» (который Eclipse вызывает «runnable jar»), который вызывается с помощью «java -jar foobar.jar», содержит полный путь к классам INSIDE Jar в специальном файле манифеста. Java Web Start, который используется для запуска Java-программ с веб-сервера, явно содержит полный путь к классам в файле конфигурации на сервере.

Но, чтобы вы начали. Если вы хотите, чтобы написать веб-приложение на Java:

  1. Получить Eclipse, Java EE версию.
  2. Создайте новый динамический веб-проект, например. названный foobar.
  3. Перетащите (или скопируйте/вставьте) файлы jar, необходимые в foobar/WebContent/WEB-INF/lib
  4. Создайте новый файл с именем foobar/WebContent/index.jsp. В пустом файле введите <h1>Hello World <%= new java.util.Date() %></h1>
  5. Щелкните правой кнопкой мыши в редакторе index.jsp, выберите «Выполнить» -> «Выполнить на сервере» и выберите «Предварительный просмотр» -> J2EE на сервере localhost и «Готово».

Теперь откроется окно браузера, либо в браузере, либо внутри Eclipse, который отобразит вашу JSP-страницу. Вы можете изменить JSP-страницу, сохранить ее с помощью Ctrl-S и перезагрузить окно браузера, чтобы увидеть изменения.

+0

@SanderVerhagen Я не понимаю вашего комментария. Вопрос явно в контексте веб-контейнера (который обычно выполняется в Java SE). –

+0

@SanderVerhagen No. Вся поддержка чего-либо, связанного с сервлетами и выше, находится в плагинах, которые предварительно установлены с помощью EE (которую вы можете установить из Marketplace для SE). В любом случае вы можете делать обычные WAR без EJB. –

+0

Самый простой способ начать работу с веб-приложением в эти дни - использовать пакет Netbeans + Glassfish. –

4

Кроме того, я знаю, что WEB-INF \ LIB - это место, где вы можете поместить файлы JAR, которые будет использовать ваше веб-приложение. Тем не менее, я поставил JAR в WEB-INF \ LIB только для того, чтобы их игнорировать. В каких ситуациях я должен помещать JAR в папку WEB-INF \ LIB? Как заставить Eclipse или веб-сервер их замечать?

реальная проблема у вас есть здесь, вероятно, что вы не получили Eclipse for Java EE developers и/или что вы только что создали общий Проект Java вместо Dynamic Web Project и создали нужную папку структурируйте себя.

При создании Dynamic Web Project в Eclipse, для разработчиков Java EE, то Eclipse, будет автоматически добавлять библиотеки в WEB-INF/lib на пути сборки. Путь сборки примерно указан как путь к классам, который использовался как в режиме компиляции, так и во время выполнения. Другими словами: просто отбросьте сторонние JAR там, на самом деле ничего больше не нужно делать.

Обратите внимание, что Java чувствителен к регистру, поэтому его следует называть WEB-INF/lib, а не WEB-INF/LIB. Но в любом случае, если вы создадите динамический веб-проект , тогда Eclipse просто автоматически создаст правильную структуру папок/файлов для вас.

Как сказано другими, игнорируйте переменную окружения %CLASSPATH%. Это только используется javac.exe/java.exe и даже тогда только когда вы не указать какой-либо из -cp, -classpath или - jar аргументов. В реальном мире эта переменная среды редко используется, это просто удобство для начинающих (и, к сожалению, самое запутанное, они никогда не должны были ее изобретать).

2

Взятые вместе комментарии также помогли мне. Я добавил все jena .jars в путь сборки из затмения, но этого было недостаточно. Следующее предложение «добавить в WEB-INF/lib» казалось интуитивным перетаскивать из библиотеки папку в WEB-INF (изнутри eclipse), но это не сработало. Не копировало .jars в WEB-INF. Я в конечном итоге перетащил с рабочего стола Windows в папку WEB-INF lib в Eclipse и устранил проблему. Было бы неплохо, если бы любые .jars, добавленные в путь сборки, автоматически копировались в WEB-INF lib by Eclipse. В случае, если это имеет значение, это был eclipse EE IDE, выпуск Indigo, на окнах 7.