Maven 与构建工具

共 58 题
#

1. GitHub Actions 的 workflow/job/step/runner 模型如何组织,actions/cache 与依赖缓存如何加速 Maven/Gradle 构建

A actions/cache 的 key 使用 hashFiles 对 POM 求哈希,可让 POM 变化时自动重建缓存 ✓ 正确答案
B 一个 job 内的多个 step 可以并行执行以加速构建
C Maven 构建永远不需要网络,全部依赖都内嵌在仓库中
D workflow 中的所有 job 必须串行执行,不能并行
#

2. Maven 4.0 中 mvn -Daot.enabled=true 在 Spring Boot 4.0 AOT 处理流程中的阶段划分

A AOT 在编译期提前完成类路径扫描与 Bean 定义分析,从而减少运行时启动开销 ✓ 正确答案
B AOT 编译能完全消除运行时反射,所有代码无需额外配置
C AOT 与 JIT 完全相同,只是名称不同
D 启用 AOT 后 Spring 容器不再运行,所有功能都用静态代码实现
#

3. Maven 4.0 中如何配置 -DskipTests 与 -Dmaven.test.skip 的差异及与 Spring Boot Test 的关系

A 两者效果完全相同,都跳过测试编译与执行
B `-DskipTests` 只影响单元测试,不影响集成测试
C `-DskipTests` 跳过测试执行但会编译测试类,`-Dmaven.test.skip` 连编译也跳过 ✓ 正确答案
D `-Dmaven.test.skip` 会让测试类被编译但不会执行
#

4. Maven 4.0 在 Spring Boot 4.0 构建中默认引入的 Gradle 兼容 CLI 模式与 pom 结构差异

A 消费者 POM 包含所有构建私有配置,与构建 POM 完全相同
B 构建 POM 只用于 Android 项目,不适用于 Spring Boot
C Gradle 兼容 CLI 模式会移除现有 pom.xml 的所有功能
D 消费者 POM 是发布给下游消费的简化模型,构建私有配置不污染下游 ✓ 正确答案
#

5. Maven 4.0 引入的 --update-snapshots 与 --fail-on-warning 在 CI 中对 Spring Boot 镜像构建的影响

A `--update-snapshots` 会跳过所有依赖下载以加快构建
B `--fail-on-warning` 将构建警告升级为失败,可作质量门禁 ✓ 正确答案
C 两个参数只影响测试执行,不影响构建结果
D `--update-snapshots` 与 RELEASE 依赖的更新无关,只影响本地文件
#

6. Maven 4.0 引入的独立版本元数据与 Maven Central 索引同步的离线构建策略

A 离线构建完全无需本地仓库,每次从远程实时拉取
B 独立版本元数据与 Central 索引同步,配合本地缓存与校验和可支持可信的离线构建 ✓ 正确答案
C Maven 4.0 移除了所有版本元数据,仅依赖传递依赖
D 离线构建会跳过依赖解析,导致构建永远失败
#

7. Maven 4.0 中 .mvn/maven.config 的加载机制对 Spring Boot CI 流水线的兼容影响与迁移建议

A Maven 4.0 移除了 `.mvn/maven.config` 自动加载,CI 必须改用其他方式
B Maven 4.0 仍支持 `.mvn/maven.config`,但 CI 用显式参数或 `MAVEN_ARGS` 环境变量传递默认配置更可预测 ✓ 正确答案
C 该变更只影响 macOS,不影响 Linux CI
D `.mvn/maven.config` 只控制 JVM 堆内存,与参数无关
#

8. Maven Archetype 生成 Spring Boot Starter 自定义脚手架的字段校验与版本约束模板

A 版本约束模板与 pom.xml 无关
B Archetype 只能生成静态文件,无法包含版本占位符
C 字段校验必须在外部脚本中完成,Archetype 不支持
D archetype-metadata.xml 用于定义生成参数及其校验规则 ✓ 正确答案
#

9. Maven Compiler Plugin 配置 -parameters 编译参数对 Spring MVC 参数绑定的影响

A 它让字节码保留方法参数名,Spring MVC 可据此按名称绑定参数 ✓ 正确答案
B 它只影响运行时性能,不影响参数绑定
C 它与 `-g` 调试信息完全等价,无任何区别
D 开启后 Spring 无法再使用 `@RequestParam` 显式指定名称
#

