我正在迁移到OpenJDK 11和OpenJFX11。我已经从源代码成功构建了两者,并且按照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 9.0,您都无法运行JavaFX 11。
在终端上运行
您可以从终端运行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;
}
并将上述
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插件,则可以完成相同的操作。