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

标签 java deployment maven dependencies

我有两个项目,foofoo-webcom.example团体。 foo-web取决于 foo .

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

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

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>

运行时mvn installfoo-web ,在 foo 的目标中我会得到两个 jar :foo-1.0.0-SNAPSHOT.jarfoo-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 的部署在 war 中。现在,我还想部署 -tests 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(与上面的名称相同),但自然不会部署源。

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

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

谢谢!


更新:

我尝试了其他几种方法,但仍然无法正常工作。

我在 foo 中的 maven-jar-plugin 中添加了另一个执行。项目(依赖项,而不是主要的 Web 项目),我希望强制 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 中包含测试类目标。

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

tl;博士

如果您可以使用多个分类器包含相同的依赖项,那么一切都归结为一个问题。从我到现在看到的情况来看,答案是否定的——我总是得到 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 install/release 还将部署一个 Artifact 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 项目的部署中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7751860/

相关文章:

java - 具有多个相同元素的 JComboBox 始终选择元素的第一个实例

Java 9 HttpClient 挂起

.net - DotNet 中的补丁开发

java - 在liferay hook中将自定义类导入到JSP

java - Nexus/Maven 如何不通过 Nexus 代理所有内容

java - 旧版安装的应用程序类路径惨败

Java - JFrame 根本不显示其内容

grails - 作为War文件运行时找不到Json Views模板

java - 如何在基于 Servlet 的 JPA 应用程序中配置数据库连接

java - 在 Maven/Surefire 中,无论单元测试是否通过,清理后的清理工作有什么好方法?