Назад | Перейти на главную страницу

Файлы JAR и путь к классам Tomcat Lib Folder

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

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

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

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

Когда вы строите банка project, вам не нужно беспокоиться о развертывании зависимостей, просто укажите их в файле POM. Тяжелая работа по их сбору должна выполняться в веб-приложении. ВОЙНА проект.

Путь к классам Tomcat

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

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

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

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

Вы должны поместить все зависимости в WEB-INF/lib папка вашего ВОЙНА архив. Maven's плагин зависимости могу вам в этом помочь.