为什么不能运行已编译的JavaFX 11类?

时间:2018-10-30 20:13:01

标签: java javafx javafx-11

按照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。)

1 个答案:

答案 0 :(得分:2)

openjfx-dev邮件列表中已经回答了这个问题:

  

“ java”命令要求使用完全限定的类名,而不是文件路径   其论点

完成:

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

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

    java [options] mainclass [args...] 
    

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

假设您已安装Java 11(并已设置JAVA_HOME),并已下载JavaFX 11 SDK,并且紧接着入门guide

  • HelloFX类下载到任何位置,即/Users/<user>/Downloads

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

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

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

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

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

  • 运行课程:

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

    它应该可以正常运行。

现在,如果您尝试从其他位置运行上述命令,则该命令将不起作用,因为HelloFX类在类路径中不可用。

因此,如果要从其他位置运行此类,则需要指定此类路径:

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