【问题标题】:install4j: Force a launcher (EXE) to use DLLs from bundled JRE folderinstall4j:强制启动器 (EXE) 使用捆绑的 JRE 文件夹中的 DLL
【发布时间】:2023-03-07 12:48:03
【问题描述】:

我们在应用程序中使用 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 包含 bin 文件夹中的 DLL。然后我们在没有原生启动器的情况下运行我们的应用程序(只是java -jar),资源监视器显示msvcp140.dll 已从jre\bin 文件夹加载。

我们要求用户重复一遍,他们说可以使用java -jar 启动该应用程序。

我已经通过.vmoptions 文件使用了PATH 环境变量和java.library.path,但我无法强制启动器使用捆绑的JRE 中的DLL。

是否可以调整本机启动器以使其从 JRE bin 文件夹加载 DLL?

【问题讨论】:

  • 您提到 JRE 11:当您切换到该版本时,问题是否开始出现?如果是,您以前使用的是什么 JRE?不幸的是,我没有解决这个特定问题的经验,但在找到根本原因和/或解决方案时,这类信息可能很有用。
  • 感谢您的回答。是的,从 JRE 1.8.0_202 迁移到 JRE 11.0.10 后,问题就开始出现了。

标签: install4j


【解决方案1】:

在 Windows 上,可执行文件总是首先尝试从其目录加载 DLL。这就是为什么java.exe会在查看system32目录之前从bin目录加载DLL依赖,

install4j 启动器不调用 java.exe,而是通过 JNI 启动 JVM,因此首先查看的不是 JRE 的 bin 目录,而是启动器的目录。遗憾的是,无法更改此行为。

【讨论】:

  • 感谢您的回答。我从 WinAPI 中找到了 SetDllDirectory 并将尝试使用它。对 install4j 的建议 - 定义首选 DLL 位置的能力。
猜你喜欢
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
相关资源
最近更新 更多