Tomcat Lib 文件夹 JAR 和 Classpath

Tomcat Lib 文件夹 JAR 和 Classpath

我不确定这里是否是提问的合适地方,但我还是会继续提问!我正在尝试将使用 maven 构建的 JAR 部署到 Tomcat/lib 文件夹中。我遇到的问题是,我构建的 JAR 的所有类路径 JAR 都没有被读取。因此,我必须将这些 JAR 明确添加到 Tomcat 的 lib 文件夹中。这是 Tomcat 的预期行为吗?还是我对 Maven 构建/插件做了什么错误?我的 JAR 和类路径插件的完成方式如下:

<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放入Tomcat的lib文件夹中。

对于 Tomcat 来说这正常吗?

答案1

ClassNotFoundException您获得s 和s 的原因有两个NoClassDefFoundError

jar 中 jar 项目

如果我没记错的话,你正在尝试使用 Maven依赖性插件将所有依赖项 jar 复制到您的 jar 文件中。除非您使用自定义类加载器。您得到的唯一明显影响是 jar 文件变得更大了。

当你正在构建项目,您无需担心部署依赖项,只需将它们列在 POM 文件中即可。收集它们的艰苦工作应该在 Web 应用程序中完成战争项目。

Tomcat 的类路径

Tomcat 有一个复杂的类加载器层次结构,它允许每个 Web 应用程序使用同一库的不同版本。在标准配置中(参见catalina.properties):

  1. ${catalina.base}/lib${catalina.home}/lib文件夹(默认情况下等于Tomcat 安装的文件夹)内的类和 jarlib常见的类加载器。
  2. 文件夹中的类WEB-INF/classes和 jar文件WEB-INF/lib(或战争类库(例如,存档)由 Web 应用程序类加载器加载。

通常,您不应将任何新库放入通用类加载器的类路径中,因为这是由 Tomcat 服务器管理员而不是 Java 开发人员管理的。作为例外,您可以假设该lib文件夹包含:

  • Tomcat 将连接到的 SQL 服务器的 JDBC 驱动程序,
  • 日志框架的实现 jar 文件如下杰克莱slf4j或者log4j2

你应该把所有的依赖项放在WEB-INF/lib你的文件夹中战争档案。Maven 的依赖插件可以帮助你。

答案2

@piotr-p-karwasz 你有什么想法吗https://stackoverflow.com/questions/76024606/how-to-create-a-jar-of-jars- including-only-required-3rd-party-libraries-outside

具体来说,对于 90% 的代码都是第三方依赖项且很少更改的项目,至少与​​应用程序代码相比。在 sprint/agile 过程中,我们经常每天部署多次,这意味着现有的 war 文件非常臃肿,包含自上次部署以来没有更改的代码。我想看看是否有人有在应用程序 war 文件之外管理第三方依赖项的经验,而是将它们发布到 ~catalina/lib、~catalina/third-party-lib,以便它们在该主机上的所有应用程序中共享,并大大减少 war 文件的大小。

相关内容