有没有一种方法可以配置maven-compiler-plugin以使其与源文件的相对路径一起使用?

时间:2020-04-17 13:44:47

标签: java maven continuous-integration portability maven-compiler-plugin

maven-compiler-plugin编译srctest类时,会在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多项与代码有关的事情(忽略顺序和含义,只考虑可以做很多这样的事情):

  • 编译(仅在此处编译,稍后再使用)
  • 依赖性检查
  • 单元测试
  • 覆盖率报告
  • 合规性和安全性检查
  • 集成测试
  • 端到端/系统测试
  • 包装

由于绝对路径(注释8565a57219ad4352),即使我将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,以更新新的当前绝对路径。

1 个答案:

答案 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 总是重新编译模块的原因,所以删除那个文件对我有用。