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

Pat*_*ckJ 5 netbeans javafx 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部署库 ".试图搜索这方面的信息,但找不到任何相关的信息.如果有人能够阐明造成这种情况的原因,我将非常感激.谢谢你的帮助.帕特里克.

Jos*_*eda 8

正如@mipa指出的那样,您既不需要构建Java 11也不需要构建JavaFX 11来迁移现有项目.

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

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

NetBeans的

但这并不意味着无论是否使用NetBeans 9.0都无法运行JavaFX 11.

在终端上运行

您可以从终端运行Java/JavaFX 11项目.您可以按照此入门指南逐步详细说明.

简而言之,您只需要:

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
Run Code Online (Sandbox Code Playgroud)

在哪里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();
    }

}
Run Code Online (Sandbox Code Playgroud)

模块化项目

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

在添加代码之前,让我们将JavaFX库添加到module-path.

JavaFX库

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

现在我可以定义模块:

module javafx11 {
    requires javafx.controls;

    exports javafx11;
}
Run Code Online (Sandbox Code Playgroud)

并将上面的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
Run Code Online (Sandbox Code Playgroud)

该项目应该运行良好.

JavaFX 11

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>
Run Code Online (Sandbox Code Playgroud)

从NetBeans清理,构建和运行,它应该工作得很好.

对于Gradle,如果包含NetBeans的Gradle插件,则可以完成相同的操作.

  • 默认情况下,如果您从 NetBeans 运行,jar 不包含 mainClass,并且正如您所说,由于缺少此属性,它不会在 NetBeans 外部运行。你可以从终端运行它,作为一个模块,从`dist`文件夹:`java --module-path /path/to/javafx-sdk-11/lib:../build/modules -m javafx11/ javafx11.HelloFX`。 (2认同)