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

在活动JDK中找不到JavaFX部署库,javafx,netbeans,java-11,javafx-11,Javafx,Netbeans,Java 11,Javafx 11,我正在迁移到OpenJDK 11和OpenJFX 11。我已经成功地从源代码构建了这两个模块,并且根据OpenJFXWiki使用--with import modules=[path_to_modular_sdk]参数来构建JDK。在我尝试用ApacheNetBeans9构建一个简单的“HelloWorld”测试项目之前,一切都进展顺利;此时我得到了以下错误:“在活动JDK中找不到JavaFX部署库”。尝试搜索有关此的信息,但找不到任何相关信息。如果有人能解释是什么导致了这一切,我将不胜感激。

我正在迁移到OpenJDK 11和OpenJFX 11。我已经成功地从源代码构建了这两个模块,并且根据OpenJFXWiki使用--with import modules=[path_to_modular_sdk]参数来构建JDK。在我尝试用ApacheNetBeans9构建一个简单的“HelloWorld”测试项目之前,一切都进展顺利;此时我得到了以下错误:“在活动JDK中找不到JavaFX部署库”。尝试搜索有关此的信息,但找不到任何相关信息。如果有人能解释是什么导致了这一切,我将不胜感激。 谢谢你的帮助。
Patrick.

你说你要迁移到OpenJDK11/OpenJFX11,但是为什么你要自己构建JDK和JFX11来开始这项工作呢?从这里和这里下载EA构建会容易得多
另外,从JDK11开始,JavaFX不再是JDK的一部分,因此它可以与JDK分开构建。我不确定您的构建说明是否是最新的。

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

至于ApacheNetbeans9.0,当前用于JavaFX项目的ant构建文件还不支持JavaFX11。它总是在寻找javafxjar,当找不到它时,它就会停止。这是旧时代(Java8之前)遗留下来的东西,当时JavaFX不是JDK的一部分,您必须手动添加jar

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

但这并不意味着无论是否使用NetBeans 9.0,都不能运行JavaFX11

在终端上运行

您可以从终端运行Java/JavaFX11项目。您可以按照本指南逐步了解详细信息

简而言之,您所需要的只是:

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//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>

org.openjfx
javafx控件
11 ea+23
org.openjfx
javafx-fxml
11 ea+23
org.apache.maven.plugins
maven编译器插件
3.7.0
11
org.ow2.asm
asm
6.1.1
org.codehaus.mojo
execmaven插件
1.2.1
JAVA
javafx11.HelloFX
从NetBeans清理、构建和运行,它应该可以正常工作


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

这是NetBeans 9的问题。我在netbeans中使用了Sun JDK,现在是Oracle JDK,已经有很多年了。在NetBeans7.2中,有一个手动添加JFXJAR文件的选项。然后,JFX被嵌入到oraclejdk8中,而该选项现在不可用。
几周前,我被告知Oracle JDK明年将不再免费,所以我开始迁移到OpenJDK10,我遇到了与您相同的问题。这是因为openjfx没有嵌入到openjdk中。如果您尝试使用已经是GA的Oracle JDK11,那么构建JFX应用程序不会有任何问题。问题是,当您将NetBeans设置为Java平台的开放JDK时,它希望JFX位于JDK内部,但NetBeans不会要求您提供JFX文件夹或与早期版本类似的东西。

Hello World项目是一个模块化项目吗?你是如何创造它的?作为Ant的常规JavaFX项目?如果您显示项目配置,将会有所帮助。嗨,Jose,回答您的问题:是的,这只是Ant的标准JavaFX项目,从文件->新项目->JavaFX->JavaFX应用程序创建。其他一切都按照默认项目设置进行。谢谢。实际上我两个都做了。但是,有必要使用导入选项构建JDK,以包括JFX,因为不再可能仅将JFX构建覆盖在JDK构建之上。无论我使用的是我的构建还是EA构建,我仍然有同样的问题。我开始认为这可能是Netbeans 9中的构建脚本问题,而不是JDK/JFX问题。JDK 11不再是这样。见以下何塞的描述。你好,何塞。感谢您明确详细的解决方案;工作得很好,现在我可以正确构建。我知道哈