为什么不能 运行 编译 JavaFX 11 class?

Why cannot run compiled JavaFX 11 class?

按照 https://openjfx.io/openjfx-docs/#install-javafx 的说明,我通过以下方式编译了示例 HelloFX.java:

 javac --module-path $PATH_TO_FX --add-modules=javafx.controls /Users/me/Documents/java/HelloFX.java 

但现在如果我尝试 运行 那...

 java --module-path $PATH_TO_FX --add-modules=javafx.controls /Users/me/Documents/java/HelloFX

...我得到错误:

 Error: Could not find or load main class .Users.me.Documents.java.HelloFX
 Caused by: java.lang.ClassNotFoundException: /Users/me/Documents/java/HelloFX 

但报告为未找到的文件在那里:

 ls -l /Users/me/Documents/java/HelloFX.class
 -rwxr--r--  1 me  staff  1336 Oct 30 16:01 /Users/murray/Documents/java/HelloFX.class

(我已经更改了权限以添加 u+x 以防出现问题,但显然这不是问题所在。

怎么了?

(是的,$PATH_TO_FX 确实指向 javafx-sdk-11/lib。)

此问题已在 openjfx-dev 邮件列表中得到解答:

The "java" command expects a fully-qualified class name, not a file path as its argument

完成:

  • javac 命令处理文件名,这意味着您可以从任何位置编译 java 文件:

    javac [ options ] [ sourcefiles ]
    
  • 但是 java 命令处理 classes:

    java [options] mainclass [args...] 
    

    其中 mainclass 指定要启动的 class 的名称,而不是文件名或位置。

如果您安装了 Java 11(并且设置了 JAVA_HOME),下载 JavaFX 11 SDK,然后开始 guide :

  • HelloFXclass下载到任意位置,即/Users/<user>/Downloads.

  • 打开终端并 cd 到该位置:

    cd /Users/<user>/Downloads
    
  • 设置JavaFX路径:

    export PATH_TO_FX=/path/to/javafx-sdk-11/lib
    
  • 编译class:

    javac --module-path $PATH_TO_FX --add-modules=javafx.controls HelloFX.java
    

    检查是否在同一文件夹级别创建了 HelloFX.class

  • 运行 class:

    java --module-path $PATH_TO_FX --add-modules=javafx.controls HelloFX
    

    应该运行就好了。

现在,如果您尝试从不同的位置 运行 上面的命令将不起作用,因为 HelloFX class 在 class路径。

所以如果你想从不同的位置运行这个class你需要指定这个class路径:

javac --module-path $PATH_TO_FX --add-modules=javafx.controls \
    /Users/<user>/Downloads/HelloFX.java

java --module-path $PATH_TO_FX --add-modules=javafx.controls \
   --class-path /Users/<user>/Downloads HelloFX