Maven编译器插件总是将一组源检测为"陈旧"

tuc*_*uxi 47 java build maven

修复:这是maven-compiler-plugin 3.1中的已知错误

我正在将一个基于ant的1000多个java源项目的构建转换为maven.到目前为止mvn compile一切都很好,但每次启动它都会重新编译所有内容(而不是重用旧类)

使用mvn -X compile报告

[DEBUG] Stale source detected: /project_path/src/main/java/package_path/AFile1.java
[DEBUG] Stale source detected: /project_path/src/main/java/package_path/AFile2.java
...
Run Code Online (Sandbox Code Playgroud)

(仅适用于某个包中的文件,可能与其余代码未引用;不是我的来源,我只是试图对构建进行编组)

编译不会失败,并且正在生成具有更新时间戳的类

/project_path/target/classes/package_path/AFile1.class
/project_path/target/classes/package_path/AFile2.class
...
Run Code Online (Sandbox Code Playgroud)

但是,在查看时间戳时,自昨天以来,java文件没有更改,并且类文件是最新的.为什么这些来源被确定为陈旧?我该如何调试此问题?

即使没有发生任何变化,也必须重新编译1k +文件...


样本输出:

$ mvn clean compile
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building MyProject 1.9.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[WARNING] The POM for net.sourceforge:jffmpeg:jar:1.1.0 is missing, no dependency information available
[INFO] 
[INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ my-project ---
[INFO] Deleting /project_path/target
[INFO] 
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ my-project ---
[debug] execute contextualize
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /project_path/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ my-project ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1162 source files to project_path/target/classes
....
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11.215s
[INFO] Finished at: Tue Jul 30 12:42:25 CEST 2013
[INFO] Final Memory: 25M/429M
[INFO] ------------------------------------------------------------------------



$ mvn compile
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building MyProject 1.9.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[WARNING] The POM for net.sourceforge:jffmpeg:jar:1.1.0 is missing, no dependency information available
[INFO] 
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ my-project ---
[debug] execute contextualize
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /project_path/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ my-project ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1162 source files to /project_path/target/classes
... 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12.140s
[INFO] Finished at: Tue Jul 30 12:42:44 CEST 2013
[INFO] Final Memory: 22M/379M
[INFO] ------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

tuc*_*uxi 31

这是maven-compiler-plugin 3.1中的一个已知问题.它在https://issues.apache.org/jira/browse/MCOMPILER-209中被跟踪(useIncrementalCompilation标志被破坏).

该问题与另一个3.1错误无关,https://issues.apache.org/jira/browse/MCOMPILER-205(其中不生成.class输出的文件始终标记为'陈旧').

经过进一步的测试,回到3.0并没有真正解决问题(它只能在下一个问题上运行mvn clean compile.但是,正如Michael Lemke在评论中所说的那样,标记useIncrementalCompilationfalse可行的替代品;现在,每次只重新编译有问题的包(而不是整个代码库).

  • 我看到了同样的问题.但是,使用3.0对我的情况没有帮助.我只是继续使用3.1并将`useIncrementalCompilation`设置为false.修复它给我.我实际上是使用replacer插件修改单个Java文件,这会导致这种不幸的行为. (2认同)
  • @mattman88 这可以在 pom.xml 文件中设置: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version >3.2</version> <configuration> <useIncrementalCompilation>false</useIncrementalCompilation> </configuration> </plugin> </plugins> </build> (2认同)

jm.*_*jm. 17

Maven可能会显示如下消息:

[INFO]检测到更改 - 重新编译模块!

因为项目中有一个永远不会编译成类文件的空java文件(或所有注释掉的文件).

您可以通过使用-X运行maven来确定maven重建的原因.看看上面的消息.

  • 我在v3.7.0中遇到了同样的问题。这是最好的答案。如果您运行`mvn -X`,您将看到:`[DEBUG] useIncrementalCompilation enabled,后跟...`[DEBUG]检测到过时的源代码:$ {filePath}`,这是我项目中2倍的空源文件。辉煌! (4认同)

Kir*_*ill 10

面临同样的问题。mvn compile带有-X选项的Maven显示问题是由package-info.java文件引起的。

[DEBUG] 检测到过时的源:.../package-info.java

问题是没有为.class文件生成package-info.java

在这个 PR 中找到了解决方案:https : //github.com/apache/flink/pull/5644/files 引用MCOMPILER-205

<compilerArgs>
    <arg>-Xpkginfo:always</arg>
</compilerArgs>
Run Code Online (Sandbox Code Playgroud)

意思是:

始终为每个 package-info.java 文件生成 package-info.class。


and*_*dyb 7

我的情况略有不同,所以我只是添加它,以防其他人有同样的问题.我的项目没有生成类,没有package-info.java; 只有.java文件src/main/java.

TL;博士

更新到maven-compiler-plugin3.1或使用maven-compiler-plugin3.0和没有设置<overwrite>true</overwrite>maven-resources-plugin.


长版

随着src树的零更改,Maven始终显示如下输出:

$ mvn -o compile

[INFO] --- maven-compiler-plugin:3.0:compile (default-compile) @ my-project ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 134 source files to /home/me/my/project/target/classes
Run Code Online (Sandbox Code Playgroud)

我认为这是maven-resources-plugin我的项目正在使用的父POM中的配置.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <configuration>
        <overwrite>true</overwrite>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

从父POM中删除此插件,或者在我的项目中重新定义<overwrite>false</overwrite>增量构建问题.

我想知道为什么在<overwrite>false</overwrite>为Maven 设置再次进行增量构建之后我必须做两个构建,因此进一步调查.这只是因为第一个编译生成一个文件(被调用inputFiles.lst),用于确定已更改的文件,因此在下一次编译时,它可以使用该文件来检测更改.MCOMPILER-187 的评论证实了这一点.

我意识到我使用maven-compiler-plugin3.0并且可以升级到

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
</plugin>
Run Code Online (Sandbox Code Playgroud)

这也解决了问题.3.1使用maven-shared-incremental1.1(而不是1.0 maven-compiler-plugin使用1.0 .注意MCOMPILER-187MSHARED-264是覆盖变化的2个错误.

回到maven-compiler-plugin 3.0,我观察到target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst没有使用<overwrite>true</overwrite>set 生成.因此,这可能是项目在使用maven-compiler-plugin 3.0时无法进行增量构建的原因.

显然,通常不希望每次编译都覆盖资源,但这里的主要问题inputFiles.lst是永远不会生成,因此Maven永远无法进行增量构建.因此检查是否存在inputFiles.lst可能是另一个插件以某种方式导致它不能生成.