ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – NoSuchMethodError:在com.sun.glass.ui.win.WinApplication.staticScreen_getScreens中

2019-09-10 22:00:23  阅读:294  来源: 互联网

标签:install4j java-10 java javafx windows


自从升级到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似乎包含stacktrace中提到的本机方法).

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

java -jar app.jar

命令.所以似乎问题在于install4j创建的可执行文件.

解决方法:

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

我认为必须在其他地方实施修复;无论是在Java运行时还是在Install4j代码中,都无法在实际应用程序的Java代码中实现:

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

这不是应用程序代码(java代码)中的问题,也不是捆绑JDK的问题,这是install-4j生成的exe文件(或内部Java可能)如何尝试解析本机dll的问题.首先应该检查捆绑的JRE目录,而不是先检查所有路径元素.

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

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

标签:install4j,java-10,java,javafx,windows
来源: https://codeday.me/bug/20190910/1801807.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有