JavaRush/Java блог/Архив info.javarush/Сборка JavaFX проекта в jar файл.
Artemka58_1
21 уровень

Сборка JavaFX проекта в jar файл.

Статья из группы Архив info.javarush
участников
Помогите пожалуйста разобраться. Создал проект на JavaFX, из IDE запускался без ошибок. Создал jar файл данного проекта, при запуске jar файла из IDE выдал ошибку: /usr/lib/jvm/java-8-oracle/bin/java -Dfile.encoding=UTF-8 -jar /home/artem/IdeaProjects/Address_book/out/artifacts/Address_book_jar/Address_book.jar Exception in Application start method java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389) at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767) Caused by: java.lang.RuntimeException: Exception in Application start method at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182) at java.lang.Thread.run(Thread.java:745) Caused by: javafx.fxml.LoadException: file:/home/artem/IdeaProjects/Address_book/out/artifacts/Address_book_jar/Address_book.jar!/fxml/main.fxml at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409) at Main.start(Main.java:15) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863) at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) at com.sun.glass.ui.gtk.GtkApplication.lambda$null$49(GtkApplication.java:139) ... 1 more Caused by: java.lang.IllegalStateException: Location is not set. at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2434) at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409) at controllers.MainController.initialize(MainController.java:199) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548) ... 12 more Exception running application Main т.е. ругается на fxmlLoader.load(). Класс Main: import controllers.MainController; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception { FXMLLoader fxmlLoader = new FXMLLoader(); fxmlLoader.setLocation(getClass().getResource("/fxml/main.fxml")); Parent fxmlMain = fxmlLoader.load(); MainController mainController = fxmlLoader.getController(); mainController.setMainStage(primaryStage); primaryStage.setTitle("Адресная книга"); primaryStage.setMinHeight(315); primaryStage.setMinWidth(290); Scene scene = new Scene(fxmlMain, 315, 290); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } Класс ControllerMain: @Override public void initialize(URL location, ResourceBundle resources) { columnFIO.setCellValueFactory(new PropertyValueFactory("fio")); columnPhone.setCellValueFactory(new PropertyValueFactory("phone")); try { fxmlLoader.setLocation(getClass().getResource("../fxml/edit.fxml")); fxmlEdit = fxmlLoader.load(); editDialogController = fxmlLoader.getController(); } catch (IOException e) { e.printStackTrace(); } initListeners(); fillData(); }
Комментарии (2)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
funner
Уровень 21
3 июля 2016, 07:15
Огворюсь, я новичок (javarush 10 lvl), поэтому могу только предполагать.
Возможно это касается видимости.
(из небольшого опыта знакомства с javaFx) Все, что находится в поддиректориях jar — видно, свободно имеется доступ, все, что находится выше по иерархии — недоступно (Вы используете "../fxml/edit.fxml", где двоеточие означает переход на уровень выше).
И правда напоминает модификатор доступа default (package-private) (модификатор, по-умолчанию): ресурсы видны внутри пакета.
Решением будет перемещение класса выше по иерархии, либо перемещение ресурса в текущий уровень (или глубже)
Artemka58_1
Уровень 21
3 июля 2016, 07:39
Так и решился этот вопрос. К сожалению в директории получился большой набор файлов, но другого пути я не нашёл.