2010-11-02 47 views
3

install我的Maven项目:为什么Maven在JAR已经存在的时候再次运行测试?

mvn clean install 

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

mvn install 

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

回答

5

现在我跑一遍(...)Maven运行单元测试,并再次

静态代码分析因为这是你问什么简单的Maven做。

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

mvn install 

运行前,每次构建阶段installvalidatecompiletestpackage等),执行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 
+0

@Pascal这只是一个例子在实际项目中,我看到当我在一个文件中做一个单独的更改,然后我想重新安装(阅读“重新部署到glassfish”)整个项目时,我不希望所有的JAR/WAR文件重新编译,只是受影响的人..不幸的是,maven重新构建所有模块..非常无效,你不同意吗? – yegor256 2010-11-02 12:16:09

+0

@Vincenzo:你的用例究竟是什么? – 2010-11-02 14:37:26

+0

@Pascal多模块项目,具有广泛的测试和静态代码分析,我运行'mvn clean install',t如果我在一个模块中更改一个单独的java文件。然后我运行'mvn install'并期望maven只测试/分析这个已更改的特定模块。不幸的是,它重新测试并重新分析所有模块。这需要很多时间.. – yegor256 2010-11-02 15:04:11

4

不幸的是,这是如何设计maven install插件。它执行最佳实践,比如在安装之前始终运行测试,因为即使代码没有,其他环境因素也可能发生变化。

如果你只是想以增量编译(即只有自上次编译后更改过的那些文件),那么你应该通过调用mvn compile使用compiler插件,然后建立罐子使用mvn jar:jar

跳过测试:mvn -Dmaven.test.skip=true install

+0

其实,'install'是一个阶段,而不是插件。不,你不应该使用'jar:jar',而是使用'package'阶段(这就是构建生命周期的阶段)。 – 2010-11-02 11:18:03

+1

是的,“安装”是安装插件运行的阶段。同样,Compiler插件在“编译”阶段使用。 – dogbane 2010-11-02 12:00:06

+0

我的观点是,1.插件不执行任何事情,构建生命周期(安装插件不会触发例如测试)。 2.你通常调用阶段,而不是插件。 – 2010-11-02 15:50:42

2

'test'是'构建'生命周期中的默认阶段。如果你想跳过在测试过程中安装内容添加到pom.xml中,

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

,然后创建一个配置文件说,“测试”将包含测试配置。如果你想执行测试,请执行mvn -Ptest测试。

由于dogbane已经回答你不能跳过任何其他方式。

+0

测试是最不耗时的操作,静态代码分析如何?我应该在每个插件中做这些技巧? :( – yegor256 2010-11-02 10:52:24

+0

是的,你是对的,但据我所知没有其他的方式。让我们知道,如果你找到另一种方式,除了我提到的 – Adi 2010-11-02 11:25:13

+0

@Adi我想要这样的事情虽然我不知道如何编写单独的配置文件,并设置哪一个工作时,所以我刚刚添加它,直到写入更多的代码,并且将得到2测试时将其删除/评论 – 2013-01-25 11:54:14

相关问题