Простая программа Java 11 JavaFX, ошибка при запуске из файла JAR (Windows)

У меня есть тестовая программа JavaFX, которая отлично работает в Eclipse. - Мне пришлось добавить файл с информацией о модуле (module-info.java), содержащий следующее:

module moduletest {
    requires javafx.controls;
    exports com.javafx.test.MenuTest;
}

Java-класс:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class MenuTest extends Application {

@Override
public void start(Stage primaryStage) {

    Scene scene = new Scene(new VBox(), 300, 250);

    Circle circle1 = new Circle(-20,0,200);        
    circle1.setFill(Color.CADETBLUE);
    ((VBox) scene.getRoot()).getChildren().addAll(circle1);

    primaryStage.setScene(scene);
    primaryStage.show();        
}

public static void main(String[] args) {
        launch(args);
    }
}

Когда я запускаю его как экспортированный файл JAR, используя следующую команду

java -jar TonyJavaFX.jar -classpath .;./lib/javafx.controls.jar

, я получаю следующую ошибку:

Ошибка: не удалось найти или загрузить основной класс com.javafx.test.MenuTest.MenuTest. Причина: java.lang.NoClassDefFoundError: javafx/application/Application

Примечание. У меня есть папка lib непосредственно под папкой, из которой я запускаю банку, которая содержит все файлы jar JavaFX.


person NottmTony    schedule 10.12.2018    source источник
comment
В дополнение к ответу nullpointer вы должны запускать свой код как модуль; используйте --module (или сокращенную версию -m) вместо -jar. Насколько мне известно, при использовании -jar файл JAR не рассматривается как модуль. Это означает, что файл module-info игнорируется, и система не знает, что делать с модулями javafx.controls или javafx.graphics.   -  person Slaw    schedule 11.12.2018


Ответы (1)


Вам нужно убедиться, что модули javax.controls и javafx-graphics.jar присутствуют в вашем пути к модулю, а не к пути к классам.

--module-path ./lib/javafx.controls.jar:./lib/javafx.graphics.jar

Примечание. Это не потребует добавления модуля javafx.graphics в объявление вашего модуля, поскольку он транзитивно требуется модулем javafx.controls. Просто присутствие модуля в пути к модулям должно помочь.

Важно. В идеале вы должны добавить полную папку lib в путь к модулям. Подробнее здесь - https://openjfx.io/openjfx-docs/#install-javafx

person Naman    schedule 10.12.2018
comment
Я все еще получаю ту же ошибку при добавлении graphics.jar. Это всего лишь тестовая программа, но да, согласен, я бы использовал путь модуля в реальной жизни — просто пытаюсь заставить что-то работать. - person NottmTony; 10.12.2018
comment
@NottmTony Как вы создали файл .jar, который пытаетесь выполнить? Вы можете перейти по ссылке на документацию, а затем следовать инструкциям, указанным в Runtime images =› Modular CLI. - person Naman; 10.12.2018
comment
@NottmTony В идеале его необходимо добавить в modulepath. Причина - иначе это приведет к одному общему безымянному модулю, из которого он может не разрешиться. - person Naman; 10.12.2018
comment
Спасибо, это сработало для меня: javac --module-path C:\Program Files\Java\javafx-sdk-11.0.1\lib --add-modules=javafx.controls MenuTest.java - person NottmTony; 11.12.2018
comment
@NottmTony Круто. Примите в качестве ответа, если это может помочь и другим. - person Naman; 11.12.2018
comment
Я решил собрать и запустить в командной строке, и это сработало - спасибо BUILD javac --module-path C:\Program Files\Java\javafx-sdk-11.0.1\lib --add-modules=javafx.controls MenuTest RUN java --module-path C:\Program Files\Java\javafx-sdk-11.0.1\lib --add-modules=javafx.controls MenuTest - person NottmTony; 11.12.2018