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

标签 java windows javafx install4j java-10

自升级到 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/

相关文章:

java - 为什么 Java 需要 "This method can be called at most once in a given Java Virtual Machine"?

java - 异常 cvc-elt.1 : Cannot find the declaration of element 'AsifXml' when trying to unmarshall using JAXB

windows - 适用于 Windows 的最佳轻量级 Web 服务器(仅静态内容)

c++ - 如何劫持DLL来锁定Windows中的所有目录来验证

java - 如何在 NetBeans 中设置 Inno Setup 插件

javafx - FXML:一种将子宽度/高度绑定(bind)到父宽度/高度的优雅方法

JAVA 如何读取 SQL 并添加到对象数组中

java 按值传递示例帮助我理解

windows - 用于保护驱动程序的注册表访问 Hook

css - 如何在javafx中计算css外观的效果?