在事件的 JDK 中找不到 JavaFX 部署库

标签 javafx netbeans java-11 javafx-11

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

最佳答案

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

至于 Apache NetBeans 9.0,JavaFX 项目的当前 Ant 构建文件尚不支持 JavaFX 11。它一直在寻找JavaFX jar,找不到就会停止。这是旧时代(Java 8 之前)的遗留问题,当时 JavaFX 不是 JDK 的一部分,您必须手动添加 jar。

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

netbeans

但这并不意味着您不能运行 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 library

这个库就是我本地下载的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

项目应该运行良好。

JavaFX 11

行家

另一种方法是使用 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 插件,也可以这样做。

关于在事件的 JDK 中找不到 JavaFX 部署库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52652340/

相关文章:

来自命令行的 javax.swing.JDialog.setAutoRequestFocus 的 Java NoSuchMethodError

itext - iText PDF FontFactory.registerDirectories() 和 Java 11 的非法反射访问操作警告

java - 将文档或文件夹从 Documentum 中的一个存储库移动到另一个存储库

java - 当我正确验证时,HTTP 禁止我访问指定资源 - JavaEE

javafx - java.lang.IllegalArgumentException : Children: duplicate children added: parent = VBox@872be7

java - 无法写入特定格式的文件

java - Java 11 jar命令支持classpath参数吗?

java - 如何使用 Java 9+ 修改 AST

Javafx TableView 显示问题

java - 当我的变量是 int 类型时,有没有办法检查 .chars 是否为空?