我不确定这里是否是提问的合适地方,但我还是会继续提问!我正在尝试将使用 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
):
${catalina.base}/lib
和${catalina.home}/lib
文件夹(默认情况下等于Tomcat 安装的文件夹)内的类和 jarlib
由常见的类加载器。- 文件夹中的类
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 文件的大小。