Почему нельзя запустить скомпилированный класс JavaFX 11? - PullRequest
0 голосов
/ 30 октября 2018

Следуя инструкциям на 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 голосов
/ 31 октября 2018

На этот вопрос уже был дан ответ в списке рассылки 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 /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
...