gpt4 book ai didi

java - NoSuchMethodError : in com. sun.glass.ui.win.WinApplication.staticScreen_getScreens

转载 作者:可可西里 更新时间:2023-11-01 12:44:02 25 4
gpt4 key购买 nike

自升级到 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 似乎包含堆栈跟踪中提到的 native 方法)。

有谁知道如何防止这个错误?例如。有没有办法将通过 install4j 生成的 exe 执行应用程序时使用的 java.library.path 限制为嵌入在安装程序中并随应用程序本地安装的 Java 运行时环境?根据一位用户的说法,如果使用“手动”启动应用程序,则不会发生错误

java -jar app.jar

命令。所以问题似乎出在 install4j 创建的可执行文件上。

最佳答案

此问题的解决方法似乎是从您的系统 %PATH% 中删除所有出现的“glass.dll”。

不过,我相信必须在其他地方实现修复;在 Java 运行时或 Install4j 代码中,但不能在实际应用程序的 Java 代码中实现:

出于某种原因,Install4j 中的 Java 运行时版本会在查找库时检查捆绑的 JRE last。在这种情况下,有问题的 native 库是 glass.dll其中应包含请求的 <init>方法,但如果在你的 %PATH% 中的任何地方有一个较旧的不兼容版本 glass.dll (例如,从以前的 Java 8 安装)该文件将以更高的优先级加载,然后应用程序将 native 崩溃。

不是应用程序代码(java代码)的问题,也不是捆绑的JDK的问题,这是install-4j生成exe文件的方式的问题(或者可能是 Java 内部)尝试解析 native dll。与其首先检查所有 路径元素,不如首先检查捆绑的 JRE 目录。

使用 Procmon,您可以看到它加载任意位置 glass.dll路径中的文件,首先:我将 JDK 1.8 中的一个文件添加到我的一个路径元素中并得到了这个(加上崩溃):

procmon log showing java loading the first glass.dll it can find

关于java - NoSuchMethodError : <init> in com. sun.glass.ui.win.WinApplication.staticScreen_getScreens,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51101481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com