Maven在发布阶段测试依赖性

时间:2014-02-13 13:56:18

标签: java unit-testing maven

我们有一个非常奇怪的问题,特别是因为同样的解决方案适用于项目的其他部分。

我们正在与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:测试:1.5.0.0在“链接到我们的神器”中被缓存了   本地存储库,解决方案将不会重新尝试,直到   已更新“公司名称”的更新间隔或强制更新

从构建日志中我可以看到它在“maven-compiler-plugin”的执行过程中发生,那么为什么它只是试图获得测试范围中只有依赖的测试jar?

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

2 个答案:

答案 0 :(得分:0)

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

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

如果在编译测试时发生这种情况,则意味着您在某处出现了拼写错误。

我从上面的代码中可以看到:<type>test-jar</type>是错误的。 <type>始终为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

答案 1 :(得分:0)

我们有一个非常相同的情况,我们的解决方法是添加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>

请注意,在直接的多模块项目中,我们发现这不是必需的。 moduleB上的mvn compile在直接的多模块上不需要moduleA的test-jar。