10. Maven Surefire 与 Failsafe 在 JUnit 5 + Spring Boot Test 集成测试场景下的并行执行配置

A JUnit 5 并行执行需显式开启,并注意 Spring 上下文缓存与共享资源的并发安全 ✓ 正确答案
B Surefire 与 Failsafe 都绑定 `verify` 阶段
C Failsafe 只执行单元测试,不执行集成测试
D 并行执行无需任何配置,JUnit 5 默认开启
#

11. Maven Toolchains 如何让构建进程与编译、测试所用 JDK 解耦,CI 节点应如何校验工具链

A Toolchains 只能使用一个固定的 JDK,无法多版本
B Toolchains 让构建进程与编译/测试所用 JDK 解耦,由 toolchains.xml 声明可用 JDK ✓ 正确答案
C Toolchains 与编译无关,只影响测试报告
D CI 无需校验工具链,构建失败会自动重试
#

12. Maven Wrapper 的 JAVA_HOME 与 Spring Boot 4.0 多 JDK 版本构建矩阵的兼容配置

A mvnw 通过 JAVA_HOME 定位 Maven 启动所用的 JDK,CI 矩阵可据此切换 JDK 版本 ✓ 正确答案
B mvnw 固定只能使用 JDK 8,无法升级
C 多 JDK 矩阵无需设置 JAVA_HOME,Maven 会自动选择
D Maven Wrapper 与 JDK 版本完全无关
#

13. Maven 与 Spring Boot 4.x 的兼容性(Spring Boot 4.x 要求 Maven 3.6.3+)

A Spring Boot 4.x 不依赖 Maven,任何版本都可以
B Spring Boot 4.x 要求 Maven 3.6.3 及以上版本 ✓ 正确答案
C Spring Boot 4.x 只支持 Maven 2.x
D Maven 版本只影响打包,不影响编译
#

14. Maven 多模块(Multi-Module)项目结构在 Spring Boot 3.5+ 微服务拆分的工程价值

A 多模块通过父子 POM 实现统一版本管理与公共代码复用,降低耦合 ✓ 正确答案
B 多模块会让每个模块必须独立部署成独立服务
C 多模块无法管理依赖版本,只能手动指定
D 多模块只适用于传统单体,不适合微服务
#

15. Spring Boot 3.5+ 的镜像构建的工程价值

A 镜像构建与可移植性、供应链安全无关
B 它必须依赖外部 Docker 守护进程,无法离线
C 它只能生成不可运行的静态文件
D 它通过 Buildpacks 生成镜像,无需手写 Dockerfile,且分层合理 ✓ 正确答案
#

16. 使用 Maven Enforcer Plugin 在 Spring Boot 4.0 项目中禁止某些依赖版本与 License 检查的工程实践

A 它用于生成文档,与依赖合规无关
B 它只能检查 Maven 版本,无法检查依赖
C 它只在本地生效,CI 无法执行
D 它通过 bannedDependencies 等规则禁止某些依赖版本并执行 License 检查 ✓ 正确答案
#

17. 构建缓存(~/.m2/Gradle Cache)与加速

A 缓存命中后不符合要求的构建也能通过
B 缓存只影响测试,不影响编译
C Gradle 没有依赖缓存,只能在线下载
D Maven 本地仓库复用已下载依赖,Gradle 构建缓存可缓存任务输出并跨机器复用 ✓ 正确答案
#

18. CI 制品版本如何与 Git commit、构建时间等 build metadata 绑定,保证制品可追溯与可复现构建

A 可复现构建不要求固定依赖版本
B 版本号只需递增,无需关联任何源码信息
C 通过 git-commit-id-plugin 等把 commit、时间戳写入版本,使制品可追溯到源码 ✓ 正确答案
D build metadata 只对前端有用,与 Java 制品无关
#

19. Gradle 在 Android 与大型 Spring 项目中相比 Maven 的构建性能与 DSL 灵活性优势

A Gradle 不支持并行构建,性能不如 Maven
B Gradle 的 XML 配置比 Maven 更灵活
C Gradle 通过任务级增量构建、守护进程与 Kotlin DSL 提升性能与灵活性 ✓ 正确答案
D Gradle 只能在 Android 中使用,不适用于 Spring
#

20. Gradle 的 build.gradle 与 settings.gradle

