CLASSPATH, Java Buld Path (eclipse) и WEB-INF \ LIB: что использовать, когда и почему?

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

Во-первых, у нас есть КЛАСС. Я обычно устанавливаю это, заходя в «Переменные среды» внутри «Моего компьютера». Я знаю, что это место по умолчанию, где компилятор 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, а когда нужно делать что-то по-другому? Почему путь сборки Java Eclipse, похоже, не знает о папках в моей переменной среды CLASSPATH?

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

Спасибо.


person sangfroid    schedule 30.11.2009    source источник
comment
О, и еще один вопрос - если моему веб-приложению требуется определенный JAR, нужно ли мне добавить этот JAR в конфигурацию запуска, а также в путь сборки проекта? Всегда ли конфигурация запуска и путь сборки полностью разделяют друг друга или одно влияет на другое?   -  person sangfroid    schedule 30.11.2009
comment
(и да, предполагается, что я запускаю свой веб-проект из Eclipse)   -  person sangfroid    schedule 30.11.2009
comment
Как это сделать для страниц EAR / lib? stackoverflow.com/questions/29753457/ С уважением,   -  person Rodmar Conde    schedule 23.04.2015


Ответы (7)


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

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

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

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

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

person Carl Smotricz    schedule 30.11.2009
comment
Следует иметь в виду, что Eclipse распознает все jar из WEB-INF/lib, и нам не нужно добавлять их в путь сборки. Это нужно только тем, jar на другом пути. - person WesternGun; 19.10.2015

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

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

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

Например, «исполняемый jar» (который Eclipse называет «runnable jar»), который вызывается с помощью «java -jar foobar.jar», содержит полный путь к классам ВНУТРИ 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 и перезагрузить окно браузера, чтобы увидеть изменения.

person Thorbjørn Ravn Andersen    schedule 30.11.2009
comment
@SanderVerhagen Я не понимаю вашего комментария. Вопрос явно в контексте веб-контейнера (который обычно работает в Java SE). - person Thorbjørn Ravn Andersen; 06.09.2013
comment
@SanderVerhagen Нет. Вся поддержка всего, что связано с сервлетами и выше, находится в подключаемых модулях, предустановленных вместе с EE (которые вы можете установить из Marketplace для SE). В любом случае вы можете делать обычные WAR без EJB. - person Thorbjørn Ravn Andersen; 06.09.2013
comment
Самый простой способ начать работу с веб-приложением в наши дни - использовать пакет Netbeans + Glassfish. - person Thorbjørn Ravn Andersen; 16.04.2015

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

Ваша настоящая проблема, скорее всего, заключается в том, что у вас не было Eclipse для разработчиков Java EE и / или что вы только что создали общий проект Java вместо динамического веб-проекта и самостоятельно создали необходимую структуру папок.

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

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

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

person BalusC    schedule 30.11.2009

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

person Powerlord    schedule 30.11.2009

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

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

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

person Diego Dias    schedule 30.11.2009

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

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

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

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

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

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

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

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

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

person Michael    schedule 17.08.2011