Подтвердить что ты не робот

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

Недавно я переключился на 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, Eclipse Java Build Path и папку WEB-INF/LIB - цели, которые они обслуживают, отношения между ними и где я должен ставить свои JAR в различных ситуациях. Я был бы признателен за любые советы, которые вы могли бы мне дать, или любые статьи, которые вы могли бы порекомендовать.

Спасибо.

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Переменная среды CLASSPATH была первоначальным способом сказать машине Java, где можно найти классы из вашей программы и хорошо работает для программ командной строки. Было быстро установлено, что это не должно быть глобальным (как правило, в конечном итоге все испортить), но и для каждой программы. Это можно сделать, создав оболочку script/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:

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

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

Ответ 3

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

Проблема с реальной, которую вы здесь имеете, скорее всего, вы не получили Eclipse для Java EE разработчики и/или что вы только что создали общий проект 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. В реальном мире эта переменная среды редко используется, это просто удобство для начинающих (и, к сожалению, самое запутанное, они никогда не должны были ее изобретать).

Ответ 4

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

Ответ 5

Eclipse требует указать путь к вашим библиотекам, файлам jar (вкладка "Свойства → Java Build Path → Libraries" ). Это можно найти в файле проекта .classpath.

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

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

Ответ 6

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

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

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

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

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

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

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

Ответ 7

Взятые вместе комментарии мне тоже помогли. Я добавил все 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.