A settings.gradle 只用于配置任务,build.gradle 只用于声明模块
B settings.gradle 声明项目结构与仓库,build.gradle 配置模块的依赖与任务 ✓ 正确答案
C 两者作用完全相同,可混用
D Gradle 不需要 settings.gradle,单文件即可构建所有项目
#

21. Maven 3.9+ 的 maven-resolver 增量构建与并行构建性能优化

A 增量构建会自动跳过依赖解析,导致错误
B Maven 3.9+ 移除了并行构建支持
C maven-resolver 改进依赖解析,配合 -T 并行构建可缩短多模块构建时间 ✓ 正确答案
D 并行构建与编译毫无关系
#

22. Maven 4 的构建 POM 与消费者 POM 分离旨在解决什么问题,迁移前应验证哪些插件兼容性

A 消费者 POM 与构建 POM 内容完全相同
B 分离旨在避免构建私有配置污染下游,迁移前需验证插件兼容性与依赖树变化 ✓ 正确答案
C 分离只影响本地缓存,不影响发布
D 迁移无需验证任何东西,自动兼容
#

23. Maven 4.0 与 Gradle 8.x 在 Spring Cloud Alibaba 多模块场景下的构建速度对比

A Gradle 任务级缓存与增量构建通常更快,但 Maven 生态更成熟、配置更规范 ✓ 正确答案
B Gradle 一定比 Maven 慢,因为缺少守护进程
C 两者构建速度完全相同,无差异
D Maven 4.0 不支持多模块构建
#

24. Maven Wrapper 的 distributionUrl 与校验和应如何审查,怎样防止构建工具本身被替换

A 应审查 distributionUrl 使用可信 HTTPS 源,并配置 distributionSha256Sum 校验发行包 ✓ 正确答案
B distributionUrl 可以指向任意地址,无需校验
C Wrapper 不下载任何东西,无需担心被替换
D 校验和只影响性能,与安全无关
#

25. Maven Wrapper(mvnw)与版本对齐

A mvnw 按 properties 下载并固定 Maven 版本,使团队与 CI 构建一致 ✓ 正确答案
B mvnw 只是脚本别名,不固定版本
C Wrapper 只对 Windows 系统有效
D Wrapper 会忽略本地已安装的 Maven
#

26. Maven dependency:tree 与 dependency:analyze 在依赖冲突排查的工程价值

A tree 会直接删除冲突依赖
B 两者都只能查看冲突,无法清理
C analyze 用于生成文档,与依赖无关
D tree 查看依赖树定位冲突,analyze 检测未使用/未声明依赖以精简依赖 ✓ 正确答案
#

27. Maven 与 Gradle 的差异(Groovy/Kotlin DSL)

A Maven 用 XML 声明式、约定优于配置,Gradle 用可编程的 Groovy/Kotlin DSL 更灵活 ✓ 正确答案
B Maven 比 Gradle 更灵活,因为 XML 可编程
C 两者都只能用 XML,无差异
D Gradle 不支持自定义任务
#

28. Maven 依赖调解(Dependency Mediation)规则

A dependencyManagement 无法覆盖调解结果
B 总是选择版本号最高的依赖
C 调解规则与依赖树无关
D 默认最近路径优先,深度相同时先声明者优先,可用 dependencyManagement 显式覆盖 ✓ 正确答案
#

29. Maven 多模块(multi-module)与聚合(aggregation)

A 聚合只影响部署,不影响构建
B 聚合就是继承,二者完全相同
C 多模块不需要父 POM 管理依赖
D 聚合用 <modules> 统一构建,继承用 <parent> 统一配置,二者常结合使用 ✓ 正确答案
#

30. Maven 插件(compiler/surefire/shade)

A surefire 只负责打包,不执行测试
B 三个插件都负责编译
C compiler 负责编译、surefire 执行单元测试、shade 打 Fat Jar ✓ 正确答案
D shade 插件与依赖无关
#

31. Maven 的 BOM(BOM import)管理

A BOM 只能用于单个依赖,无法管理多个
B BOM 会直接引入所有依赖到类路径
C import 后 BOM 中依赖版本失效
D BOM 通过 dependencyManagement 声明一组版本,用 import 引入可统一生态版本 ✓ 正确答案
#

32. Maven 的 Profile 与多环境构建

A Profile 与 JDK 版本无关
B Profile 只能激活一次,无法覆盖
C Profile 按条件激活并覆盖配置,配合资源过滤可支持多环境构建 ✓ 正确答案
D 多环境只能靠修改源码实现
#

