自从升级到install4j 7.0.5和Java 10后,越来越多的在Windows上运行我们应用程序的用户报告应用程序抛出异常
java.lang.NoSuchMethodError: <init>
at javafx.graphics/com.sun.glass.ui.win.WinApplication.staticScreen_getScreens(Native Method)
at javafx.graphics/com.sun.glass.ui.Screen.initScreens(Unknown Source)
at javafx.graphics/com.sun.glass.ui.Application.lambda$run$1(Unknown Source)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
UiLauncher (WAITING)
at java.base@10.0.1/jdk.internal.misc.Unsafe.park(Native Method)
at java.base@10.0.1/java.util.concurrent.locks.LockSupport.park(Unknown Source)
at java.base@10.0.1/java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(Unknown Source)
at java.base@10.0.1/java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(Unknown Source)
at java.base@10.0.1/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(Unknown Source)
at java.base@10.0.1/java.util.concurrent.CountDownLatch.await(Unknown Source)
at platform/javafx.graphics@10.0.1/com.sun.javafx.tk.quantum.QuantumToolkit.startup(Unknown Source)
at platform/javafx.graphics@10.0.1/com.sun.javafx.application.PlatformImpl.startup(Unknown Source)
at platform/javafx.graphics@10.0.1/com.sun.javafx.application.PlatformImpl.startup(Unknown Source)
at platform/javafx.swing@10.0.1/javafx.embed.swing.JFXPanel.initFx(Unknown Source)
at platform/javafx.swing@10.0.1/javafx.embed.swing.JFXPanel.<init>(Unknown Source)
at java.base@10.0.1/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base@10.0.1/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at java.base@10.0.1/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.base@10.0.1/java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.base@10.0.1/java.lang.Class.newInstance(Unknown Source)
at app//...
通过install4j创建的exe文件启动应用程序时,通过反射创建javafx.embed.swing.JFXPanel实例会触发错误:
Class.forName("javafx.embed.swing.JFXPanel").newInstance();
我们目前怀疑由于某种原因加载了不兼容的DLL(glass.dll似乎包含堆栈跟踪中提到的本地方法)。有人知道如何防止出现此错误吗?例如,在通过install4j生成的exe执行应用程序时,是否有办法限制使用的java.library.path仅限于安装程序中嵌入并与应用程序一起本地安装的Java运行时环境? 根据一位用户的说法,如果使用“手动”启动应用程序,则不会出现该错误。
java -jar app.jar
看起来问题在于由install4j创建的可执行文件。
Class.newInstance
的应用程序代码。 - Thomas Behrjava.library.path
(默认情况下,所有类型的系统路径,如C:\ProgramData\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;...
都是java.library.path
的一部分)。 - Thomas Behr