Java 发布阶段的Maven测试依赖性

Java 发布阶段的Maven测试依赖性,java,unit-testing,maven,Java,Unit Testing,Maven,我们遇到了一个非常奇怪的问题,尤其是因为同样的解决方案在项目的其他部分也能起作用 我们正在与Maven 3合作 我们有一个带有单元测试的模块和一些类,即模块a中的模拟。 模块B取决于源和测试源的A 因此,我们做了以下工作: 在模块A中: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-

我们遇到了一个非常奇怪的问题,尤其是因为同样的解决方案在项目的其他部分也能起作用

我们正在与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编译器插件的执行过程中,那么为什么它要尝试获取仅在测试范围内作为依赖项的测试jar呢


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

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

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

如果它是在编译测试时发生的,那么就意味着您在某个地方有一个输入错误

从上面的代码中我可以看到:testjar是错误的。总是罐。要获得所需内容,需要设置分类器:


这就是说,这里有一个导出模拟和测试实用程序的不同解决方案:

我们有一个非常相同的情况,我们的解决方法是添加第二个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编译不需要在直接的多模块上使用moduleA的测试jar

看起来您的多模块构建无法正常工作。我假设你缺少一个依赖项,也就是说,建筑的顺序不是它应该的。我建议清理您的本地存储库,并尝试通过mvn clean软件包进行构建,我认为这将失败。感谢您的回复。我删除了整个存储库,然后运行mvn clean和maven包。没有失败你确定你用的是Maven 4吗?它似乎不是公开的,甚至不是测试版。对不起,这是一个输入错误,我会修正它。你能分享你的完整POM和你正在运行的确切Maven命令吗?我在多个多模块项目中使用Maven 3,设置与前面提到的完全相同,从未遇到过问题。谢谢,我们会尝试的。但你们能详细说明一下为什么测试罐是错误的吗?另外,我怎样才能测试我没有泄漏?并没有类型测试罐;搜索当前核心包装值可查看有效值列表。2.泄漏检测:我不知道自动检测的方法。好的,谢谢。我们会努力的。我发现maven文档非常混乱和循环。我们很难理解,你的意思是我只需要改变依赖关系还是删除模块A中的插件定义?我们发现了问题。在我们的例子中,moduleB使用maven ant run进行一些资源过滤。但由于某些原因,ant run插件需要解决测试jar和测试依赖关系。因此,我们使用resources插件来进行资源过滤,并抛弃了ant运行。
<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>