Я не уверен, что это правильное место, чтобы спросить об этом, но я все равно продолжу! Я пытаюсь развернуть JAR, который я создал с помощью maven, в папку Tomcat / lib. У меня проблема в том, что все JAR-файлы classpath для JAR, которые я создал, не читаются. Поэтому мне нужно явно добавить эти JAR-файлы в папку lib Tomcat. Это ожидаемое поведение для Tomcat? Или я что-то не так делаю со сборкой / плагинами Maven? Мои плагины JAR и classpath выполняются следующим образом:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<inherited>true</inherited>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<addDefaultEntries>true</addDefaultEntries>
<addBuildEnvironmentEntries>true</addBuildEnvironmentEntries>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
<attachClasses>true</attachClasses>
<includeEmptyDirectories>true</includeEmptyDirectories>
<outputDirectory>${project.basedir}\target</outputDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<inherited>false</inherited>
<executions>
<execution>
<id>pal-copy-dependencies</id>
<phase>generate-sources</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<inherited>false</inherited>
<configuration>
<excludeScope>provided</excludeScope>
<excludeClassifiers>shared</excludeClassifiers>
<excludeTransitive>true</excludeTransitive>
<outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
<overWriteIfNewer>true</overWriteIfNewer>
<silent>true</silent>
<useBaseVersion>false</useBaseVersion>
</configuration>
</execution>
</executions>
</plugin>
Например, если у меня есть зависимость:
<dependency>
<groupId>org.jasypt</groupId>
<artifactId>jasypt</artifactId>
<version>1.9.3</version>
</dependency>
Я получаю сообщение об ошибке:
09-Jan-2020 16:33:40.347 SEVERE [main] org.apache.catalina.core.ApplicationContext.log Servlet.init() for servlet [InitialiseDAC] threw exception
java.lang.NoClassDefFoundError: org/jasypt/util/text/AES256TextEncryptor
at com.provisioning.common.crypto.Decrypt.doDecrypt(Decrypt.java:192)
Это работает только тогда, когда я создаю зависимость, например:
<dependency>
<groupId>org.jasypt</groupId>
<artifactId>jasypt</artifactId>
<version>1.9.3</version>
<scope>provided</scope>
</dependency>
и помещаю jasypt.jar в папку lib Tomcat.
Это нормально для Tomcat?
Есть две причины, почему вы получаете ClassNotFoundException
s и NoClassDefFoundError
s.
Если я не ошибаюсь, вы пытаетесь использовать плагин зависимости Maven dependency, чтобы скопировать все банки зависимостей в ваш jar-файл. Конфигурация jar внутри jar не будет работать, если вы не используете загрузчик пользовательского класса . Единственный заметный эффект, который вы получаете, это больший jar-файл.
Когда вы собираете проект jar, вам не нужно беспокоиться об установке зависимостей, просто перечислите их в POM-файле. Тяжелая работа по их сбору должна быть проделана в проекте веб-приложения WAR.
Tomcat имеет сложную иерархию загрузчиков классов, которая позволяет каждому веб-приложению использовать разные версии одной и той же библиотеки. В стандартной конфигурации (см. catalina.properties
):
${catalina.base}/lib
и ${catalina.home}/lib
(которые по умолчанию равны lib
папке вашей установки Tomcat) загружаются общим класслоугрузчиком . WEB-INF/классы
и банки в папке WEB-INF/lib
(или WAR архив) загружаются загрузчиком классов веб-приложений.Как правило, вы не должны помещать какую-либо новую библиотеку в общий класс загрузчика, так как это администрируется администратором сервера Tomcat, а не Java-разработчиком. В качестве исключения можно предположить, что папка lib
содержит:
Вы должны поместить все зависимости в папку WEB-INF/lib
вашего архива WAR. В этом Вам поможет плагин зависимости Maven.