我install
我的maven项目:
mvn clean install
一切正常,JAR文件在/target
目录中创建。现在我再次运行它:
mvn install
Maven再次执行单元测试和静态代码分析。我没有对.java
文件进行任何更改,JAR就在那里,为什么还要再次运行测试呢?我做错了什么,或者是maven的设计方式?
答案 0 :(得分:6)
现在我再次运行它(...)Maven再次执行单元测试和静态代码分析
因为那只是你要求Maven做的事情。
当你调用build phase时,Maven不仅会执行构建阶段,还会执行被调用构建阶段之前的每个构建阶段。因此,调用:
mvn install
在执行install
之前,将运行validate
之前的每个构建阶段(compile
,test
,package
,install
等)你绑定到这些阶段的插件也是如此。
虽然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测试。
正如狗狗已经回答的那样,你不能以任何其他方式跳过。