当前位置: 首页 > 面试题库 >

在JDK 11上使用模块路径上的OpenJFX 11 JMODS运行javafx示例

吴刚毅
2023-03-14
问题内容

我已经从OpenJFX项目下载了JavaFX Jmod文件,并将它们放在目录中G:\openjfx\javafx-jmods-11。我正在使用没有JavaFX jmod的OpenJDK 11,JAVA_HOME/jmods即它没有JavaFX发行版。

模块信息文件:

module gui{
    requires javafx.graphics;
    requires javafx.controls;

    exports com.test;
}

我编译如下:

javac -p G:\openjfx\javafx-jmods-11 -d mods --module-source-path src 
    src\gui\com\test\*.java src\gui\module-info.java

编译成功。但是我无法使用以下命令运行编译后的代码:

java -p G:\openjfx\javafx-jmods-11;mods -m gui/com.test.CreateGuiDemo

但是我收到以下错误:

Error occurred during initialization of boot layer
java.lang.module.FindException: Module javafx.graphics not found, required by gui

问题答案:

我相信对您遇到的错误有一个解释: jmods不能在运行时使用

这在这里解释:http :
//openjdk.java.net/jeps/261#Packaging : -JMOD-files:

JMOD文件可以在编译时和链接时使用,但不能在运行时使用。为了在运行时支持它们,通常要求我们准备好即时提取和链接本机代码库。

因此,我完成了一些简单的模块hellofx

module hellofx {
    requires javafx.controls;

    exports hellofx;
}

HelloFX从样品这里并下载JavaFX的11
jmods我的平台,在这里。我还从同一位置下载了JavaFX 11
SDK(罐)。

编译时间

在编译时,我们可以使用jmods:

javac -p /path-to/javafx-jmods-11/ -d mods/hellofx $(find src/hellofx -name "*.java")

或使用SDK:

javac -p /path-to/javafx-sdk-11/lib -d mods/hellofx $(find src/hellofx -name "*.java")

在这两种情况下,结果都与预期的完全相同:在编译时不需要本机库。

运行

现在我们要运行我们的小模块。

如OP所述,使用jmods运行:

java -p /path-to/javafx-jmods-11/:mods -m hellofx/hellofx.HelloFX

失败:

Error occurred during initialization of boot layer
  java.lang.module.FindException: Module javafx.controls not found, required by hellofx

但是使用SDK可以:

java -p /path-to/javafx-sdk-11/lib/:mods -m hellofx/hellofx.HelloFX

链接时间

如JEP-261所述,jmods在链接时也能正常工作,因此我们可以jlink在编译时和运行时之间使用该工具。

您可以使用jlink工具将一组模块及其依赖项组装和优化到自定义运行时映像中。(来源)

因此,我们来做:

jlink -p /path-to/javafx-jmods-11/:mods --add-modules=hellofx --output links

这将生成一个90.7 MB的文件夹(在我的Mac上)。请注意,该lib文件夹包含Java 11和JavaFX
11所需的所有本机库,以及一个名为的70.5 MB文件modules

播放时间(2)

我们终于可以做到:

links/bin/java -m hellofx/hellofx.HelloFX

那将起作用。

总之,如果只想使用jmods来编译和运行模块,则需要使用额外的步骤jlink。否则,对于运行时,我们将需要JavaFX SDK。



 类似资料:
  • 我有一个基于官方指南的简单Spring项目来使用Web服务。此示例似乎针对JDK 8,但我想使用最新的LTS JDK 11。 我已经改编了pom。xml文件,并添加了一些似乎已从JDK中删除的依赖项,即: 但是,我似乎无法启动应用程序,我总是得到这个错误: 尽管至少有两个问题(这个和这个)与这个主题相关,但我已经尝试了在这些帖子中可以找到的所有版本组合,我仍然有相同的错误。 我使用的特定JDK m

  • 作为一个软件开发人员,我需要做哪些步骤来允许我的JavaFX应用程序与JDK11+一起运行?有什么好的广告吗?是否可以通过Gradle获得OpenJDK?

  • 问题内容: 我有一个模块foo,包含util.py和bar.py。 我想将其导入IDLE或python会话中。我该怎么办? 我找不到关于如何在当前目录或默认python PATH中导入模块的文档。经过尝试后, 我能得到的最接近的是 这给了我在Windows 7上拒绝的权限。 问题答案: 一种方法是简单地修改路径: 请注意,这要求foo为python包,即包含一个文件。如果您不想修改,也可以修改环境

  • 我所有关于如何在NetBeans上设置JavaFX的尝试都陷入了困境,因为旧版本的说明现在似乎不起作用。如果我使用file | new project | JavaFX Applicationm,我会得到以下信息: 但是,如果我转到Platform Manager并创建一个非默认JavaSE平台,则没有JavaFX选项卡。 任何地方都有最新的说明吗?

  • 我有一个用Java8写的项目,我想把它更新到Java9。所以我把这些类分成了两个独立的模块。模块: 和目录中的。在我开始更新到Java9之前,它的构建是用Gradle自动化的。该模块使用模块中包含的抽象类实现。 在目录 中的 。我想使用Maven自动构建它。模块需要模块。 文件树类似于: 或 base/src/main/java/org/ggp/base/validator/opnfvalidat

  • 我正面临一个烦人的问题。下面是历史: 我们使用的是(测试环境)并且部署工作正常 我做了一个部署,但没有奏效。我们的解决方案至少需要V12.1.2,因此我卸载了12.1.1并安装了 在安装新版本之前,我完全删除了文件夹,并从头创建了 我在静默模式下安装了WebLogic12.1.3,并创建了我的测试域。域中只有管理服务器和一个独立的托管服务器(没有群集,没有大量托管服务器) 我进行了部署,但Webl