【发布时间】:2020-07-31 01:03:21
【问题描述】:
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 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