Java 模块系统(JPMS)与原生打包(jlink/jpackage)

共 21 题
#

1. JPMS 模块系统(Jigsaw)解决的核心问题,强封装与显式依赖

A JPMS 通过 exports 强封装(未导出包不可见)、requires 显式依赖(模块图明确),解决类路径地狱与封装问题 ✓ 正确答案
B classpath 已足够
C JPMS 只解决性能
D 无强封装
#

2. module-info.java 的 module/requires/exports/opens 声明语法与模块描述符

A module-info 只声明模块名
B 无 opens
C module-info.java 是模块描述符,用 module/requires/exports/opens/uses/provides 声明模块名、依赖、导出/开放、服务 ✓ 正确答案
D 无 provides
#

3. 模块可读性(readability)与 requires transitive 如何影响编译与运行

A transitive 只影响运行
B requires transitive 使下游模块自动可读传递依赖,简化依赖声明,影响编译可见性与运行模块图 ✓ 正确答案
C 无传递
D 下游需显式 requires
#

4. 未命名模块与类路径(classpath)兼容机制,自动模块(automatic module)如何生成模块名

A classpath 属未命名模块
B classpath 属未命名模块(可读所有模块),非模块化 jar 放 module path 成自动模块(导出所有包),模块名用 Automatic-Module-Name 或文件名推导 ✓ 正确答案
C 自动模块不导出
D 未命名模块不可读
#

5. exports 与 opens 的区别,反射访问为何依赖 opens 而不是 exports

A exports 允许编译期正常访问,opens 允许运行时反射访问(setAccessible 私有成员),反射框架依赖 opens 而非 exports ✓ 正确答案
B opens 用于编译期
C exports 允许反射
D 两者相同
#

6. 限定导出 exports ... to 与限定打开 opens ... to,如何把内部 API 仅暴露给白名单模块,与全局导出的安全差异

A exports ... to 全局导出
B 无白名单
C exports/opens ... to 指定白名单模块(只对它们可见/可反射),比全局导出更安全(最小暴露) ✓ 正确答案
D 与全局相同
#

7. --add-opens/--add-exports/--add-modules 在迁移遗留应用时的使用边界与安全风险

A 用于迁移访问强封装内容,但过度开放削弱封装、增安全风险,应最小化并迁移到公开 API ✓ 正确答案
B 无安全风险
C 应广泛开放
D 无边界
#

8. Module Layer 与模块解析(resolve)流程,ServiceLoader 的 provides/uses 声明如何协作

A provides/uses 不参与模块
B ServiceLoader 不用模块图
C 模块解析按 requires 构建模块图到 Module Layer,provides/uses 声明让 ServiceLoader 在模块图查找服务实现 ✓ 正确答案
D 无 provides
#

9. 模块化应用与 Spring Boot 可执行 jar(非模块化)的边界,为何多数 Spring Boot 应用仍是 classpath 而非 module path

A Spring Boot 默认 module path
B Spring Boot 已模块化
C 无边界
D 多数 Spring Boot 应用因第三方库未模块化、fat jar 与模块不兼容、反射与强封装冲突,默认 classpath 而非 module path ✓ 正确答案
#

10. jlink 定制运行时镜像的裁减原理,--add-modules/--strip-debug/--compress 的工程价值

A jlink 打包完整 JDK
B jlink 按模块依赖生成定制镜像,--add-modules 只含所需模块、--strip-debug 去调试、--compress 压缩,体积小自包含 ✓ 正确答案
C 无裁减
D --add-modules 不限制模块
#

11. jpackage 打包原生安装包(msi/dmg/deb)的流程与运行时裁剪配合

A jpackage 需用户装 JDK
B jpackage 打包原生安装包(msi/dmg/deb),配合 jlink 裁减运行时生成自包含应用,无需用户装 JDK ✓ 正确答案
C jpackage 不裁减
D 只支持 jar
#

12. 模块图(module graph)与循环依赖检测,模块系统如何从根源阻止模块间循环

A 模块解析构建模块图并检测循环,模块依赖必须是 DAG,循环依赖编译/运行期报错,从根源阻止 ✓ 正确答案
B 模块可循环依赖
C 循环依赖允许
D 无检测
#

13. 强封装对反射框架(Spring/Hibernate/Jackson)的影响,为何 JDK 17+ 需要维护 --add-opens 清单

A 强封装不影响反射
B 框架无反射
C 无需清单
D JDK 17+ 强封装限制反射访问 JDK 内部,反射框架需 --add-opens 清单开放所需包,否则反射抛异常 ✓ 正确答案
#

14. module-info 中的版本化模块与 Maven 坐标(groupId/artifactId/version)的映射关系

A 模块名含版本
B 模块名含 groupId
C 版本写入 module-info
D module-info 模块名通常等于 artifactId,groupId/version 由 Maven 管理(不写入 module-info),版本由构建管理 ✓ 正确答案
#

15. jdeps 在模块化迁移中的用法,分析 jar 依赖、生成 module-info 建议并输出 jlink 所需的最小模块集

A jdeps 分析 jar 依赖、--generate-module-info 生成 module-info 建议、--print-module-deps 输出最小模块集,辅助模块化迁移与 jlink ✓ 正确答案
B jdeps 只分析运行
C 无迁移辅助
D 不输出模块集
#

16. --patch-module 的用途与边界,测试与热修复时覆盖模块内类,与 classpath 覆盖、jlink 镜像修改的区别

A 与 classpath 覆盖相同
B 无边界
C 只能打包时
D --patch-module 运行时覆盖模块类(测试/热修复),比 classpath 覆盖可靠,且不改 jlink 镜像(动态补丁) ✓ 正确答案
#

17. 多版本 jar(Multi-Release JAR)与 META-INF/versions 的机制与应用场景

A MR-JAR 所有版本一样
B MR-JAR 的 MANIFEST 声明 Multi-Release,META-INF/versions/<version> 按 JDK 版本提供类实现,用于库跨版本兼容并利用新特性 ✓ 正确答案
C 无版本目录
D 只支持一个版本
#

18. 模块描述符的 uses/provides 声明与 SPI 的编译期校验

A 无编译期校验
B 校验只在运行
C uses/provides 声明模块化 SPI,javac 编译期校验服务接口/实现类存在、类型正确,保证 SPI 声明安全 ✓ 正确答案
D 实现无需实现接口
#

19. Project Jigsaw 的模块化迁移策略,自上而下(top-down)与自下而上(bottom-up)两条路径

A 只能一次性迁移
B 自上而下先模块化应用顶层(底层用自动模块过渡),自下而上先模块化底层库,渐进式迁移用自动模块过渡 ✓ 正确答案
C 无过渡
D 两条路径相同
#

20. JMOD 格式与 jmod 工具,模块打包与 jar 的差异(含 native 代码与 legal 文件),何时使用 jmod

A jmod 与 jar 相同
B jmod 无 native
C jmod 用于运行期
D jmod 可含 native 代码/legal 文件,用于 jlink/编译期/系统模块,运行期用 jar;含 native 的模块用 jmod ✓ 正确答案
#

21. jpackage 的启动器配置,--java-options 注入堆大小等 JVM 参数、图标与安装包元数据,以及跨平台打包的差异

A jpackage 无 JVM 参数
B 跨平台无差异
C 无图标配置
D --java-options 注入 JVM 参数、--icon/--app-version 配置图标元数据,跨平台差异(Windows msi/exe、macOS dmg、Linux deb/rpm)按平台生成 ✓ 正确答案