Почему не удается запустить скомпилированный класс 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.)

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
2 574
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На этот вопрос уже был дан ответ в списке рассылки openjfx-dev:

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

Для завершения:

  • Команда javac имеет дело с именами файлов, что означает, что вы можете скомпилировать файл java из любого места:

    javac [ options ] [ sourcefiles ]
    
  • Однако команда Джава имеет дело с классами:

    java [options] mainclass [args...] 
    

    где mainclass указывает имя запускаемого класса, а не имя файла или расположение.

При условии, что у вас установлена ​​Java 11 (и на ней установлен JAVA_HOME), загружен JavaFX 11 SDK и сразу после начала работы руководство:

  • Загрузите класс 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

Другие вопросы по теме