我正在迁移到 OpenJDK 11 和 OpenJFX 11。我已经从源代码成功构建,并且根据 OpenJFX wiki 使用 --with-import-modules=[path_to_modular_sdk] arg 构建 JDK。一切都很顺利,直到我尝试在 Apache Netbeans 9 中构建一个简单的“Hello World”测试项目;此时我收到以下错误:“在活动 JDK 中找不到 JavaFX 部署库”。尝试搜索有关此的信息,但找不到任何相关信息。如果有人能阐明造成这种情况的原因,我将不胜感激。谢谢你的帮助。帕特里克。
3 回答
正如@mipa 指出的那样,您既不需要构建 Java 11 也不需要构建 JavaFX 11 来迁移现有项目。
至于 Apache NetBeans 9.0,目前 JavaFX 项目的 ant 构建文件还不支持 JavaFX 11。它一直在寻找JavaFX jar,找不到就会停止。这在某种程度上是过去(在 Java 8 之前)的遗留物,当时 JavaFX 不是 JDK 的一部分,您必须手动添加 jar。
例如,当您尝试创建一个新的 JavaFX 项目时,您将收到以下错误:
但这并不意味着无论有没有 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
哪里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 或 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。在 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 文件夹或类似早期版本中所做的事情。
您说您正在迁移到 OpenJDK11/OpenJFX11,但您为什么要通过自己构建 JDK 和 JFX 来开始这项工作?从这里http://jdk.java.net/11/和这里http://jdk.java.net/openjfx/下载一个 EA 版本会容易得多 此外,从 JDK11 开始 JavaFX 不是JDK 不再存在,因此它可以与 JDK 分开构建。我不确定您的构建说明是最新的。