maven-compiler-plugin
编译src
或test
类时,会在target
输出目录中生成一个列表,其中包含已编译的所有Java文件(inputFiles.lst
)。例如。 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
此文件中列出的Java文件包含已编译Java文件的绝对路径(每行一个):
/tmp/build/8565a572/my-maven-project/my-module/src/main/java/com/example/MyClass.java
相反,生成的文件也列在文件createdFiles.lst
的同一目录中,但具有相对路径:
com/example/MyClass.class
这使此target
目录不可移植(没有其他解决方法),并且此构建不能重复使用。 (通过电子邮件发送或在使用inputFiles.lst
文件中可见的随机路径的CI / CD作业容器之间发送。
可以将maven-compiler-plugin
插件配置为使用Java源代码的相对路径吗?我想inputFiles.lst
仅保存相对路径:
src/main/java/com/example/MyClass.java
用例:在Concourse(CI / CD)环境中,可以重用已构建的类以加快CI / CD的工作-构建一次,然后在所有后续步骤中重用。 CI / CD管道包含10多项与代码有关的事情(忽略顺序和含义,只考虑可以做很多这样的事情):
由于绝对路径(注释:8565a572
与19ad4352
),即使我将target
目录和CI / CD作业一起移动,代码始终是从头开始编译的:
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1840 source files to /tmp/build/19ad4352/my-maven-project/my-module/target/classes
如果您在CI / CD中多次重复此操作,最终将导致每次提交丢失/等待几分钟。
例如,对于单个模块(500个Java文件),mvn test-compile
在执行编译时花费 20秒,而在构建时花费 5秒类被重用/缓存/传递。
一种解决方法是sed
并替换所有inputFiles.lst
,以更新新的当前绝对路径。
答案 0 :(得分:0)
看来你想重用Maven缓存,实际上最近我也发生了同样的事情,我发现我的一个项目总是重新编译模块,但其他项目却没有。 maven-compiler-plugin
的版本是 3.6.0。
事实上,maven-compiler-plugin
3.1 中存在一个已知错误。相关问题 https://issues.apache.org/jira/browse/MCOMPILER-209。如果您没有使用该版本,您可以检查项目中是否有一个从未编译为类文件的空 java 文件。或者也许里面只有评论。
例如
/*
* I will write some code in the future
*/
package foo;
您可以通过使用 -X
运行 Maven 来使用调试模式并查看输出消息,这对调试 Maven 并找到原因很有帮助。
对我来说,这个空文件是 Maven 总是重新编译模块的原因,所以删除那个文件对我有用。