Я не уверен, что это подходящее место, чтобы спросить об этом, но я все равно продолжу! Я пытаюсь развернуть JAR, созданный с помощью maven, в папку Tomcat / lib. Проблема, с которой я столкнулся, заключается в том, что все JAR пути к классам для JAR, который я создал, не читаются. Поэтому мне также нужно явно добавить эти JAR в папку Tomcat lib. Это ожидаемое поведение 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
с.
Если я не ошибаюсь, вы пытаетесь использовать Maven зависимость плагин для копирования всех jar-файлов зависимостей в ваш jar-файл. Конфигурация банки внутри банки не будет работать, если вы не используете пользовательский загрузчик классов. Единственный заметный эффект, который вы получаете, - это файл jar большего размера.
Когда вы строите банка project, вам не нужно беспокоиться о развертывании зависимостей, просто укажите их в файле POM. Тяжелая работа по их сбору должна выполняться в веб-приложении. ВОЙНА проект.
Tomcat имеет сложная иерархия загрузчиков классов, что позволяет каждому веб-приложению использовать разные версии одной и той же библиотеки. В стандартной комплектации (ср. catalina.properties
):
${catalina.base}/lib
и ${catalina.home}/lib
папки (которые по умолчанию равны lib
папку вашей установки Tomcat) загружаются общий загрузчик классов.WEB-INF/classes
и банки в WEB-INF/lib
папка (или ВОЙНА archive) загружаются загрузчиком классов веб-приложения.Как правило, вы не должны помещать какую-либо новую библиотеку в путь к классам общего загрузчика классов, поскольку это администрируется администратором сервера Tomcat, а не разработчиком Java. В качестве исключения вы можете предположить, что lib
папка содержит:
Вы должны поместить все зависимости в WEB-INF/lib
папка вашего ВОЙНА архив. Maven's плагин зависимости могу вам в этом помочь.