install4j:强制启动器(EXE)使用捆绑JRE文件夹中的DLL

install4j:强制启动器(EXE)使用捆绑JRE文件夹中的DLL,install4j,Install4j,我们在应用程序中使用install4j 8.0.8。自从应用程序的新版本发布以来,我们使用Azul的JRE 11.0.10,发现Windows 10下的少量用户无法加载应用程序,但有一个例外:java.lang.unsatifiedLinkError:C:\users\user\AppData\Local\thinkorswim\JRE\bin\awt.dll:找不到依赖库。我们无法在机器上重现该问题 我们在Internet上发现了一些与其他应用程序类似的问题,据说Windows安装可能已损坏(

我们在应用程序中使用install4j 8.0.8。自从应用程序的新版本发布以来,我们使用Azul的JRE 11.0.10,发现Windows 10下的少量用户无法加载应用程序,但有一个例外:
java.lang.unsatifiedLinkError:C:\users\user\AppData\Local\thinkorswim\JRE\bin\awt.dll:找不到依赖库
。我们无法在机器上重现该问题

我们在Internet上发现了一些与其他应用程序类似的问题,据说Windows安装可能已损坏(可能是某些DLL已损坏)。许多页面都提到了
msvcp140.dll

使用Windows资源监视器,我们发现我们的应用程序(从install4j native EXE launcher启动)从
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?

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


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

您提到了JRE 11:问题是在您切换到该版本时开始出现的吗?如果是,您通常使用什么JRE?不幸的是,我没有处理这个具体问题的经验,但在找到根本原因和/或解决方案时,这类信息非常有用。谢谢您的回答。是的,在从JRE 1.8.0_202迁移到JRE 11.0.10之后,问题就开始出现了。谢谢您的回答。我从WinAPI中找到了SetDllDirectory,并将尝试使用它。install4j建议-能够定义首选DLL位置。