Некоторые сцены не загружаются после сборки maven
Я разрабатываю приложение JavaFx в netbeans, в netbeans, который проект строит и работает отлично.
Я сделал сборку (mvn-пакет) из моего проекта, которую он закончил без ошибок, но когда я запускаю программу, она не загружает все сцены и возвращает FXMLLoader с нулевым значением в этом случае.
Весь файл .fxml в той же папке.
public class JavaFXApplication extends Application {
public static final String TOOLBAR_MAIN = "toolbarMain";
public static final String TOOLBAR_MAIN_FXML = "/fxml/ToolbarMain.fxml";
public static final String TOOLBAR_SUB = "toolbarSub";
public static final String TOOLBAR_SUB_FXML = "/fxml/ToolbarSub.fxml";
public static final String NEW_SESSION_PANEL = "newSession";
public static final String NEW_SESSION_PANEL_FXML = "/fxml/NewSessionPanel.fxml";
public static final String OPEN_SESSION_PANEL = "openSession";
public static final String OPEN_SESSION_PANEL_FXML = "/fxml/OpenSessionPanel.fxml";
public static final String CONNECTIONS_PANEL = "connections";
public static final String CONNECTIONS_PANEL_FXML = "/fxml/ConnectionsPanel.fxml";
public static final String LOGS_PANEL = "logs";
public static final String LOGS_PANEL_FXML = "/fxml/LogsPanel.fxml";
public static final String EXCEPTIONS_PANEL = "exceptions";
public static final String EXCEPTIONS_PANEL_FXML = "/fxml/ExceptionsPanel.fxml";
public static final String MESSAGES_PANEL = "messages";
public static final String MESSAGES_PANEL_FXML = "/fxml/MessagesPanel.fxml";
public static ScreensController menuContainer = new ScreensController();
public static ScreensController contentContainer = new ScreensController();
public static ServerService server = new ServerService();
public static Stage STAGE;
@Override
public void start(Stage primaryStage) throws Exception {
STAGE = primaryStage;
primaryStage.setOnCloseRequest((WindowEvent t) -> {
if (server.isRunning()) {
server.cancel();
}
});
menuContainer.loadScreen(JavaFXApplication.TOOLBAR_MAIN,
JavaFXApplication.TOOLBAR_MAIN_FXML);
menuContainer.loadScreen(JavaFXApplication.TOOLBAR_SUB,
JavaFXApplication.TOOLBAR_SUB_FXML);
contentContainer.loadScreen(JavaFXApplication.NEW_SESSION_PANEL,
JavaFXApplication.NEW_SESSION_PANEL_FXML);
contentContainer.loadScreen(JavaFXApplication.OPEN_SESSION_PANEL,
JavaFXApplication.OPEN_SESSION_PANEL_FXML);
contentContainer.loadScreen(JavaFXApplication.NEW_SESSION_PANEL,
JavaFXApplication.NEW_SESSION_PANEL_FXML);
contentContainer.loadScreen(JavaFXApplication.CONNECTIONS_PANEL,
JavaFXApplication.CONNECTIONS_PANEL_FXML);
contentContainer.loadScreen(JavaFXApplication.LOGS_PANEL,
JavaFXApplication.LOGS_PANEL_FXML);
contentContainer.loadScreen(JavaFXApplication.EXCEPTIONS_PANEL,
JavaFXApplication.EXCEPTIONS_PANEL_FXML);
contentContainer.loadScreen(JavaFXApplication.MESSAGES_PANEL,
JavaFXApplication.MESSAGES_PANEL_FXML);
menuContainer.setScreen(JavaFXApplication.TOOLBAR_MAIN);
contentContainer.setScreen(JavaFXApplication.NEW_SESSION_PANEL);
SplitPane root = new SplitPane();
root.getItems().addAll(menuContainer, contentContainer);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
primaryStage.setResizable(false);
primaryStage.setTitle("Exam Supervisor");
}
Контроллер экрана, на котором загружены экраны:
public class ScreensController extends StackPane {
private HashMap<String, Node> screens = new HashMap<>();
public void addScreen(String name, Node screen) {
screens.put(name, screen);
}
public boolean loadScreen(String name, String resource) {
try {
FXMLLoader myLoader = new FXMLLoader(getClass().getResource(resource));
System.out.println("name:" + name + " ,resource" + resource + " ,loader:" + myLoader.getLocation());
Parent loadScreen = myLoader.load();
ControlledScreen myScreenControler
= myLoader.getController();
myScreenControler.setScreenParent(this);
addScreen(name, loadScreen);
return true;
} catch (Exception e) {
System.out.println("name: " + name + ", resource" + resource + " ,exception: " + e.getMessage());
return false;
}
}
public boolean setScreen(final String name) {
if (screens.get(name) != null) {
final DoubleProperty opacity = opacityProperty();
if (!getChildren().isEmpty()) {
getChildren().remove(0);
getChildren().add(0, screens.get(name));
} else {
getChildren().add(screens.get(name));
}
return true;
} else {
System.out.println(screens.get(name) + " ,screen hasn't been loaded!\n");
return false;
}
}
public boolean unloadScreen(String name) {
if (screens.remove(name) == null) {
System.out.println("Screen didn't exist");
return false;
} else {
return true;
}
}
}
My github repo: https://github.com/eszikk/ExamSuperVisorServer
Ответы
Ответ 1
Я заглянул в ваши файлы проекта netbeans и maven pom и не нашел ничего странного. Тот факт, что javafx libs не содержится в пути к классам обеих конфигураций, говорит мне, что вы используете его из установки Java.
Возможно, вы используете различную установку Java из netbeans и когда вы запускаете цель maven. Затем может отсутствовать модуль fxml или нет java fx, установленного со второй установкой, или что-то еще не совместимо.
Вы запустили цель maven с консоли? например.
java -jar xyz.jar
Попробуйте
java -version
и сравните версию с версией java, используемой netbeans (Справкa > О программе).
Сборка Netbeans выполняется с помощью внутренней версии maven. Но есть вероятность, что внешняя сборка maven использует другую версию java-компилятора, чем внутренняя сборка netbeans.
Я надеюсь, что это поможет!
Ответ 2
Попробуйте использовать javafx-maven-plugin
Надеюсь, это может помочь.
Ответ 3
Я успешно выполнил ваше приложение за пределами Netbeans после внесения следующих изменений.
Во-первых, мне было интересно, почему у вас есть плагин компилятора. Таким образом, я удалил его и получал "файл класса для sun.util.logging.PlatformLogger не найден" во время сборки.
Вы столкнулись с проблемой, как описано в JavaFX8 - sun.util.logging.PlatformLogger не найден Исключение в NetBeans 8
Вам нужно исправить это.
Во-вторых, то, что у вас было, было только фазой компиляции, а не runnable jar.
Возможно, это можно сделать с помощью плагина компилятора (или с помощью других зависимых баночек в пути к классам), но мне было проще использовать плагин сборки для создания флага со всеми зависимостями.
Добавьте следующее в свой pom.xml
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.eszik.supervisorserver.main.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
Затем запустите две команды mvn отдельно.
mvn clean install
mvn assembly:single
И затем,
java -jar target/SuperVisorServer-1.0-SNAPSHOT-jar-with-dependencies.jar