当JAR已经存在时,为什么Maven再次运行测试?

时间:2010-11-02 10:19:43

标签: java maven-2

install我的maven项目:

mvn clean install

一切正常,JAR文件在/target目录中创建。现在我再次运行它:

mvn install

Maven再次执行单元测试和静态代码分析。我没有对.java文件进行任何更改,JAR就在那里,为什么还要再次运行测试呢?我做错了什么,或者是maven的设计方式?

3 个答案:

答案 0 :(得分:6)

  

现在我再次运行它(...)Maven再次执行单元测试和静态代码分析

因为那只是你要求Maven做的事情。

当你调用build phase时,Maven不仅会执行构建阶段,还会执行被调用构建阶段之前的每个构建阶段。因此,调用:

mvn install
在执行install之前,

将运行validate之前的每个构建阶段(compiletestpackageinstall等)你绑定到这些阶段的插件也是如此。

虽然Maven确实支持Java源代码的增量编译,但其他插件并不聪明,会再次被解雇。

现在,一些评论/建议:

  • 如果你没有改变什么,运行install的重点是什么?
  • 如果您不想在每次构建时运行静态代码分析,请使用特殊的配置文件。

  

一个多模块项目,具有广泛的测试和静态代码分析。我运行mvn clean install,然后在一个模块中更改一个单独的java文件。然后我运行mvn install并期望maven仅测试/分析这个已更改的特定模块。不幸的是,它重新测试并重新分析所有模块。

实际上,如果您在反应堆构建中运行mvn install,将在所有模块上运行mvn install,并且将在所有模块上再次进行测试和分析。这可能不是你所期望的,但这就是你会得到的(AFAIK,静态分析插件不知道变化 - 我无法解释为什么事情不会更好)。

  

这需要很长时间。

我建议使用the advanced reactor options来构建模块的子集。这些选项是:

-rf, --resume-from
        Resume reactor from specified project
-pl, --projects
        Build specified reactor projects instead of all projects
-am, --also-make
        If project list is specified, also build projects required by the list
-amd, --also-make-dependents
        If project list is specified, also build projects that depend on projects on the list 

所以在你的情况下,你可以运行(假设你触及module-foo):

mvn -pl module-foo,my-packaged-app install

或者,重建依赖于module-foo的所有项目:

mvn -pl module-foo -amd install

答案 1 :(得分:4)

不幸的是,这就是maven install插件的设计方式。它强制执行最佳实践,例如在安装之前始终运行测试,因为即使您的代码没有,其他环境因素也可能已经改变。

如果你只想逐步编译(即只是那些自上次构建以来已经改变的文件),那么你应该通过调用compiler来使用mvn compile插件,然后构建jar使用{ {1}}。

要跳过测试:mvn jar:jar

答案 2 :(得分:2)

'test'是'build'生命周期中的默认阶段。如果要在安装期间跳过测试,请将其添加到pom.xml,

<build>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
        <skipTests>true</skipTests>
        </configuration>
    </plugin>
   </build> 

然后创建一个配置文件,说'test',其中包含测试配置。如果要执行测试,请执行mvn -Ptest测试。

正如狗狗已经回答的那样,你不能以任何其他方式跳过。