CLASSPATH, Java Buld Path (eclipse) и WEB-INF \ LIB: что использовать, когда и почему? - PullRequest
34 голосов
/ 30 ноября 2009

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

Во-первых, у нас есть 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 - цели, которые они служат, отношения между ними и то, куда я должен поместить свой Баночки в разных ситуациях. Буду признателен за любые советы, которые вы мне дадите, или за статьи, которые вы можете порекомендовать.

Спасибо.

Ответы [ 7 ]

30 голосов
/ 30 ноября 2009

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

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

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

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

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

11 голосов
/ 30 ноября 2009

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

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

Все было хорошо, тогда люди хотели написать материал для веб-сервера на Java. Servlet API был создан там, где веб-приложение является автономным модулем. В результате 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» на локальном сервере и нажмите «Готово».

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

4 голосов
/ 01 декабря 2009

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

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

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

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

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

3 голосов
/ 30 ноября 2009

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

2 голосов
/ 18 августа 2011

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

2 голосов
/ 30 ноября 2009

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

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

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

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

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

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

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

2 голосов
/ 30 ноября 2009

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

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

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

...