Java 既然JAR已经存在,为什么Maven还要再次运行测试呢?

Java 既然JAR已经存在,为什么Maven还要再次运行测试呢?,java,maven-2,Java,Maven 2,I安装我的maven项目: mvn clean install 一切正常,JAR文件在/target目录中创建。现在我再次运行它: mvn install Maven再次执行单元测试和静态代码分析。我没有对.java文件做任何更改,JAR就在那里,那么为什么还要再次运行测试呢?是我做错了什么,还是maven就是这样设计的?不幸的是,maveninstall插件就是这样设计的。它强制执行最佳实践,比如在安装之前总是运行测试,因为即使您的代码没有改变,其他环境因素也可能已经改变 如果您只想增量编

I
安装
我的maven项目:

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

mvn install

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

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

如果您只想增量编译(即,只编译自上次构建以来已更改的文件),那么您应该通过调用
mvn compile
来使用
compiler
插件,然后使用
mvn jar:jar
来构建jar


要跳过测试:
mvn-Dmaven.test.skip=true安装

“测试”是“构建”生命周期中的默认阶段。如果要在安装过程中跳过测试,请将其添加到pom.xml中

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

org.apache.maven.plugins
maven surefire插件
真的
然后创建一个配置文件,比如“test”,它将包含测试配置。如果要执行测试,请执行mvn-Ptest测试

正如罗布麻已经回答了你不能以任何其他方式跳过

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

因为这就是你要Maven做的

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

mvn install
将在执行
install
之前运行每个构建阶段(
validate
compile
test
package
等),然后再执行
install
以及绑定到这些阶段的插件

虽然Maven确实支持Java源代码的增量编译,但其他插件并没有那么聪明,将再次被激活

现在,一些评论/建议:

  • 如果您没有更改任何内容,那么运行
    install
    有什么意义
  • 如果您不想在每次构建时运行静态代码分析,请使用特殊的概要文件

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

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

花了这么多时间

我建议使用仅构建模块的一个子集。这些选择包括:

-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 
因此,在您的情况下,您可以运行如下操作(假设您触摸了
模块foo
):

或者,要重建依赖于
模块foo
的所有项目:

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

测试是最省时的操作,静态代码分析如何?我应该在每个插件中使用这些技巧(是的,你是对的。但据我所知,没有其他方法。如果你找到了我提到的以外的其他方法,请告诉我们。@Adi我想要这样的方法。虽然我不知道如何编写单独的配置文件并设置在何时使用哪个配置文件。所以我只是在编写更多代码之前添加了它,并在得到2个测试时删除/注释它。实际上,
安装是一个阶段,不是插件。不,你不应该使用
jar:jar
,而应该使用
package
阶段(这是构建生命周期由阶段组成的全部要点)。是的,“安装”是安装插件运行的阶段。同样,编译器插件在“编译”期间使用阶段。我的观点是1.插件不强制执行任何内容,构建生命周期强制执行(安装插件不会触发测试)。2.您通常调用阶段,而不是插件。@Pascal这只是一个例子。在实际项目中,我看到一种更复杂的情况,当我在一个文件中进行一次更改,然后我想重新安装(阅读“重新部署到glassfish”)整个项目。我不想重新编译所有的JAR/WAR文件,只想重新编译受影响的文件。不幸的是,maven重新构建了所有模块。非常无效,你不同意吗?@Vincenzo:你的用例到底是什么?@Pascal是一个多模块项目,具有广泛的测试和静态代码分析。我运行
mvn clean install
,然后我更改了一个si将java文件放在一个模块中。然后我运行
mvn install
,希望maven只测试/分析这个已更改的特定模块。不幸的是,它会重新测试和分析所有模块。这需要花费很多时间。@Vincenzo如果你真的对该功能感兴趣,请看maven reactor-plugin@John不需要小牛所有特性都可以在原生maven客户端中使用。