不模块化代码的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.
相关产品推荐
相关产品推荐

