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

2022-09-01 01:04:06

我有两个项目,在小组下。 取决于。foofoo-webcom.examplefoo-webfoo

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

我们被要求将虚拟类移动到 。这意味着它们不会部署到从Web项目构建的战争中。我在maven网站上找到了这些说明,但它们似乎不适合我。src/test/javafoo.jar

在 's 我有:foopom.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>

当运行时,在目标中我会得到两个 jar:和 。它们都可以在本地 maven 存储库中正确安装。mvn installfoo-webfoofoo-1.0.0-SNAPSHOT.jarfoo-1.0.0-SNAPSHOT-tests.jar

以前,依赖项如下所示:foo-web

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

这将触发在战争中的部署。现在,我还想部署jar,最好只用于“本地”配置文件。foo-1.0.0-SNAPSHOT.jar-tests

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

<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 使用不同的名称进行部署:并且不会部署测试 jar。我也尝试过使用而不是在依赖项中使用,但它仍然做同样的事情。我尝试在配置文件之外(与其他依赖项一起)使用上述依赖项,但其行为仍然相同。com.example-foo.jar<classifier><type>

如果我将 添加到主依赖项(不添加其他依赖项),我会部署测试 jar(与上面同名),但源代码自然不会部署。<type>

与文档中编写的内容的唯一区别是,没有为测试依赖项指定范围。它是否仅适用于范围?我可以以某种方式以不同的方式部署测试类吗?test

我知道这个问题有点复杂,如果有什么我可以澄清的,请告诉我。

谢谢!


更新:

我尝试了其他几种方法,但它仍然不起作用。

我在项目中的maven-jar-plugin(依赖项,而不是主Web项目)中添加了另一个执行,我希望强制maven在与主jar相同的jar中编译测试类,并通过不同的分类器引用大捆绑包。我无法让它工作:foo

<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是用分类器生成的,但我找不到任何方法来让它在目标中包含测试类。batmanjar

这样做,我意识到这并不取决于类型/分类器/范围关系。当我尝试指定除主jar之外正在构建的新jar时,我得到了与尝试包含jar相同的行为。我检查了本地maven存储库,并且依赖项目中的所有jar都安装得很好,所以问题是主项目的依赖关系解决方案。test-jarteststest-tests

tl;博士

一切都归结为一个问题,如果你可以用多个分类器包含相同的依赖关系。从我所看到的到现在,答案是否定的 - 当使用不同的分类器多次指定相同的依赖项时,我总是得到jar。com.example-foo


答案 1

最好在第一个模块中配置 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>

答案 2

我看到你使用as,你用而不是,但可能也与...但是你试过以下方法吗?test-jartypeclassifiertypetest-jar

<dependency>
    <groupId>com.example</groupId>
    <artifactId>foo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <classifier>tests</classifier>
    <scope>test</scope>
</dependency>

推荐