FXMLLoader не находит файл fxml - проект Maven

Когда я запускаю основной класс в проекте Maven, я получаю:

Exception in Application start method

Насколько я понял, это потому, что файл FXML не загружается.

Это иерархия файловой системы

 src
    └- main
        ├- java
        |   └- zenit
        |      └- ui
        |         └- TestUI.java
        └- resources
            └- zenit
               └- ui
                  └- Main.fxml

В Eclipse (внутри src)

FXMLLoader не находит файл fxml - проект Maven

FXMLLoader не находит файл fxml - проект Maven

Читая руководство апача по maven и другие вопросы по статистике, следующий фрагмент кода кажется правильным способом создания FXMLLoader и указания на файл Main.fxml.

public class TestUI extends Application {
    public void start(Stage stage) throws IOException {

        FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml"));

        .
        .   // set controller, load parent, set scene etc.
        .

    }

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

Но этот код вызовет указанное ранее исключение.

Когда я попытался определить, откуда в моем коде взялся Exception, я понял, что это из FXMLLoader. Итак, я запускал разные sysouts (по одному) в строке выше FXMLLoader loader = new FXMLLoader(..):

    System.out.println(getClass().getResource("Main.fxml"));
    System.out.println(getClass().getResource("main/resources/zenit/ui/Main.fxml"));
    System.out.println(getClass().getResource("../../../resources/zenit/ui/Main.fxml"));

Для всех вывод консоли был: (очевидно, не ожидаемый вывод)

null

Итак, мой вопрос,

Почему .getResource("Main.fxml") возвращается null сюда?

Как мне правильно получить доступ к файлу Main.fxml в этом случае?

Моя система:

  • Мейвен: Апач Мейвен 3.6.0
  • Java SE: 11.0.2
  • JavaFX: 11.0.2
  • Затмение: 2018-12 (4.10.0)
  • ОС: macOS Мохаве — v10.14.3

попробуйте указать имена пакетов перед «Main.fxml» в методе getResourse(), потому что класс TestUI и файл fxml находятся в разных местах.

Dilini Peiris 11.04.2019 12:26

Я обновил свой вопрос. То же самое.. :(

Strazan 11.04.2019 12:29
package zenit.ui; ... class TestUI {}. В eclipse исходные каталоги должны быть java и ресурсами для соответствия maven. Загляните в банку за файлом /zenit/ui/Main.fxml
Joop Eggen 11.04.2019 12:30

@Strazan попробуй поставить "../../../rescources/zenit/ui/Main.fxml" и увидишь?

Dilini Peiris 11.04.2019 12:32

@JoopEggen У меня есть java, а ресурсов нет? Должен ли я удалить src и иметь только их? Я нашел Main.fxml-файл в банке"

Strazan 11.04.2019 12:34

@DiliniPeiris то же самое :/

Strazan 11.04.2019 12:36

@ Стразан, может быть, я говорю глупость .. но неправильное написание слова «ресурсы». и вы, и я ранее написали «ресурсы». исправить это и посмотреть? потому что у меня когда-то была эта проблема давным-давно, и это был вопрос правильного написания имен пакетов

Dilini Peiris 11.04.2019 12:39

@DiliniPeiris, ха-ха, Иисус Христос: P, к сожалению, все еще null

Strazan 11.04.2019 12:42

У вас могут быть другие проблемы — обычно, когда он не может найти fxml — в исключении будет указано «местоположение не установлено».

Edv Beq 11.04.2019 12:47

Для maven у вас правильная иерархия. Если вы откроете банку с помощью 7zip или чего-то еще, вы должны увидеть /zenit/ui/Main.fxml. На самом деле вы также можете использовать абсолютный путь getResource("/zenit/ui/Main.fxml"). (Возможно, только что каким-то образом сборка проекта maven неправильно настроена в eclipse.) Проверьте jar

Joop Eggen 11.04.2019 13:00

@JoopEggen Я вижу Main.fxml внутри банки под zenit/ui/ !! и когда я использую getResource("/zenit/ui/Main.fxml") sysout напечатает путь, а не null!! ваше здоровье! но я все еще получаю исключение: /

Strazan 11.04.2019 13:43

@EdvBeq есть идеи, в чем может быть проблема? :D

Strazan 11.04.2019 13:43

Если выложишь куда-нибудь свой проект - вечером могу глянуть.

Edv Beq 11.04.2019 14:43

@EdvBeq Спасибо, это очень мило с вашей стороны! Вот проект ( feature/maven2 - это ветка. Я пытаюсь преобразовать проект в maven.) github.com/strazan/zenit/tree/feature/maven2

Strazan 11.04.2019 15:02

Очевидно, что Main.fxml найден (URL-адрес не нулевой). Таким образом, исключение (которое вы не указали) должно указывать на какую-то (следующую) проблему. Начните с простого fxml.

Joop Eggen 11.04.2019 15:10

@JoopEggen хорошо, у меня нет трассировки стека. Я написал все, что я получил!! Я попробовал с новым fxml сейчас (pane, завернутый в anchorpane), то же самое:/

Strazan 11.04.2019 15:41

Безнадежно, но попробуйте пример приложения Mave JavaFX.

Joop Eggen 11.04.2019 16:17

@JoopEggen да!! ваше здоровье

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

Ответы 1

Ответ принят как подходящий
  1. Я думаю, что ваша главная проблема - это библиотека "ikonli". Если вы попытаетесь открыть fxml с помощью scenebuilder, вы увидите исключение. Я рекомендую вам избавиться от этой зависимости. Используйте что-нибудь попроще, например графику svg:

    • В кнопке fxml> добавить регион> установите размер региона> затем в разделе стилей добавьте свойство css -fx-shape> и в значении установите путь svg в кавычках, например: «M827.6 ... 122z»

    • Затем добавьте еще одно свойство css -fx-scale-shape > и установите для него значение true.

Вышеупомянутое не требует никаких сторонних библиотек, и вы можете найти все значки бесплатно в Интернете.

  1. Я рекомендую загружать fxml из основного класса контроллера. В fxml проверьте свойство fxroot и добавьте конструктор к вашему основному контроллеру, например:

общественный главный контроллер () {

try {
    FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml"));
    loader.setController(this);
    loader.setRoot(this);
    loader.load();

} catch (IOException e) {
    e.printStackTrace();
}

}

  1. Ваш контроллер должен расширять корневой контейнер следующим образом:

    открытый класс MainController расширяет VBox {

затем в основном классе просто передайте основной контроллер на сцену

Scene scene = new Scene(controller);
  1. Я считаю, что ваш проект maven был настроен неправильно. Вы должны щелкнуть правой кнопкой мыши свой проект> настроить> преобразовать в проект maven. Затем очистите пакеты, если они станут красными.

  2. Последнее - вам нужно добавить еще один класс под названием Launcher - и затем вы запускаете свое приложение из него - не удаляйте основной метод из вашего основного класса

пакет зенит.уи;

пусковая установка открытого класса {

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

}

Надеюсь это поможет!

ааа!!! спасибо, помогло удаление иконли! Странно, так как ikonli работал, когда проект был обычным java-проектом. Есть идеи, почему? но если я установлю root (это), я получу Root value already specified. что я должен/не должен иметь в fxml?

Strazan 12.04.2019 06:40

если я уберу VBox из fxml, я получу Invalid root element.

Strazan 12.04.2019 06:43

Я завернул код fxml в <fx:root> , и теперь у меня нет исключений, приложение работает, но ничего визуального не появляется :/

Strazan 12.04.2019 07:01

извините за спам, теперь работает!!! спасибо большое вы легенда! <3

Strazan 12.04.2019 07:07

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