33. Maven 的 SNAPSHOT 与 RELEASE 版本

A SNAPSHOT 与 RELEASE 完全等价
B SNAPSHOT 是可变的开发版本,RELEASE 是稳定不可变版本,正式发布应使用 RELEASE ✓ 正确答案
C RELEASE 版本可以随时被覆盖
D SNAPSHOT 适合生产环境使用
#

34. Maven 的 dependencyManagement 与 pluginManagement

A dependencyManagement 会自动把所有依赖加入类路径
B 二者都只提供默认版本/配置,不主动引入依赖或执行插件 ✓ 正确答案
C pluginManagement 会自动执行所有插件
D 二者用于生成文档,与依赖无关
#

35. Maven 的 dependencyManagement/BOM(Bill of Materials)在依赖版本统一管理的作用

A 与版本冲突无关
B 它会自动引入全部依赖到类路径
C 版本升级必须逐模块手动改
D 集中管理依赖版本、避免漂移与冲突,BOM 可跨项目复用 ✓ 正确答案
#

36. Maven 的 enforcer-plugin 与规则校验

A 它无法校验依赖
B 它只输出警告,不阻止构建
C 它用于生成测试报告
D enforce 目标执行 requireJavaVersion、bannedDependencies 等规则,违规即构建失败 ✓ 正确答案
#

37. Maven 的 flatten-maven-plugin 与版本收敛

A 它会保留所有 profile 与构建私有配置
B 它只作用于本地构建,不影响发布
C 它把构建 POM 扁平化为干净 POM 发布,并替换 CI-friendly 版本变量 ✓ 正确答案
D 它与版本解析无关
#

38. Maven 的 maven-archetype 与项目骨架

A 它用于编译代码,与骨架无关
B 它只能生成空项目,无法定制
C 它用模板按参数生成项目骨架,自定义 archetype 用 metadata 与占位符定义 ✓ 正确答案
D 它只能生成测试文件
#

39. Maven 的 maven-deploy-plugin 与制品发布

A 发布无需配置仓库地址
B deploy 只打包到本地,不发布
C deploy 目标按 distributionManagement 配置把制品上传到远程仓库 ✓ 正确答案
D deploy 与版本管理无关
#

40. Maven 的 profile 多环境构建与 resource filtering 在配置管理的工程取舍

A profile 与资源配置无关
B 所有配置都必须在构建期注入,外部化不安全
C resource filtering 在构建期注入配置,但过多 profile 降低可维护性,敏感配置更适合外部化 ✓ 正确答案
D resource filtering 只能用于代码,不能用于配置文件
#

41. Maven 的 versions-maven-plugin 与依赖升级

A 升级后无需测试即可发布
B 它只能查看依赖,无法修改
C 它用于编译代码,与版本无关
D 它可查看可升级版本并批量修改 pom 版本,辅助依赖升级 ✓ 正确答案
#

42. Maven 依赖范围 scope 的 compile/test/runtime/provided/system 取值

A test 依赖在运行期也可用
B provided 编译期可见、运行期由容器提供,不打入可执行 JAR ✓ 正确答案
C runtime 依赖编译期也必须可见
D system 与 provided 完全相同
#

43. Maven 的坐标(groupId/artifactId/version)

A 坐标只用于本地文件,与仓库无关
B groupId/artifactId/version 唯一标识制品,是依赖解析与仓库定位的基础 ✓ 正确答案
C artifactId 必须唯一,groupId 可有可无
D version 不影响依赖解析
#

44. Maven 私服(Nexus/Artifactory)的工程价值

A 私服会降低构建速度
B 私服只能存储,无法下载
C 私服托管私有制品、代理并缓存中央仓库,加速构建并统一制品管理 ✓ 正确答案
D 私服与制品共享无关
#

45. Maven 镜像配置 settings.xml 在阿里云镜像与公司私服之间的优先级与 HTTPS 校验策略

A 镜像只影响 Windows,不影响 Linux
B 镜像会覆盖所有仓库包括私服,无需独立配置
C HTTPS 校验可随意关闭,不影响安全
D 镜像通过 mirrorOf 重定向外部仓库请求,私服作为独立仓库声明,HTTPS 应严格执行证书校验 ✓ 正确答案
#

46. Tekton / Dagger 在云原生 CI 流水线中的声明式构建模型

