修复:这是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在评论中所说的那样,标记useIncrementalCompilation
为false
可行的替代品;现在,每次只重新编译有问题的包(而不是整个代码库).
jm.*_*jm. 17
Maven可能会显示如下消息:
[INFO]检测到更改 - 重新编译模块!
因为项目中有一个永远不会编译成类文件的空java文件(或所有注释掉的文件).
您可以通过使用-X运行maven来确定maven重建的原因.看看上面的消息.
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。
我的情况略有不同,所以我只是添加它,以防其他人有同样的问题.我的项目没有生成类,没有package-info.java
; 只有.java
文件src/main/java
.
TL;博士
更新到maven-compiler-plugin
3.1或使用maven-compiler-plugin
3.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-plugin
3.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-incremental
1.1(而不是1.0 maven-compiler-plugin
使用1.0 .注意MCOMPILER-187和MSHARED-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
可能是另一个插件以某种方式导致它不能生成.
归档时间: |
|
查看次数: |
31884 次 |
最近记录: |