使用 Maven 的 JavaFX 11 抛出异常:“WindowsNativeRunloopThread”

Posted

技术标签:

【中文标题】使用 Maven 的 JavaFX 11 抛出异常:“WindowsNativeRunloopThread”【英文标题】:JavaFX 11 using Maven throws Exception: "WindowsNativeRunloopThread" 【发布时间】:2019-03-25 04:25:15 【问题描述】:

我一直在使用 Maven 测试 JavaFX 11,但无法让它工作。我安装了 Open JDK 11,如果从可下载的 .zip 添加 jar 来构建路径,一切正常。

但是,当我使用来自 javafx 11 站点的推荐 POM 文件时,我收到以下错误。

Exception in thread "WindowsNativeRunloopThread" 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(Screen.java:412)
    at javafx.graphics/com.sun.glass.ui.Application.lambda$run$1(Application.java:152)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
    at javafx.graphics/com.sun.prism.d3d.D3DPipeline.getAdapterOrdinal(D3DPipeline.java:205)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.assignScreensAdapters(QuantumToolkit.java:695)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runToolkit(QuantumToolkit.java:313)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.lambda$startup$10(QuantumToolkit.java:258)
    at javafx.graphics/com.sun.glass.ui.Application.lambda$run$1(Application.java:153)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:834)

这个问题似乎已经出现过一次here,但该线程中的解决方案都没有奏效。

有人对如何诊断问题有建议吗?我在 Eclipse 4.9 中运行,并附上了两个项目的屏幕截图,除了一个使用 maven 和另一个在构建路径中添加了 jar 之外,它们是相同的。非常感谢任何帮助。

【问题讨论】:

如果您对两个项目使用相同的运行时会怎样?第一个项目使用名为 JavaSE-11 的运行时,第二个项目使用名为 jdk-11.0.1 的运行时。我建议在第一个项目中也使用有效的(第二个) 谢谢,但它们实际上是同一个运行时,只是有两个不同的名称(无论如何都更改了它,但仍然不起作用) 您说您有一个 Maven 项目,但项目结构并未反映这一点(即您的源代码没有 /src/main/java)。你还添加了一个module-info 类,你可能不需要? 是的,是的。这很草率。我已经创建了正确的项目结构并更新了图片。我还从 javafx11test 中删除了一些多余的 jar 文件,以便两个项目应该完全相同。如果没有模块信息类,我无法在 Eclipse 中运行项目。 看起来类似于mail.openjdk.java.net/pipermail/openjfx-dev/2018-October/… 【参考方案1】:

这个问题的解决方案是在 cmets (kleopatra) 中。为了快速参考,您需要添加

-Djava.library.path=C:/anywhere-outside-eclipse 

(我使用 -Djava.library.path=C:/ 测试过)到 VM 参数。这意味着 javafx 11 可以在 Eclipse 中与 Maven 一起使用。

【讨论】:

这是一个合适的解决方案,只要这个问题在 Eclipse 中没有解决。请注意,当 Eclipse VM 设置为 Oracle JDK 1.8 时,只有在 Windows 上使用 Maven 的 JavaFX 11 项目才会发生这种情况。【参考方案2】:

这不仅仅是 Eclipse 的问题。在 Intellij IDEA 2018.3.2 中运行 OpenJFX 应用程序时,我遇到了完全相同的问题。如果在 Windows %Path% 环境变量中指定了任何其他 Java 版本,则会抛出上述异常。

例如,我使用 Java 8 作为默认 SDK 并使用 Java 11。它不是那样工作的。只有当我从 %Path% 中删除 Java 8 bin 目录时它才有效。

这相当令人困惑(我相信这是一个错误),因为当我在 IDE 中启动我的项目时,我看不到与 Java 8 的任何关系:

C:\Software\Java\openjdk-11\bin\java.exe -Dmaven.multiModuleProjectDirectory=C:\Project\helloworld -Dmaven.home=C:\Software\Maven\3.6.0 -Dclassworlds.conf=C:\Software\Maven\3.6.0\bin\m2.conf "-javaagent:C:\Software\IntelliJ IDEA\CE_2018.3.2\lib\idea_rt.jar=64808:C:\Software\IntelliJ IDEA\CE_2018.3.2\bin" -Dfile.encoding=UTF-8 -classpath C:\Software\Maven\3.6.0\boot\plexus-classworlds-2.5.2.jar org.codehaus.classworlds.Launcher -Didea.version=2018.3.2 -T 2 -DskipTests=true exec:java

【讨论】:

【参考方案3】:

正如@kleopatra 链接的帖子中所建议的那样,问题是 javafx11 加载了错误的 glass.dll 文件。

虽然其他答案中建议的解决方法有效,但OpenJFX tutorial 建议在可能的情况下指示 eclipse 使用 Java 11 VM 运行,以便加载正确的 dll。

您可以修改 eclipse.ini 文件并(假设您的 jdk11 安装在 C:\Program Files\Java\jdk-11.0.2 中)添加以下行:

-vm
C:\Progra~1\Java\jdk-11.0.2\bin\javaw.exe

【讨论】:

【参考方案4】:

在 pom.xml 文件中添加以下行已经为我解决了这个问题。

在 ArtifactID 的 POM 文件中 -- javafx-maven-pluginconfiguration tag 部分添加以下行。

    <options> <option>-Djava.library.path=C:\tmp</option> </options>
    <executable>C:\openjdk11\jdk-11\bin\java.exe</executable>

在对 pom.xml 文件进行更改之前,请提前创建 tmp 文件夹。还要确保 java11 存在于上述路径中。否则根据系统中的java11路径提及路径。

【讨论】:

以上是关于使用 Maven 的 JavaFX 11 抛出异常:“WindowsNativeRunloopThread”的主要内容,如果未能解决你的问题,请参考以下文章

Cannot resolve org.openjfx:javafx.base:11.0.0-SNAPSHOP

如何在 Netbeans 11 中使用 Maven 和 Inno Setup 为 JavaFX 应用程序创建可执行安装程序

OpenJDK11+JavaFX+Maven环境搭建及最小化案例

IDEA通过Maven打包JavaFX工程(OpenJFX11)

IDEA通过Maven打包JavaFX工程(OpenJFX11)

IDEA通过Maven打包JavaFX工程(OpenJFX11)