Как добавить библиотеки 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-файлы в Build Path и когда именно эти JAR-файлы должны быть помещены в /WEB-INF/lib
,
4 ответа
CLASSPATH
Переменная окружения используется только java.exe
команда и даже тогда только при использовании без какого-либо из -cp
, -classpath
, -jar
аргументы. Он игнорируется такими средами разработки, как Eclipse, Netbeans и IDEA. См. Также java.lang.ClassNotFoundException, несмотря на использование переменной среды CLASSPATH.
Путь сборки предназначен только для библиотек, которые необходимы для компиляции кода проекта. Размещение JAR вручную /WEB-INF/lib
или настройка сборки развертывания, или разрешение внешней системе сборки, такой как Maven, разместить <dependency>
как баночка в /WEB-INF/lib
созданного WAR во время сборки, предназначен только для библиотек, которые должны получить код для развертывания и запуска в целевой среде. Обратите внимание, что вы не должны создавать подпапки в /WEB-INF/lib
, JAR должны быть размещены в корне.
Некоторые библиотеки уже предоставлены целевым сервером Java EE или контейнером сервлетов, таким как JSP, Servlet, EL и т. Д. Поэтому вам не нужно помещать JAR-файлы этих библиотек в /WEB-INF/lib
, Более того, это только вызовет проблемы с загрузкой классов. Достаточно (косвенно) указать их только в пути сборки. В Eclipse вы обычно делаете это, устанавливая Targeted Runtime соответственно. Он автоматически попадет в Build Path. См. Также Как импортировать API javax.servlet в мой проект Eclipse?
Другие библиотеки, обычно сторонние, такие как Apache Commons, драйверы JDBC и стандартные библиотеки, не предоставляемые целевым сервлет-контейнером (например, Tomcat не поддерживает из коробки JSF, CDI, JPA, EJB и т. Д.), Должны оказаться в /WEB-INF/lib
, Вам не обязательно указывать его в Build Path. Возможно, только когда у вас уже есть библиотека пользователя, но вам следует использовать для этого параметр сборки развертывания. Смотрите также ClassNotFoundException при использовании пользовательских библиотек в пути сборки Eclipse.
Если вы используете Maven, вам нужно быть абсолютно уверенным, что вы пометили библиотеки как <scope>provided</scope>
если они уже предоставлены целевой средой выполнения, такой как Java EE, Servlet, EL и т. д., если вы развертываете в WildFly, TomEE и т. д. Таким образом, они не окажутся в /WEB-INF/lib
созданного WAR (и потенциально может привести к конфликтам с библиотеками, входящими в комплект поставки сервера), но они окажутся в пути сборки Eclipse (и получат код проекта для компиляции).
Эти JAR-файлы в пути сборки упоминаются только для процесса сборки (компиляции). Если вы экспортируете свое веб-приложение, оно не будет включено в окончательный вариант WAR (попробуйте).
Если вам нужны JAR-файлы во время выполнения, вы должны поместить их в WEB-INF/lib или в classpath сервера. Размещение ваших JAR-файлов в пути к классам сервера имеет смысл, только если несколько WAR-файлов имеют общую базу кода и нуждаются в доступе к общим объектам (например, Singleton).
Решено установкой разрешений. Возникла связанная проблема с использованием PySpark и Oracle jdbc. Ошибка не говорит о том, что к файлу нельзя получить доступ, а просто о том, что класс не может быть загружен.
Так что, если кто-то все еще борется, проверьте разрешения. Некоторым это может показаться очевидным.
Если вы используете Maven:
Откройте свойства проекта и в разделе " Сборка развертывания" нажмите "Добавить".
Затем выберите Java Build Path Entries и выберите Maven Dependencies
Я хочу дать ответ на следующий вопрос о ссылке ClassNotFoundException oracle.jdbc.driver.OracleDriver только в сервлете, используя Eclipse
Ответ: В Myeclipse перейдите на Сервер -> щелкните левой кнопкой мыши на Myeclipse Tomcat7-> Настроить коннектор сервера ->(Развернуть)Myeclipse Tomcat7-> Пути -> Добавить к classpath -> Добавить jar (добавить oracle14 jar)--> оК
В этой статье объясняется та же проблема в приложении Spring Boot. Также полезная информация о том, как загрузить файл Oracle jar и включить зависимости, настроить источник данных и т. Д.: