我怎样才能找到 Maven 正在重建的原因?

How can I find the reason that Maven is rebuilding?

当我 运行 Maven 什么都没改变后,maven-compiler-plugin 经常重新编译 Java 文件;或 maven-war-plugin 重建或复制 war 即使没有任何改变;或 gwt-maven-plugin 构建 Google Web 工具包代码(在某些计算机上,而不是其他计算机上),即使没有任何更改。

如何查看 Maven 决定重建某些内容的原因?例如,它认为(错误地)更改了哪些文件?

这里有一个例子:maven-compiler-plugin 每次都在重新复制 war 资源,即使什么都没有改变。它使用 "exploded" war 来节省开发时间,但即使使用常规 war.

也会发生这种情况

但我的问题更普遍地是如何找出为什么 Maven 目标选择重建而不是使用现有输出。

[INFO] Processing war project
[INFO] Copying webapp webResources [d:\dev\proj1/war/WEB-INF] to [d:\dev\proj1\target\proj1-0.0.1-SNAPSHOT]
[INFO]  Copying webapp webResources [d:\dev\proj1/lib/libs] to [d:\dev\proj1\target\proj1-0.0.1-SNAPSHOT]
[INFO]  Copying webapp resources [d:\dev\proj1\war]
 Webapp assembled in [37919 msecs]

Maven 插件必须自己实施过时检查(可能使用助手),并且它们可以自由记录或不记录原因,因此没有通用的答案(与 Gradle 相反)。总的来说,Maven 增量构建支持相当差(例如,参见 https://cwiki.apache.org/confluence/display/MAVEN/Incremental+Builds,它很旧,但大部分仍然是正确的 AFAICT),并且严重依赖于每个插件(及其版本)

您可以使用调试日志 (mvn -X) 尝试 运行 Maven 并深入研究日志。但首先尝试使用最新版本的插件。这并不意味着您会对 为什么 输入被认为是陈旧的输入有答案,或者它会修复观察到的行为;但是除了自己调试插件外,真的没有别的办法了。