我想知道如何使用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<ActionEvent>() {
@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();
}
}
答案 0 :(得分:26)
Oracle Java 8
如果您正在使用Oracle Java 8或更高版本,正如cayhorstmann在其答案中所指出的,JavaFX类现在位于Oracle Java实现的默认运行时类路径中。您可以在程序上运行javac
和java
,并且可以按预期找到JavaFX类,就像JRE中的任何其他类一样。
javac Fxservidor.java
java Fxservidor
OpenJDK 8
如果您正在使用OpenJDK 8,您(当前)需要从OpenJFX存储库中build the JavaFX sources并将结果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批处理脚本here。
这是我在我的机器上运行以编译应用程序的命令(您需要调整环境的类路径):
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<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World");
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
}
部署建议
如果要将应用程序部署到用户,即使使用Java 8,也建议您使用相关打包工具打包应用程序(例如JavaFX ant tasks,javafxpackager,javafx-maven-plugin或{{3 }})。
如果您只想对小程序进行快速命令行开发和测试,则不需要那些额外的打包工具,您只需使用此答案中的简单步骤即可。
答案 1 :(得分:8)
在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
请注意.:
而不是.;
答案 2 :(得分:5)
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
答案 3 :(得分:3)
FWIW,在JDK 8中,似乎可以使用JavaFX jar而无需将其放在类路径上。
path/to/jdk1.8.0-b96/bin/javac HelloWorld.java
path/to/jdk1.8.0-b96/bin/java HelloWorld
就像你期望的那样工作。
答案 4 :(得分:1)
原始但简单的解决方案是将jfxrt.jar文件的副本放入 的 ... / jre7 / lib / ext目录强> 你的java安装目录。
然后,您应该始终在类路径上使用它。
当然不建议用于分发jfx应用程序,但是开发人员可以方便地玩游戏......
(有关解释,请参阅:http://docs.oracle.com/javase/tutorial/ext/basics/install.html)