Местоположение JavaFX не установлено в IntelliJ, но работает над Eclipse [duplicate]

У меня была такая же проблема сегодня при переходе с MySql.Data 7.0.7 на 8.0.8. Я смог перейти вперед, добавив в строку соединения «SslMode = none».

Вы получите что-то вроде:

server={0};user id={1};password={2};persistsecurityinfo=True;port={3};database={4};SslMode=none

(заменяя значения вашими данными в базе данных ) [/ д2]

4
задан Mr. Dijkstra 13 January 2016 в 18:51
поделиться

1 ответ

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

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

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

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

(Мой акцент.) Поскольку .. не является допустимым идентификатором 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(...), все это нужно было бы поменять вручную.

12
ответ дан James_D 22 August 2018 в 06:40
поделиться
  • 1
    Почему это не имеет смысла? Относительный путь относится к пакету класса. – Puce 13 January 2016 в 13:15
  • 2
    Благодарим вас за это замечательное решение. Теперь он работает отлично. – Mr. Dijkstra 13 January 2016 в 18:53
  • 3
    @Puce Обновлен ответ, чтобы быть более точным. Было бы интересно, если это имеет смысл? – James_D 13 January 2016 в 19:27
  • 4
    Хорошо ИМХО, реальная проблема - файловая система, на которой вы работаете. Поддержка Native Filesystems & quot; .. & quot; тогда как jar-файловые системы не – tomsontom 20 February 2017 в 15:07
  • 5
    @tomsontom Я предполагаю, что моя точка зрения заключается в том, что существует спецификация того, как поведение имен ресурсов ведет себя независимо от файловой системы. Пока ваше имя ресурса соответствует этой спецификации, оно будет работать независимо от того, как приложение развертывается. (Теоретически, даже если базовая файловая система имела более жесткие требования, чем спецификация именования ресурсов). – James_D 20 February 2017 в 15:13
Другие вопросы по тегам:

Похожие вопросы: