java – 如何将依赖项的测试jar包含到Maven项目的部署中?

我有两个项目,foo和foo-web在com.example组下。 foo-web依赖于foo。

为了能够在不依赖于外部服务的情况下开发应用程序的UI部分,虚拟DAO在foo中实现(它们返回静态数据,所以我们不必连接到数据库等)。

我们需要将虚拟类移动到src / test / java。这意味着它们不会被部署到从web项目构建的war的foo.jar。我在maven网站上发现了these instructions,但他们似乎不适合我。

在foo的pom.xml我有:

        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <executions>
            <execution>
              <id>test-jar</id>
              <phase>test-compile</phase>
              <goals>
                <goal>test-jar</goal>
              </goals>
            </execution>
          </executions>
        </plugin>

当在foo-web上运行mvn install时,在foo的目标中,我会得到两个jar:foo-1.0.0-SNAPSHOT.jar和foo-1.0.0-SNAPSHOT-tests.jar。它们都在本地Maven存储库中安装得很好。

之前,foo-web依赖关系看起来像这样:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>foo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

这将在战争中触发foo-1.0.0-SNAPSHOT.jar的部署。现在,我还要部署测试jar,最好只为一个“本地”配置文件。

我尝试了各种方式来做到这一点:

<profile>
    <id>local</id>
    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>foo</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <type>test-jar</type>
        </dependency>
    </dependencies>
</profile>

这会导致以不同的名称部署源jar:com.example-foo.jar,并且不部署测试jar。我也尝试使用< classifier>而不是< type>在依赖,但它仍然是相同的。我尝试使用上述依赖关系外的配置文件(旁边的),但它仍然表现相同。

如果我添加< type>到主依赖(没有添加其他依赖)我得到测试jar部署(与上面同名),但源,自然,没有得到部署。

与文档中编写的唯一区别是事实上没有为测试依赖关系指定范围。它只适用于测试范围吗?我可以以某种方式部署测试类不同。

我知道这个问题有点复杂,请让我知道,如果有一些我可以澄清。

谢谢!

更新:

我尝试了几种更多的方式,但它仍然不会工作。

我在foo项目(依赖项,而不是主要的web项目)中向maven-jar-plugin添加了另一个执行,我希望强制maven在同一个jar中编译测试类并引用大包由不同的分类器。我不能让它工作:

<execution>
  <id>local-build</id>
  <phase>package</phase>
  <goals>
    <goal>jar</goal>
  </goals>
  <configuration>
    <classifier>batman</classifier>
    <directory>${basedir}/src/test/java</directory> <!-- tried several variations here -->
    <includes>
        <include>**</include>
    </includes>
  </configuration>
</execution>

该jar是用batman分类器生成的,但是我找不到任何办法让它在jar目标中包含测试类。

这样做,我意识到这不依赖于测试jar类型/ tests classifier /测试范围关系。当我试图指定新的jar我正在建设除了主要的,我得到了相同的行为,当试图包括测试jar。我检查了本地Maven存储库,并且所有来自依赖项目的jar都得到了安装,所以问题是主项目的依赖解析。

tl; dr

一切归结到的问题,如果你可以包括多个分类器相同的依赖。从我到现在为止,答案是没有 – 我总是得到com.example-foo jar指定相同的依赖多次与不同的分类器。

最佳答案
更好地配置maven pom文件在您的第一个模块

<project>
    <groupId>com.example</groupId>
    <artifactId>foo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <build>
        <plugins>
            ...
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>test-jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

之后,mvn安装/发布也将部署工件foo-1.0.0-SNAPSHOT-tests.jar

然后使用分类器配置测试jar的依赖(像在其他响应中建议的)

<dependency>
    <groupId>com.example</groupId>
    <artifactId>foo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <type>test-jar</type>
    <!-- uncomment if needed in test scope only
         <scope>test</scope>
    -->
</dependency>

转载注明原文:java – 如何将依赖项的测试jar包含到Maven项目的部署中? - 代码日志