【问题标题】:JavaFX deployment library not found in active JDK在活动的 JDK 中找不到 JavaFX 部署库
【发布时间】:2019-01-29 22:25:50
【问题描述】:

我正在迁移到 OpenJDK 11 和 OpenJFX 11。我已经成功地从源代码构建,并且根据 OpenJFX wiki 使用 --with-import-modules=[path_to_modular_sdk] 参数来构建 JDK。一切都很顺利,直到我尝试在 Apache Netbeans 9 中构建一个简单的“Hello World”测试项目;此时我收到以下错误:“在活动 JDK 中找不到 JavaFX 部署库”。尝试搜索有关此的信息,但找不到任何相关信息。如果有人能阐明造成这种情况的原因,我将不胜感激。 谢谢你的帮助。 帕特里克。

【问题讨论】:

  • Hello World 项目是模块化项目吗?你如何创造它?作为使用 Ant 的常规 JavaFX 项目?
  • 如果您显示项目配置会有所帮助。
  • 您好 Jose,回答您的问题:是的,这只是一个使用 Ant 的标准 JavaFX 项目,从 File->New Project->JavaFX->JavaFXApplication 创建。其他一切都按照默认项目设置。谢谢。

标签: javafx netbeans java-11 javafx-11


【解决方案1】:

正如@mipa 指出的那样,您无需构建 Java 11 或 JavaFX 11 即可迁移现有项目。

对于 Apache NetBeans 9.0,JavaFX 项目的当前 ant 构建文件还不支持 JavaFX 11。它一直在寻找JavaFX jar,找不到就会停止。这在某种程度上是过去(在 Java 8 之前)的遗留物,当时 JavaFX 不是 JDK 的一部分,您必须手动添加 jar。

例如,当您尝试创建一个新的 JavaFX 项目时,您会收到以下错误:

但这并不意味着您不能运行 JavaFX 11,无论是否使用 NetBeans 9.0。

在终端上运行

您可以从终端运行您的 Java/JavaFX 11 项目。您可以按照此getting started 指南进行详细的分步操作。

简而言之,您只需要:

export PATH_TO_FX=/path/to/javafx-sdk-11/lib
javac --module-path $PATH_TO_FX --add-modules=javafx.controls HelloFX.java
java --module-path $PATH_TO_FX --add-modules=javafx.controls HelloFX

HelloFX.java 在哪里:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class HelloFX extends Application {

    @Override
    public void start(Stage stage) {
        String version = System.getProperty("java.version");
        Label l = new Label ("Hello, JavaFX 11, running on " + version);
        Scene scene = new Scene(new StackPane(l), 300, 200);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }

}

模块化项目

在 NetBeans 9.0 上创建一个模块化项目,并添加一个模块(为简单起见,我将其命名为 javafx11,这不是推荐的名称)。

在添加代码之前,让我们将 JavaFX 库添加到模块路径中。

这个库就是我本地下载的JavaFX下的文件夹:/Users/<user>/Downloads/javafx-sdk-11/lib/。当然,如果是自己构建的,也可以指向那个位置。

现在我可以定义模块了:

module javafx11 {
    requires javafx.controls;

    exports javafx11;
}

并将上述HelloFX 类添加到javafx11 包中。

现在项目将运行良好。

即使您仍在使用ant,在这种情况下,构建文件也会更新为模块路径更改,并且没有任何特定于 JavaFX 的内容,因此项目运行没有任何问题。

Java 项目

如果模块化项目有效,那么常规Java 项目也可以在 NetBeans 9.0 上运行。

创建一个 Java 项目(同样,不是 JavaFX 项目),将 JavaFX 库添加到上面的模块路径中,现在您需要添加这些用于编译和运行的 VM 选项:

 --module-path=/path/to/javafx-sdk-11/lib --add-modules=javafx.controls

项目应该运行良好。

Maven

另一种方法是使用 Maven 或 Gradle 代替 ant。

