Java模块:添加模块时能否仅引入所需包而非整个模块?
关于Java自定义运行时镜像引入java.desktop模块的疑问解答
首先明确结论:你必须引入整个java.desktop模块,没办法只单独引入其中的某个或某几个包。
原因很直接:
- Java模块系统(JPMS)从设计上就以模块为最小的依赖和分发单元,模块是不可拆分的原子体。每个模块里的所有包都是作为一个整体被声明、导出和依赖的,不存在拆分模块只取部分包的操作方式。
- 你的Spring Boot应用没有
module-info.java,属于未模块化应用,在jlink构建运行时镜像时会被当作自动模块处理。自动模块对依赖的引用只能是完整的模块,没法指定模块内的子集。而且jlink工具本身也不支持只打包模块的部分内容,它只能以完整模块为单位构建镜像。
如果想尽可能缩小镜像体积,可以试试这些方案:
- 先仔细排查你的应用到底用到了java.desktop里的哪些功能,确认是否真的必须依赖这个模块。比如如果只是用到了ImageIO这类IO相关功能,看看有没有非桌面模块的替代实现?
- 如果确实离不开java.desktop,可以用jlink的
--strip-debug参数移除调试信息,或者用jpackage配合压缩参数来减小最终镜像的大小。另外Spring Boot本身也有瘦身打包的方案(比如移除不必要的依赖),可以结合起来优化。
内容的提问来源于stack exchange,提问作者neblaz
相关产品推荐
相关产品推荐

