使用JavaFX2.0编译代码(使用命令行)

使用JavaFX2.0编译代码(使用命令行),java,compilation,javafx-2,Java,Compilation,Javafx 2,我想知道如何使用JavaFX从Windows shell编译代码 我在fxservidor.java中有此代码: public class Fxservidor extends Application { /** * @param args the command line arguments */ public static void main(String[] args) { launch(args); } @Overr

我想知道如何使用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();
    }
}
public类Fxservidor扩展应用程序{
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共无效开始(阶段初始阶段){
setTitle(“你好,世界!”);
按钮btn=新按钮();
btn.setText(“说‘你好,世界’”);
btn.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
Synthetizer os=新的合成器(“Ximena”);
}
});
StackPane root=新的StackPane();
root.getChildren().add(btn);
原始阶段。设置场景(新场景(根,300250));
primaryStage.show();
}
}
Oracle Java 8

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

javac Fxservidor.java
java Fxservidor
OpenJDK 8

如果您使用的是OpenJDK 8,那么(当前)您需要从OpenJFX存储库中获取并将生成的jfxrt.jar放在类路径上,类似于此答案中定义的Java 7描述

javafx2.x/java7

您可以使用编译JavaFX程序:

"%JDK_HOME%\bin\javac" -classpath "%JAVAFX_SDK_HOME%\rt\lib\jfxrt.jar" fxservidor.java 
将JDK_HOME和JAVAFX_SDK_HOME占位符分别替换为安装的JDK和JAVAFX SDK的路径

提供了用于JavaFX2.x命令行开发和部署打包的windows批处理脚本示例

下面是我在机器上运行的一个命令,用于编译应用程序(您需要为您的环境调整类路径):

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

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();
    }

}
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
公共类Fxservidor扩展应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@覆盖公共无效开始(阶段primaryStage){
setTitle(“你好,世界!”);
按钮btn=新按钮();
btn.setText(“说‘你好,世界’”);
setOnAction(新的EventHandler,或)

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

javac -classpath "\Program Files\Oracle\JavaFX 2.1 Runtime\lib\jfxrt.jar" Fxservidor.java
我在UbuntuLinux上用
JavaFX2.0beta
运行了上面的命令,它编译了它的类文件,但是当我试图用这个命令运行它时,它没有工作

java -classpath "\Program Files\Oracle\JavaFX 2.1 Runtime\lib\jfxrt.jar" Fxservidor
这是我收到的错误消息:

错误:找不到或加载主类Fxservidor


在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

注意
而不是

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

然后,您应该始终在类路径上提供它

path/to/jdk1.8.0-b96/bin/javac HelloWorld.java
path/to/jdk1.8.0-b96/bin/java HelloWorld
当然,不推荐用于分发jfx应用程序,但方便开发人员使用


(有关说明,请参阅:)

FWIW,在JDK 8中,JavaFX jar似乎不需要将其放在类路径上就可以使用

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

工作原理与您预期的一样。

错误:找不到symbol ApplicationI更新了答案以包含示例代码中缺少的导入语句,请注释掉未应用的Synthetizer类,以便代码可以编译并添加我用于编译和运行更新程序的确切命令。对于Ubuntu/Debian上的OpenJDK,您不需要这样做o从源代码构建,但只需安装openjfx包:
sudo apt get install openjfx
我更新了我的答案:在Linux下,您需要将
:.
附加到运行时类路径,以允许java运行时找到您编译到当前目录的类。是的,我的答案已注明日期-我更新了答案,将新的队形。