只需创建一个 Maven -> JavaFX 项目,修改 pom.xml 文件并添加 JavaFX 依赖项:

<dependencies>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>11-ea+23</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>11-ea+23</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <release>11</release>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.ow2.asm</groupId>
                    <artifactId>asm</artifactId>
                    <version>6.1.1</version>
                    <!--  Use newer version of ASM  -->
                </dependency>
            </dependencies>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>java</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <mainClass>javafx11.HelloFX</mainClass>
                </configuration>
        </plugin>
    </plugins>
</build>

从 NetBeans 清理、构建和运行,它应该可以正常工作。

对于 Gradle,如果您包含适用于 NetBeans 的 Gradle 插件,也可以这样做。

【讨论】:

  • 你好何塞。感谢您明确详细的解决方案;效果很好,现在我可以正确构建了。我确实有一个来自模块化项目构建的问题:Netbeans 没有将 Main-Class 放入 MANIFEST.MF 文件中。我尝试在 properties->run 选项中设置主类,但它仍然没有填充 MF 文件......因此程序将无法运行。当您执行您给出的示例时,您是否遇到过这种情况?谢谢。
  • 默认情况下,如果您从 NetBeans 运行,则 jar 不包含 mainClass,并且正如您所说,由于缺少此属性,它不会在 NetBeans 之外运行。你可以从终端运行它,作为一个模块,从dist文件夹:java --module-path /path/to/javafx-sdk-11/lib:../build/modules -m javafx11/javafx11.HelloFX
  • 何塞,我知道这有点离题,但您似乎精通 Netbeans 9 功能:我知道 Apache 对 Netbeans 的采用仍然是 WIP,但在我看来这是一项基本要求IDE 应该能够从其主 UI 执行和调试程序。我不明白为什么他们可以运行普通的 Java 项目,但不能从 IDE GUI 运行模块化项目?
  • @Manius 虽然有一种方法可以在 NetBeans 9 中启用 Groovy 插件(通过 NB->Tools->Settings),但 NetBeans 10 已经包含了它(参见 merged PR)。您可以更新到 NetBeans 10.0 vc4,注意它支持 Java 11(这在 NetBeans 9 上不支持)。
【解决方案2】:

这是 Netbeans 9 的问题。我使用 Sun JDK,现在是 Oracle JDK,多年来一直使用 netbeans。在 Netbeans 7.2 中有一个手动添加 JFX jar 文件的选项。然后,JFX 被嵌入到 Oracle JDK8 中,现在该选项不可用。 几周前我被告知 Oracle JDK 明年将不再免费,所以我开始迁移到 Open JDK10,我遇到了和你一样的问题。那是因为 Open JFX 没有嵌入到 Open JDK 中。如果您尝试使用已经是 GA 的 Oracle JDK11,则构建 JFX 应用程序不会有任何问题。问题是当您在 NetBeans 中将 Java Platform 设置为 Open JDK 时,它希望 JFX 位于 JDK 本身内部,但 Netbeans 不会要求您提供 JFX 文件夹或类似早期版本中所做的事情。

【讨论】:

    【解决方案3】:

    您说您正在迁移到 OpenJDK11/OpenJFX11,但您为什么要通过自己构建 JDK 和 JFX 来开始这项工作?从http://jdk.java.net/11/http://jdk.java.net/openjfx/ 下载 EA 版本会容易得多 此外,从 JDK11 开始,JavaFX 不再是 JDK 的一部分,因此可以与 JDK 分开构建。我不确定您的构建说明是最新的。

    【讨论】:

    • 其实我都做了。但是,有必要使用导入选项构建 JDK 以包含 JFX,因为不再可能仅将 JFX 构建覆盖在 JDK 构建之上。无论我使用的是我的构建还是 EA 构建,我仍然遇到同样的问题。我开始认为这可能是 Netbeans 9 中的构建脚本问题,而不是 JDK/JFX 问题。
    • JDK 11 不再是这样。请参阅下面 José 的描述。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2021-12-18
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多