在活动 JDK 中找不到 JavaFX 部署库

JavaFX deployment library not found in active JDK

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

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

正如@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;
}

并将上面的HelloFXclass添加到javafx11包中

现在该项目 运行 非常好。

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

Java 项目

如果模块化项目有效,那么 常规 Java 项目在 NetBeans 9.0 上也能正常工作。

创建一个 Java 项目(同样,不是 JavaFX 项目),添加 JavaFX 库添加到模块路径,现在您需要为编译和 运行ning 添加这些 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 9 的一个问题。我使用 Sun JDK,现在使用 Oracle JDK 很多年了。在 Netbeans 7.2 中,有一个选项可以手动添加 JFX jar 文件。然后,JFX 被嵌入到 Oracle JDK8 中,现在该选项不可用。 几周前我被告知 Oracle JDK 明年将不再免费,所以我开始迁移到 Open JDK10,我遇到了和你一样的问题。那是因为 Open JFX 没有嵌入到 Open JDK 中。如果您尝试使用已经正式发布的 Oracle JDK11,构建 JFX 应用程序不会有任何问题。问题是当您在 NetBeans 中将 Java Platform an Open JDK 设置为时,它希望 JFX 位于 JDK 本身内,但 Netbeans 不会要求您提供 JFX 文件夹或类似于它在早期版本中所做的事情。