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

yeg*_*256 4 java maven-2

install我的Maven项目:

mvn clean install
Run Code Online (Sandbox Code Playgroud)

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

mvn install
Run Code Online (Sandbox Code Playgroud)

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

Pas*_*ent 6

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

因为那就是你要求Maven做的事情.

当您调用构建阶段时,Maven不仅会执行构建阶段,还会执行调用构建阶段之前的每个构建阶段.因此,调用:

mvn install
Run Code Online (Sandbox Code Playgroud)

将运行前每构建阶段install(validate,compile,test,package,等),在执行前install,你也必然会这些阶段的插件.

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

现在,一些评论/建议:

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

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

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

这需要很多时间.

我建议使用高级反应器选项来仅构建模块的子集.这些选项是:

-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 
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下,你可以运行类似的东西(假设你触摸module-foo):

mvn -pl module-foo,my-packaged-app install
Run Code Online (Sandbox Code Playgroud)

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

mvn -pl module-foo -amd install
Run Code Online (Sandbox Code Playgroud)