A Tekton 用 K8s CRD 声明流水线,Dagger 用可编程 DAG,均强调可复用与并行 ✓ 正确答案
B 二者都是脚本式 CI,无声明式能力
C Tekton 只能运行在本地,无法上云
D Dagger 无法并行执行任务
#

47. flatten-maven-plugin 如何区分构建 POM 与发布给消费者的 POM,CI-friendly 版本变量怎样解析

A 发布 POM 保留所有占位符供下游解析
B 构建时保留完整 POM,发布时生成扁平 POM 并替换 ${revision} 为实际版本 ✓ 正确答案
C 它无法区分构建与消费者 POM
D CI-friendly 变量与发布无关
#

48. 使用 Maven Shade Plugin 打 Fat JAR 与 Spring Boot Loader 在 JDK 25 模块化下的差异

A 两者完全一样,无差异
B Shade 直接合并依赖,Spring Boot Loader 用嵌套 Jar 类加载器,模块化下需留意模块描述符兼容 ✓ 正确答案
C Spring Boot Loader 不支持类加载
D Shade 与模块化无关,无需考虑
#

49. 使用并行构建时,插件的 threadSafe 声明意味着什么,共享输出目录会引发哪些竞态

A threadSafe 表明插件可安全并发,共享输出目录并发写入会产生覆盖与结果不确定 ✓ 正确答案
B 所有插件默认 threadSafe,无需声明
C 共享输出目录不会引发任何问题
D 并行构建与线程安全无关
#

50. 可重复构建如何控制输出时间戳、文件顺序和环境变量,怎样验证两次制品逐字节一致

A 无法验证两次构建是否一致
B 可复现构建只要求单元测试通过
C 时间戳不影响产物一致性
D 需固定时间戳、文件顺序与环境变量,用哈希对比两次构建产物验证逐字节一致 ✓ 正确答案
#

51. 在 CI 流水线中使用 Maven Daemon(mvnd)

A mvnd 复用常驻 JVM 与缓存,缩短重复构建时间,适合 CI ✓ 正确答案
B mvnd 每次构建都冷启动,无提速
C mvnd 只能用于本地,不能用于 CI
D mvnd 与 Maven 完全无关
#

52. 构建报告与 Test Report 的发布

A Failsafe 不生成任何报告
B 测试报告只能本地查看,无法上传
C 报告与构建质量无关
D Surefire/Failsafe 生成测试报告,CI 收集展示并作为质量门禁依据 ✓ 正确答案
#

53. 构建矩阵(matrix)与多环境构建

A 矩阵只能构建一个环境
B 矩阵在 JDK/OS 等组合上并行构建,覆盖多环境,但需控制组合数量 ✓ 正确答案
C 矩阵与兼容性验证无关
D 矩阵会减少构建次数
#

54. 构建节点的资源限制与并行执行

A 节点 CPU/内存决定并行度,资源不足时过度并行会引发 OOM 或构建变慢 ✓ 正确答案
B 并行度与资源无关,可无限加大
C 内存不足不影响并行构建
D 并行执行总会更快,无需监控
#

55. 流水线构建状态徽章与质量门禁

A 徽章会强制发布不合格产物
B 徽章展示构建状态,质量门禁在条件不达标时阻断发布 ✓ 正确答案
C 质量门禁只用于展示,不阻断
D 二者无实际作用
#

56. Maven Javadoc Plugin 在 JDK 25 + Project Leyden 下生成的离线文档与模块描述符的协同

A Javadoc 与模块无关
B Javadoc 生成离线模块文档,应与 module-info 的导出边界保持一致 ✓ 正确答案
C 模块化项目无法生成 Javadoc
D 离线文档不需要模块信息
#

57. 依赖校验和、制品签名与 SBOM 各能证明什么,供应链校验为何不能只依赖 HTTPS 仓库

A 校验和与签名作用相同
B HTTPS 已能保证仓库内容绝对可信
C 校验和证完整性、签名证来源、SBOM 证成分,HTTPS 只保证传输加密无法保证内容可信 ✓ 正确答案
D SBOM 与供应链安全无关
#

58. 在 GraalVM Native Image 下使用 Maven 构建 Spring Modulith 模块化应用的配置最小集

A Modulith 与原生构建无关
B Native Image 无需反射配置,自动处理
C 需开启 AOT、配置 native 插件,并声明反射/资源 hint 保证原生运行 ✓ 正确答案
D 只需要一个插件即可,无需 hint