使用 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-plugin 在 configuration 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)