You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不模块化代码的Java应用如何构建适配的精简私有JRE 9?

如何构建适配非模块化Java应用的精简JRE 9私有捆绑包

嘿,刚好做过类似的需求,给你梳理一套可行的方案——核心就是用JDK 9自带的jlink工具,它专门用来创建自定义的精简运行时镜像,完美适配你的非模块化Java 8应用场景,不用改代码也能搞定。

步骤1:分析应用依赖的JDK模块

因为你的应用没有模块化(没有module-info.java),首先得搞清楚它到底依赖JDK 9里的哪些核心模块。用JDK自带的jdeps工具就能搞定:

jdeps --print-module-deps --ignore-missing-deps your-application.jar
  • --print-module-deps:直接输出依赖的JDK模块列表(用逗号分隔)
  • --ignore-missing-deps:忽略第三方库(如果有的话)未模块化导致的依赖分析错误,只聚焦JDK本身的依赖

举个例子,如果你的应用只用到基础IO、集合和JDBC,输出可能是java.base,java.sql。

步骤2:用jlink构建精简JRE

拿到依赖模块列表后,就可以用jlink生成只包含这些模块的私有JRE了:

jlink --module-path $JAVA_HOME/jmods \
      --add-modules [第一步得到的模块列表] \
      --output custom-jre-9 \
      --strip-debug \
      --compress=2

逐个解释参数:

  • --module-path $JAVA_HOME/jmods:指定JDK 9的模块文件目录(默认在JDK安装路径下的jmods文件夹)
  • --add-modules:填入第一步jdeps输出的模块列表,比如java.base,java.sql
  • --output custom-jre-9:指定精简JRE的输出目录
  • --strip-debug:移除调试符号,大幅减小体积
  • --compress=2:启用最高级别压缩(0=无压缩,1=常量池压缩,2=全压缩)

步骤3:测试精简JRE的可用性

生成完成后,用这个私有JRE运行你的应用验证:

# Windows系统
custom-jre-9\bin\java.exe -jar your-application.jar

# Linux/macOS系统
custom-jre-9/bin/java -jar your-application.jar

如果运行时出现NoClassDefFoundError或者ModuleNotFoundError,说明jdeps可能漏分析了某个模块,你可以手动把对应的模块添加到--add-modules参数里再重新构建。比如如果用到了XML处理,可能需要加上java.xml模块。

额外优化小贴士

  • 平台一致性:jlink生成的JRE是平台相关的,比如在Windows上构建的只能在Windows用,要给不同系统打包的话,得在对应系统上执行构建命令。
  • 排除冗余模块:如果确定应用完全用不上某些模块(比如你的应用没GUI,那java.desktop肯定可以排除),可以在--add-modules里不包含它们,进一步缩小体积。
  • 第三方库处理:如果应用依赖第三方JAR,只要这些库能在JRE 9上运行(Java 9兼容大部分Java 8库),直接把它们和你的应用JAR一起放在类路径下运行就行,不用改库的代码。

这样构建出来的精简JRE 9,体积会比完整JRE 9小很多,甚至可能接近JRE 8的大小,同时还能让用户用JRE 9运行你的应用,又不用改现有代码保持Java 8兼容性。

内容的提问来源于stack exchange,提问作者Thomas S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:53:24