Java 8u171/172 javapackager打包的Native bundle含大量冗余DLL?
关于Java 8u161 vs 8u171/172打包Native Bundle时的DLL差异及必要性分析
我来梳理下你遇到的这个Native打包DLL差异的问题,结合你提到的细节和实际测试情况拆解如下:
不同Java 8版本的打包产物差异
你通过命令:javapackager.exe -deploy -native image -srcfiles <files> -appclass <class> -outdir out -outfile test为Jar文件生成Native bundle时,不同JDK版本的输出差异很显著:
- Java 8u161:打包后的bundle仅包含
msvcp140.dll、packager.dll、vcruntime140.dll,但存在msvcr100.dll缺失的问题(对应Bug JDK-8191176) - Java 8u171/172:生成的
bundles/AppName/文件夹里多出大量api-ms-win-*系列DLL,且这些DLL大多也存在于JDK安装目录的runtime/bin/下
- Java 8u161:打包后的bundle仅包含
差异的根源
你提到的OpenJDK提交552ad0172a8c确实是核心原因——这个提交特意将这些api-ms-win-*DLL加入到打包产物中,初衷应该是为了兼容更多Windows系统环境,避免因系统依赖库缺失导致应用无法启动的问题。额外DLL的必要性探讨
从你实际测试的结果来看,移除这些api-ms-win-*DLL后应用仍能正常运行,但这里需要注意几个关键问题:- 你的测试环境大概率已经预装了这些DLL依赖的系统组件(比如Windows更新推送的通用CRT库),所以移除后不会影响运行
- 如果用户使用的是较老旧的Windows版本(比如未安装最新补丁的Win7),或者系统缺少相关基础库,移除这些DLL可能会直接导致应用启动失败
- 目前没有官方文档明确界定这些DLL的必要性,所以全场景的兼容性确实无法100%保证
内容的提问来源于stack exchange,提问作者user2375667




