Ссылки из библиотеки классов не копируются в папку проекта bin

Когда вы используете getClass().getResource(...), вы загружаете ресурс, не указывая путь к файлу. В случае, когда загрузчик классов загружает классы из файловой системы, они, по существу, приравниваются к одной и той же вещи, и на самом деле это работает (хотя даже тогда нет технической причины, по которой это необходимо). Когда загрузчик классов загружает классы другими механизмами (и, вероятно, во всех случаях), важно обратить внимание на спецификации Java для ресурса .

В частности, примечание:

Ресурсы, имена и контексты

Ресурс идентифицируется строкой, состоящей из последовательности подстрок, разделенных косой чертой (/), за которой следует ресурс имя. Каждая подстрока должна быть допустимым идентификатором Java. Имя ресурса имеет форму shortName или shortName.extension. И shortName, и extension должны быть идентификаторами Java.

blockquote>

(Мой акцент.) Поскольку .. не является допустимым идентификатором Java, нет гарантии того, что этот ресурс будет разрешаемым. Случается, что загрузчик классов файловой системы решает это так, как вы ожидаете, поэтому он работает в вашей среде IDE, но реализация getResource(...) в загрузчике класса jar не реализует это так, как вы надеетесь.

Попробуйте

FXMLLoader loader = new FXMLLoader(getClass().getResource("/sm/customer/CustomerHome.fxml"));

Использование мест расположения контроллеров для загрузки FXML:

Поскольку вы создали свой код, чтобы каждый FXML находился в том же пакете, что и его соответствующий файл контроллера (который, я думаю, является разумным способом сделать что-то), вы также можете использовать это при загрузке FXML: просто загрузите FXML «относительно его контроллера»:

FXMLLoader loader = new FXMLLoader(CustomerHomeCtrl.class.getResource("CustomerHome.fxml"));

Это кажется довольно естественно, в этой настройке, и компилятор проверяет, что у вас есть имя пакета для CustomerHomeCtrl правильно в точке, где вы импортируете класс. Это также облегчает рефакторинг: например, предположим, что вы хотели разделить sm.admin на несколько подпакетов. В Eclipse вы создадите подпакеты, перетащите FXML и контроллеры в соответствующие подпакеты, а операторы импорта будут автоматически обновляться: дальнейших изменений не потребуется. В случае, когда путь указан в getResource(...), все это нужно было бы поменять вручную.

30
задан Stuart 12 December 2013 в 09:22
поделиться