Как добавить библиотеки JAR в проект WAR без обращения к java.lang.ClassNotFoundException? Classpath vs Build Path vs/WEB-INF/lib

Как добавить JAR-библиотеки в проект WAR в Eclipse, не обращаясь к java.lang.ClassNotFoundException или java.lang.NoClassDefFoundError?

Переменная среды CLASSPATH не работает. В некоторых случаях мы добавляем JAR файлы в свойство Build Path проекта Eclipse, чтобы скомпилировать код. Иногда нам нужно помещать файлы JAR в папку /WEB-INF/lib веб-приложения Java EE, чтобы код работал в классах внутри этого JAR.

Я не совсем понимаю, почему CLASSPATH не работает, и в каких случаях мы должны добавлять JAR для сборки Path и когда именно эти JAR следует поместить в /WEB-INF/lib.

Ответ 1

Переменная среды CLASSPATH используется только командой java.exe и даже тогда, когда используется без аргументов -cp, -classpath, -jar. Его игнорируют IDE, такие как Eclipse, Netbeans и IDEA. См. Также java.lang.ClassNotFoundException, несмотря на использование переменной среды CLASSPATH.

Путь сборки предназначен только для библиотек, которые необходимы для компиляции кода проекта. Ручное размещение JAR в /WEB-INF/lib или установка сборки развертывания или предоставление внешней системы сборки, такой как Maven, помещают <dependency> в JAR в /WEB-INF/lib выпущенной WAR во время сборки, только для библиотек, которые необходимы для получения кода для развертывания и запуска в целевой среде. Обратите внимание, что вы не должны создавать подпапки в /WEB-INF/lib. JAR должны быть помещены в корневой каталог.

Некоторые библиотеки уже предоставлены целевым сервером Java EE или сервлетконтейнером, таким как JSP, Servlet, EL и т.д. Поэтому вам не нужно размещать JAR этих библиотек в /WEB-INF/lib. Более того, это может вызвать проблемы с загрузкой. Это достаточно, чтобы (косвенно) указать их только в пути сборки. В Eclipse вы обычно это делаете, устанавливая соответственно целевое время выполнения. Он автоматически закончится в пути сборки. См. Также Как импортировать API javax.servlet в проект Eclipse?

Другие библиотеки, обычно сторонние, такие как Apache Commons, JDBC-драйверы и стандартные библиотеки, не предоставленные целевым сервером-сервлетом (например, Tomcat не поддерживает JSF, CDI, JPA, EJB и т.д.), нужно в конечном итоге в /WEB-INF/lib. Вам не обязательно указывать его в пути сборки. Только, возможно, когда у вас уже есть это как пользовательская библиотека, но для этого вы должны использовать настройку сборки развертывания. См. Также ClassNotFoundException при использовании пользовательских библиотек в пути сборки Eclipse.

Если вы используете Maven, вам нужно обязательно убедиться, что вы помечаете библиотеки как <scope>provided</scope>, если они уже предоставлены целевой средой выполнения, например Java EE, Servlet, EL и т.д., если вы развертываете в WildFly, TomEE и т.д. Таким образом, они не окажутся в /WEB-INF/lib произведенной WAR (и могут вызвать конфликты с библиотеками, связанными с серверами), но они попадут в Eclipse Build Path (и получите код проекта для компиляции).

Ответ 2

Эти JAR в пути сборки ссылаются только на процесс сборки (компиляции). Если вы экспортируете свое веб-приложение, они не включены в окончательную WAR (попробуйте).

Если вам нужны JAR во время выполнения, вы должны поместить их в WEB-INF/lib или путь к серверу. Размещение JAR в пути к классу серверов имеет смысл только в том случае, если несколько WAR совместно используют общую базу кода и, имеют необходимость доступа к общим объектам (например, Singleton).

Ответ 3

Если вы используете Maven:

Откройте свойства проекта и в разделе Развертывание развертывания нажмите Добавить...

Затем выберите Записи пути сборки Java и выберите Зависимости Maven

Ответ 4

Решено путем установки разрешений. Возникла проблема, связанная с использованием PySpark и Oracle jdbc. В сообщении об ошибке не указывается, что файл недоступен, просто класс не может быть загружен.

Так что, если кто-то все еще борется, проверьте разрешения. Некоторые могут найти это очевидным, хотя '

Ответ 5

Эта статья объясняет ту же проблему в приложении Spring Boot. Также полезная информация о том, как скачать JAR файл Oracle и включить зависимости, источник данных установки и т. Д.:

Настройка Spring Boot с Oracle

Ответ 6

Я хочу дать ответ на следующий вопрос ссылки ClassNotFoundException oracle.jdbc.driver.OracleDriver только в сервлет, используя Eclipse

Ans: В Myeclipse перейдите в Сервер → щелкните левой кнопкой мыши по Myeclipse Tomcat7 → Configure Connector сервера → (Развернуть) Myeclipse Tomcat7 → Пути → Подготовьте путь к классам → Добавить банку (добавить oracle14 jar) → ok