【发布时间】:2016-01-01 01:04:20
【问题描述】:
是否可以在编译阶段根据 maven-compiler-plugin 是否实际检测到源代码更改并因此编译并生成新的类文件来有条件地执行目标?
我的用例是只在项目中有新字节码时才运行 findbugs 或 jacoco 插件。
目前,我通过将 findbugs 挂钩到编译阶段来无条件运行它:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<executions>
<execution>
<id>findbugs-check-compile</id>
<phase>compile</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
但是,如果我反复执行“mvn package”,我会得到:
[INFO] --- maven-compiler-plugin:3.3:compile (default-compile) @ my-prj ---
[INFO] Nothing to compile - all classes are up to date
[INFO] >>> findbugs-maven-plugin:3.0.1:check (findbugs-check-compile) > :findbugs @ my-prj >>>
[INFO] --- findbugs-maven-plugin:3.0.1:findbugs (findbugs) @ my-prj ---
[INFO] Fork Value is true
[INFO] Done FindBugs Analysis....
请注意 maven-compiler-plugin 如何检测“无需编译 - 所有类都是最新的”。如果不是这种情况,我只想执行 findbugs:check(或者等效地,如果确实是这种情况并且没有任何改变,我想跳过“findbugs:check”目标执行)。
注意 1:我知道基于操作系统 / 架构 / 系统属性 / 等的配置文件和条件激活,但我的理解是,这些是在 maven 启动时及早评估的,并且在构建期间不能更改。
注意 2:我也见过提到的 maven-ant-plugin,但我想完全跳过额外插件的执行。我不想添加 antrun 执行只是为了能够跳过 findbug。
注意 3:我需要能够为多个插件执行此操作,而不仅仅是 findbugs
【问题讨论】:
-
我同意@javapopo。真正的问题是:为什么要在构建中引入如此多的复杂性? Maven 的关键之一是两个人可以查看 POM 并快速找出发生了什么。当它不起作用时,引入复杂的条件只会使事情复杂化。你有 Maven 的构建生命周期,你有你的插件。把事情简单化。如果您的构建时间过长,也许将其拆分可能是一种替代方法。在工作中,我们的 Jenkins 服务器每晚只生成一次 FB/PMD 报告,但每次提交都会快速构建 CI。
-
我理解 POM 背后的想法。不过,我不认为我们在谈论过于复杂的事情:“某些事情发生了变化”的情况是构建的核心。人们希望它以某种方式得到支持......