【问题标题】:Maven test dependency in release phase发布阶段的Maven测试依赖
【发布时间】:2014-02-13 13:56:17
【问题描述】:

我们有一个非常奇怪的问题,特别是因为相同的解决方案在项目的其他部分也有效。

我们正在使用 Maven 3

我们在模块 A 中有一个带有单元测试和一些类(即模拟)的模块。 模块 B,对于源和测试源都依赖于 A。

所以我们做了以下事情:

在模块 A 中:

        <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>

然后我们在模块 B 的 pom 中放入:

     <!--Source dependency-->
    <dependency>
        <groupId>myGroup</groupId>
        <artifactId>A</artifactId>
        <version>${project.version}</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>

    <!--Test dependency-->
    <dependency>
        <groupId>myGroup</groupId>
        <artifactId>A</artifactId>
        <version>${project.version}</version>
        <type>test-jar</type>
        <scope>test</scope>
    </dependency>

因此,当我们构建项目时,一切正常,据我所知,构建运行“安装”阶段,所以一切正常是有道理的。 现在,我们正在尝试发布,在模块 B 的编译阶段,我们总是得到:

未能在项目 B 上执行目标:无法解决依赖关系 对于项目 myGroup:B:war:1.5.0.0:找不到 “链接到我们的工件”中的 myGroup:A:jar:tests:1.5.0.0 被缓存在 本地存储库,解析将不会重新尝试,直到 “公司名称”的更新间隔已过或强制更新

从我在构建日志中可以看到,它发生在“maven-compiler-plugin”执行期间,那么为什么它会尝试获取仅在测试范围内依赖的测试 jar?

这不是我们第一次在项目中使用这种方法,而且它一直有效(到目前为止,我们已经发布了几个版本)。

【问题讨论】:

  • 这看起来您的多模块构建工作不正常。我假设您缺少依赖项,换句话说,构建顺序不是应该的。我建议清理您的本地存储库并通过mvn clean package 尝试构建我认为这会失败。
  • 感谢您的回复。我删除了整个存储库,然后运行 ​​mvn clean 和 maven package。没有什么失败
  • 你确定你使用的是 Maven 4 吗?它似乎没有公开可用,甚至没有作为测试版。
  • 抱歉,打错了,我会改正的
  • 您能分享您的完整 POM 和您正在运行的确切 Maven 命令吗?我在多个多模块项目中使用 Maven 3,并且完全按照上述设置,并且从未遇到过问题。

标签: java unit-testing maven


【解决方案1】:

一些背景知识:Maven 使用两个类路径(编译和测试),因此,您会看到 Maven 编译插件被调用两次(一次用于生产代码,一次用于测试)。

上面的错误意味着Maven在任何地方都找不到依赖myGroup:A:jar:tests:1.5.0.0。如果这发生在第一个编译阶段(生产代码),那么这意味着测试代码泄漏到生产(“编译”)类路径中,这是不好的。

如果它发生在编译测试时,那么这意味着你有一个错字。

我可以从上面的代码中看到:&lt;type&gt;test-jar&lt;/type&gt; 是错误的。 &lt;type&gt; 始终是 jar。要得到你想要的,你需要设置classifier

<!--Test dependency-->
<dependency>
    <groupId>myGroup</groupId>
    <artifactId>A</artifactId>
    <version>${project.version}</version>
    <classifier>tests</classifier>
    <scope>test</scope>
</dependency>

也就是说,这是导出模拟和测试实用程序的不同解决方案:Where should I put test support code for a Java library

【讨论】:

  • 谢谢,我们会努力的。但是您能否详细说明为什么 test-jar 是错误的?
  • 另外,我如何测试我没有“泄漏”?
  • 没有类型test-jar;在maven.apache.org/pom.html 上搜索“当前核心包装值是”以获取有效值列表。 2. 测试泄漏:我知道没有自动化的方法来做到这一点。
  • 好的,谢谢。我们会尝试。我发现 Maven 文档非常混乱和循环。我们很难理解它
  • 你的意思是我只需要更改依赖关系还是消除模块A中的插件定义?
【解决方案2】:

我们的情况非常相似,我们的解决方法是添加 jar 插件的第二次“哑”执行:

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

请注意,在一个简单的多模块项目中,我们发现这不是必需的。模块B 上的mvn compile 不需要直接多模块上的模块A 的测试罐。

【讨论】:

  • 我们发现了问题。在我们的例子中,moduleB 使用 maven-ant-run 来进行一些资源过滤。但由于某种原因,ant-run 插件需要解决 test-jar、测试依赖项。因此,我们使用资源插件来进行资源过滤并放弃了 ant-run。
猜你喜欢
  • 2012-09-23
  • 2015-03-03
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多