【问题标题】:Is there a way to configure the maven-compiler-plugin to work with relative paths for the source files?有没有办法配置 maven-compiler-plugin 以使用源文件的相对路径?
【发布时间】:2020-07-31 01:03:21
【问题描述】:

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多件与代码有关的事情(忽略顺序和意义,只考虑可以做的事情有很多):

  • 编译(此处编译,稍后重用)
  • 依赖性检查
  • 单元测试
  • 报道报道
  • 合规和安全检查
  • 集成测试
  • 端到端/系统测试

由于绝对路径(注意8565a572 vs 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 中多次重复此操作,您最终会在几分钟内丢失/等待每次提交。

例如,mvn test-compile 用于单个模块(500 个 Java 文件)在执行编译时需要 20 秒,而在构建类时需要 5 秒被重用/缓存/传递。

解决方法是使用sed-并替换所有inputFiles.lst 以更新新的当前绝对路径。

【问题讨论】:

  • 首先为什么目标目录不可移植,因为它适用于 Linux、Windows、Mac 等。目标目录不打算被缓存和转移......你说的重用是什么意思后续测试?为什么要重用目标/类或目标/测试类?你能更详细地描述真正的问题是什么吗?
  • 我更新了问题的“用例”部分。
  • 关于真正的问题:试图避免一个包含mvn release 的怪物作业并将其拆分为更小的作业。此外,这些项目是一个多模块(单个 repo)项目,这将有助于并行化各个模块。这使得管道更快地失败并且更具描述性(视觉和失败通知)问题在发布过程中的哪些步骤(哪个步骤,哪个模块)。
  • 根据您的描述,您正在尝试分解生命周期,因为您描述的所有步骤都是 maven 生命周期的一部分。您当然可以在并行化mvn -T 3 ... 中运行您的构建,并使用多模块构建,您已经在测试中重用了已编译的部分。原因 单元测试在同一个模块中完成。集成是不同的…… e2e 测试也是如此。包不能在 e2e 之后完成,因为集成测试你需要包(jar)......否则你不是在 e2e 中测试真正的应用程序,也不是在 IT 中......
  • 关于你的模块。您可以运行 maven 并在最后失败 (--fail-at-end) 并获得有关失败单元测试的综合报告。这通常被称为不稳定的构建,之后构建的罪魁祸首(通常是一个分支)将收到一封电子邮件或其他类型的信息(松弛、mattermoster 等)。如果您有大量测试,那么运行单元是个好主意并行测试,并让构建通过-T 3.. 并行运行......我在不到 15 分钟的时间内运行了包含 800 多个模块的构建(8000 多个单元测试)等,以及安全扫描等。

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


【解决方案1】:

看来你想重用 Maven 缓存,实际上我最近也发生了同样的事情,我发现我的一个项目总是重新编译模块,但其他项目没有。 maven-compiler-plugin的版本是3.6.0。

事实上,maven-compiler-plugin 3.1 中存在一个已知错误。相关问题https://issues.apache.org/jira/browse/MCOMPILER-209。如果您没有使用该版本,您可以检查项目中是否有一个从不编译为类文件的空 java 文件。或者里面可能只有 cmets。

例如

/*
 * I will write some code in the future
 */
package foo;

您可以通过-X运行Maven来使用调试模式,并查看输出消息,这对调试Maven并找到原因非常有帮助。

对我来说,这个空文件是 Maven 总是重新编译模块的原因,所以删除那个文件对我有用。

【讨论】:

    猜你喜欢
    • 2012-12-19
    • 1970-01-01
    • 2017-07-04
    • 2020-05-16
    • 2021-01-09
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    相关资源
    最近更新 更多