Папки JAR Tomcat Lib и путь к классам

Я не уверен, что это правильное место, чтобы спросить об этом, но я все равно продолжу! Я пытаюсь развернуть 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?

0
задан 9 January 2020 в 13:56
1 ответ

Есть две причины, почему вы получаете ClassNotFoundExceptions и NoClassDefFoundErrors.

Баночку внутри jar-проекта

Если я не ошибаюсь, вы пытаетесь использовать плагин зависимости Maven dependency, чтобы скопировать все банки зависимостей в ваш jar-файл. Конфигурация jar внутри jar не будет работать, если вы не используете загрузчик пользовательского класса . Единственный заметный эффект, который вы получаете, это больший jar-файл.

Когда вы собираете проект jar, вам не нужно беспокоиться об установке зависимостей, просто перечислите их в POM-файле. Тяжелая работа по их сбору должна быть проделана в проекте веб-приложения WAR.

Tomcat's classpath

Tomcat имеет сложную иерархию загрузчиков классов, которая позволяет каждому веб-приложению использовать разные версии одной и той же библиотеки. В стандартной конфигурации (см. catalina.properties):

  1. Классы и банки внутри папок ${catalina.base}/lib и ${catalina.home}/lib (которые по умолчанию равны lib папке вашей установки Tomcat) загружаются общим класслоугрузчиком .
  2. Классы в WEB-INF/классы и банки в папке WEB-INF/lib (или WAR архив) загружаются загрузчиком классов веб-приложений.

Как правило, вы не должны помещать какую-либо новую библиотеку в общий класс загрузчика, так как это администрируется администратором сервера Tomcat, а не Java-разработчиком. В качестве исключения можно предположить, что папка lib содержит:

  • драйверы JDBC для SQL серверов, к которым Tomcat подключится,
  • баночки реализации для лог-фреймворков типа jcl, slf4j или log4j2.

Вы должны поместить все зависимости в папку WEB-INF/lib вашего архива WAR. В этом Вам поможет плагин зависимости Maven.

.
0
ответ дан 9 January 2020 в 23:27

Теги

Похожие вопросы