gpt4 book ai didi

java - Maven:在运行时使用测试 jar 时缺少依赖项

转载 作者:行者123 更新时间:2023-11-29 07:54:18 24 4
gpt4 key购买 nike

我的 Maven 项目 foo.web 的源文件在 src/main 中,测试源文件在 src/test 中。当然,测试类使用“主”类。现在我想在运行时使用另一个项目中的测试类,所以我遵循了 these instructions关于如何创建测试 jar 。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>

这非常有效,创建了一个类似 web-SNAPSHOT-tests.jar 的 jar,我可以将它包含在我的其他项目中。

<dependency>
<groupId>foo</groupId>
<artifactId>web</artifactId>
<version>SNAPSHOT</version>
<type>test-jar</type>
</dependency>

但似乎对 web-SNAPSHOT 的依赖性设置不正确,因为在运行时我收到了在 foo.web 中可用的类的 NoClassDefFoundErrors。所以我添加了另一个依赖项:

<dependency>
<groupId>foo</groupId>
<artifactId>web</artifactId>
<version>SNAPSHOT</version>
<type>war</type>
<scope>runtime</scope>
</dependency>

不幸的是,这没有任何改变。有谁知道这里出了什么问题?

最佳答案

WAR 文件的结构与 JAR 不同。当运行在Tomcat或JBoss等应用服务器中时,服务器会正​​确处理WAR。由于您在服务器外部运行,因此 Artifact 将像普通的 JAR 存档一样使用。因为 WAR 对 .class 文件使用不同的位置,所以在运行时抛出 NoClassDefFoundError

在 JAR 中,类 com.example.Foo 将存储在 /com/example/Foo.class 中。由于 WAR 旨在包含库、资源等,因此类不应相对于存档的根目录进行存储。相反,它们包含在文件夹 /WEB-INF/classes 中,Foo 将存储为 /WEB-INF/classes/com/example/Foo。类

幸运的是,Maven 开发人员想到了这个问题并添加了 attachClasses WAR 插件的选项。此选项使用 classes 分类器创建一个额外的 JAR,该分类器仅包含 JAR 格式的 Java 类(相对于存档根目录)。

要启用此 JAR 的构建,您可以在 WAR 项目的 build 部分中使用此片段(除了 maven-jar-plugin 的配置以构建测试 JAR):

<pluginManagement>
<plugins>
<!-- … -->

<plugin>
<!-- build the classes JAR (non-test classes) -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<attachClasses>true</attachClasses>
</configuration>
</plugin>
</plugins>
</pluginManagement>

<plugins>
<!-- … -->

<plugin>
<!-- build the test JAR (test classes) -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>

由于这些类是附加,它们将由 Maven 与 WAR Artifact 一起安装和部署。请注意,这只为您提供常规 WAR 存档的内容,要使用测试类,您需要同时依赖类 Artifact 和测试 jar。为此,您可以使用:

<dependencies>
<!-- … -->

<dependency>
<!-- test classes only -->
<groupId>foo</groupId>
<artifactId>web</artifactId>
<version>SNAPSHOT</version>
<type>test-jar</type>
</dependency>

<dependency>
<!-- non-test classes only -->
<groupId>foo</groupId>
<artifactId>web</artifactId>
<version>SNAPSHOT</version>
<type>jar</type>
<classifier>classes</classifier>
<scope>runtime</scope>
</dependency>
</dependencies>

关于java - Maven:在运行时使用测试 jar 时缺少依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18869257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com