如何强制Windows应用安装时使用捆绑JRE而非其他JRE?
我在Windows系统中使用响应文件对某应用的多个版本进行独立无人值守安装,该安装包自带捆绑JRE。目前发现安装程序会记录已安装的JRE,后续安装同应用时会优先引用这些JRE,无对应记录时才会使用系统已安装的JRE。
我希望强制每次安装都忽略其他JRE,仅安装并使用安装包自带的捆绑JRE,且无法重新生成安装程序。但现在只要检测到同应用之前安装的JRE或系统JRE,安装程序就会优先选用它们,且似乎没有现成选项能强制启用捆绑JRE。
文档提及的JRE搜索顺序:
除了搜索具有相同应用ID的先前安装、Windows注册表、知名标准安装位置和环境变量中的路径外……
我已尝试在安装前删除注册表中的ej-technologies项,可忽略同应用之前安装的JRE,但无法屏蔽系统JRE;取消设置JAVA_HOME、移除PATH中的相关引用也无效。
想请教三个问题:
- 是否有我遗漏的安装程序选项?
- 若没有,有什么办法能让安装程序认为无可用JRE,从而安装捆绑JRE?
- 安装程序会在哪些位置查找系统JRE?(知晓查找方式的话我可以尝试解决)
1. 可能遗漏的安装程序选项
先检查响应文件中是否存在类似USE_BUNDLED_JRE=1、FORCE_BUNDLED_JAVA=true这类参数——这类是ej-technologies系安装程序(比如Install4j打包的程序)常用的强制启用捆绑JRE的配置项,若响应文件里没加,直接追加测试即可。
另外,部分安装程序支持命令行参数,比如在调用安装程序时追加-Dinstall4j.jvmDir=<安装包内捆绑JRE的相对路径>或者--force-bundled-jre,可以直接在无人值守执行命令里加上试试。
2. 让安装程序认为无可用JRE的临时方案
如果没有现成选项,可尝试临时屏蔽系统JRE的注册表和安装目录:
- 注册表层面:临时重命名系统JRE的核心注册表项,比如
HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft和HKEY_CURRENT_USER\SOFTWARE\JavaSoft,安装完成后再改回原名。操作前务必备份注册表,避免出错。 - 文件系统层面:临时重命名系统JRE的安装目录(比如
C:\Program Files\Java下的JRE文件夹),安装完成后恢复。注意该方法需确保无其他依赖JRE的程序正在运行,否则会报错。 - 环境变量补充:除了
JAVA_HOME和PATH,还要检查JRE_HOME这类可能的关联变量,临时清空或设置为不存在的路径,安装后再恢复。
3. 安装程序查找系统JRE的常见位置
结合文档描述和ej-technologies系程序的常规逻辑,系统JRE的查找路径一般包括:
- 注册表项:
HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment(32位系统或64位安装程序对应的64位项)HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Java Runtime Environment(64位系统上的32位安装程序会查这个)HKEY_CURRENT_USER\SOFTWARE\JavaSoft\Java Runtime Environment(当前用户独立安装的JRE)
- 标准安装目录:
C:\Program Files\Java\jre*(64位JRE的默认路径)C:\Program Files (x86)\Java\jre*(32位JRE的默认路径)- 部分程序还会排查
C:\Program Files\ej-technologies\install4j\jre这类关联目录
- 环境变量:除了
JAVA_HOME、JRE_HOME,还会遍历PATH中所有包含java.exe的路径
内容的提问来源于stack exchange,提问作者jmichaud

