使用JavaFX 2.0编译代码(使用命令行)

我想知道如何使用JavaFX从Windows shell编译代码。

我在fxservidor.java有这个代码:

 public class Fxservidor extends Application { /** * @param args the command line arguments */ public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("Hello World!"); Button btn = new Button(); btn.setText("Say 'Hello World'"); btn.setOnAction(new EventHandler() { @Override public void handle(ActionEvent event) { Synthetizer os = new Synthetizer("Ximena"); } }); StackPane root = new StackPane(); root.getChildren().add(btn); primaryStage.setScene(new Scene(root, 300, 250)); primaryStage.show(); } } 

Oracle Java 8

如果您正在使用Oracle Java 8或更高版本,正如cayhorstmann在其答案中所指出的,JavaFX类现在位于Oracle Java实现的默认运行时类路径中。 您可以在程序上运行javacjava ,并且可以按预期找到JavaFX类,就像JRE中的任何其他类一样。

 javac Fxservidor.java java Fxservidor 

OpenJDK 8

如果您正在使用OpenJDK 8,您将(当前)需要从OpenJFX存储库构建JavaFX源 ,并将结果jfxrt.jar放在类路径上,类似于本答案中定义的Java 7的描述。

JavaFX 2.x / Java 7

您使用Java Compiler编译JavaFX程序:

 "%JDK_HOME%\bin\javac" -classpath "%JAVAFX_SDK_HOME%\rt\lib\jfxrt.jar" fxservidor.java 

将JDK_HOME和JAVAFX_SDK_HOME占位符分别替换为已安装的JDK和JavaFX SDK的路径。

此处提供了用于JavaFX 2.x命令行开发和部署打包的示例Windows批处理脚本。

这是我在我的机器上运行以编译应用程序的命令(您需要调整环境的类路径):

 javac -classpath "\Program Files\Oracle\JavaFX 2.1 Runtime\lib\jfxrt.jar" Fxservidor.java 

这是我用来运行编译类的命令:

 java -classpath "\Program Files\Oracle\JavaFX 2.1 Runtime\lib\jfxrt.jar;." Fxservidor 

注意;. 用于将当前目录附加到Windows中的java执行命令的类路径的标记(如果使用Unix变体,则使用:.而不是;. )。

示例应用程序

这是您的程序的修改版本,它将编译:

 import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class Fxservidor extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("Hello World!"); Button btn = new Button(); btn.setText("Say 'Hello World'"); btn.setOnAction(new EventHandler() { @Override public void handle(ActionEvent event) { System.out.println("Hello); } }); StackPane root = new StackPane(); root.getChildren().add(btn); primaryStage.setScene(new Scene(root, 300, 250)); primaryStage.show(); } } 

部署建议

如果要将应用程序部署到用户,即使使用Java 8,也建议您使用相关的打包工具打包应用程序(例如, JavaFX ant任务 , javafxpackager , javafx-maven-plugin或javafx-gradle-plugin )。

如果您只想对小程序进行一些快速命令行开发和测试,则不需要那些额外的打包工具,您只需使用此答案中的简单步骤即可。

在macbook,osx等中,你可以编译:

 javac -cp "/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/jfxrt.jar" Fxservidor.java 

并运行:

 java -cp ".:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/jfxrt.jar" Fxservidor 

注意.:而不是.;

 javac -classpath "\Program Files\Oracle\JavaFX 2.1 Runtime\lib\jfxrt.jar" Fxservidor.java 

我在Ubuntu Linux上使用JavaFX2.0 beta运行了上面的命令,它编译了它的类文件,但是当我尝试用这个命令运行它时它没有用。

 java -classpath "\Program Files\Oracle\JavaFX 2.1 Runtime\lib\jfxrt.jar" Fxservidor 

这是我收到的错误消息:

错误:无法找到或加载主类Fxservidor

FWIW,在JDK 8中,JavaFX jar似乎可用而无需将其放在类路径上。

 path/to/jdk1.8.0-b96/bin/javac HelloWorld.java path/to/jdk1.8.0-b96/bin/java HelloWorld 

像你期望的那样工作。

原始但简单的解决方案是将jfxrt.jar文件的副本放入java安装下的… / jre7 / lib / ext目录中。

然后,您应始终在类路径上使用它。

当然,不推荐用于分发jfx应用程序,但开发人员可以方便地玩游戏…

(有关解释,请参阅: http : //docs.oracle.com/javase/tutorial/ext/basics/install.html )