【问题标题】:Compile code using JavaFX 2.0 (using command line)使用 JavaFX 2.0 编译代码(使用命令行)
【发布时间】:2012-03-15 05:25:25
【问题描述】:

我想知道如何使用 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();
    }
}

【问题讨论】:

    标签: java compilation javafx-2


    【解决方案1】:

    Oracle Java 8

    如果您使用的是 Oracle Java 8 或更新版本,正如 cayhorstmann 在他的回答中指出的那样,JavaFX 类现在位于 Oracle Java 实现的默认运行时类路径中。您可以在您的程序上运行javacjava,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 tasksjavafxpackagerjavafx-maven-pluginjavafx-gradle-plugin)打包应用程序。

    如果你只是想对小程序做一些快速的命令行开发和测试,那些额外的打包工具是不需要的,你可以使用这个答案中的简单步骤。

    【讨论】:

    • 错误:找不到符号应用程序
    • 我更新了答案以包含您的示例代码中缺少的导入语句,注释掉未提供的 Synthetizer 类,以便代码可以编译并添加我用来编译和运行更新程序的确切命令。
    • 对于 Ubuntu/Debian 上的 OpenJDK,您不需要从源代码构建,只需安装 openjfx 包:sudo apt-get install openjfx
    【解决方案2】:

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

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

    按照您的预期工作。

    【讨论】:

    • 是的,我的回答已经过时了 - 我更新了它以包含新信息。
    【解决方案3】:

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

    那么,您应该始终在您的类路径中提供它。

    当然不推荐用于分发 jfx 应用程序,但方便开发人员玩耍...

    (解释见:http://docs.oracle.com/javase/tutorial/ext/basics/install.html

    【讨论】:

      【解决方案4】:

      在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
      

      注意.: 而不是.;

      【讨论】:

        【解决方案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

        【讨论】:

        • 我更新了我的答案:在Linux下你需要将:.附加到运行时类路径,以允许java运行时找到你编译到当前目录的类。
        猜你喜欢
        • 2012-11-24
        • 1970-01-01
        • 2017-10-16
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 2011-02-02
        • 2016-07-03
        • 2011-12-13
        相关资源
        最近更新 更多