install4j:强制启动程序 (EXE) 使用捆绑的 JRE 文件夹中的 DLL
install4j: Force a launcher (EXE) to use DLLs from bundled JRE folder
我们在应用程序中使用了 install4j 8.0.8。自应用程序的新版本发布以来,我们使用 Azul 的 JRE 11.0.10 并发现 Windows 10 以下的少量用户无法加载应用程序,出现异常:java.lang.UnsatisfiedLinkError: C:\Users\user\AppData\Local\thinkorswim\jre\bin\awt.dll: Can't find dependent libraries
。我们无法在我们的机器上重现该问题。
我们在 Internet 上发现了一些与其他应用程序类似的问题,据说 Windows 安装可能已损坏(可能是某些 DLL 已损坏)。许多页面都提到了 msvcp140.dll
.
使用 Windows 资源监视器,我们发现我们的应用程序(使用 install4j 本机 EXE 启动器启动)从 c:\windows\system32
加载 msvcp140.dll
,但 JRE 11 包含 [=14] 中的 DLL =] 文件夹。然后我们 运行 我们的应用程序没有本机启动器(只是 java -jar
),资源监视器显示 msvcp140.dll
已从 jre\bin
文件夹加载。
我们要求用户重复,他们说应用程序可以用 java -jar
启动。
我已经通过 .vmoptions
文件使用了 PATH
环境变量和 java.library.path
,但我无法强制启动器使用捆绑的 JRE 中的 DLL。
是否可以调整本机启动器以使其从 JRE bin 文件夹加载 DLL?
在 Windows,可执行文件总是首先尝试从它们的目录加载 DLL。这就是为什么 java.exe
会在查找 system32 目录之前从 bin 目录加载 DLL 依赖项,
install4j 启动器不调用 java.exe,而是通过 JNI 启动 JVM,因此首先查看的不是 JRE 的 bin 目录,而是启动器的目录。遗憾的是,无法更改此行为。
我们在应用程序中使用了 install4j 8.0.8。自应用程序的新版本发布以来,我们使用 Azul 的 JRE 11.0.10 并发现 Windows 10 以下的少量用户无法加载应用程序,出现异常:java.lang.UnsatisfiedLinkError: C:\Users\user\AppData\Local\thinkorswim\jre\bin\awt.dll: Can't find dependent libraries
。我们无法在我们的机器上重现该问题。
我们在 Internet 上发现了一些与其他应用程序类似的问题,据说 Windows 安装可能已损坏(可能是某些 DLL 已损坏)。许多页面都提到了 msvcp140.dll
.
使用 Windows 资源监视器,我们发现我们的应用程序(使用 install4j 本机 EXE 启动器启动)从 c:\windows\system32
加载 msvcp140.dll
,但 JRE 11 包含 [=14] 中的 DLL =] 文件夹。然后我们 运行 我们的应用程序没有本机启动器(只是 java -jar
),资源监视器显示 msvcp140.dll
已从 jre\bin
文件夹加载。
我们要求用户重复,他们说应用程序可以用 java -jar
启动。
我已经通过 .vmoptions
文件使用了 PATH
环境变量和 java.library.path
,但我无法强制启动器使用捆绑的 JRE 中的 DLL。
是否可以调整本机启动器以使其从 JRE bin 文件夹加载 DLL?
在 Windows,可执行文件总是首先尝试从它们的目录加载 DLL。这就是为什么 java.exe
会在查找 system32 目录之前从 bin 目录加载 DLL 依赖项,
install4j 启动器不调用 java.exe,而是通过 JNI 启动 JVM,因此首先查看的不是 JRE 的 bin 目录,而是启动器的目录。遗憾的是,无法更改此行为。