getResource возвращает нулевой URL в контексте модуля - PullRequest
0 голосов
/ 04 мая 2018

Я новичок в модульности Java. Я использую Java 9.

Программа компилируется без нареканий. Он также отлично работает из папки «взорванный модуль», но с одним исключением: он генерирует исключение, причина которого возникает со следующей строкой кода:

URL introURL = AboutPanel.class.getResource("help.html");

introURL присваивается ноль.

При запуске программы в Eclipse или из файла JAR, экспортированного из Eclipse, URL-адрес корректно заполняется адресом файла ресурсов (help.html), который находится в том же каталоге, что и вызывающий класс.

Вот команда, которую я использую для запуска программы из «разобранного модуля», который находится в папке «out»:

java -p out/ -m moduleTCD/com.adonax.tanpura.TCDLaunch  

Проект состоит из двух пакетов, которые я объединяю в один модуль.

src/moduleTCD/com/adonax/tanpura
                        /pfaudio

«Основной» класс (точка входа) - tanpura.TCDLaunch.

Вот содержание класса module-info.java:

module moduleTCD {
    exports com.adonax.tanpura;

    requires java.base;
    requires java.desktop;
}

Сообщение об ошибке при попытке запуска из командной строки:

java.io.IOException: invalid url
    at java.desktop/javax.swing.JEditorPane.setPage(Unknown Source)
    at moduleTCD/com.adonax.tanpura.documentation.AboutPanel.<init>(AboutPanel.java:28)
    at moduleTCD/com.adonax.tanpura.panels.ControlPanel.initializeHelpPanel(ControlPanel.java:525)
    at moduleTCD/com.adonax.tanpura.panels.ControlPanel.<init>(ControlPanel.java:163)
    at moduleTCD/com.adonax.tanpura.TCDLaunch.main(TCDLaunch.java:43)

Это исключение выдается в try / catch для IOException в точке, где метод setPage JEditorPane вызывается с нулем в качестве аргумента.

textArea.setPage(introURL);

Сначала у меня не было строки экспорта в моем модуле-info.java, но я добавил ее, когда я прочитал следующее из API для Class.getResource:

Возвращает: Объект URL; null, если ресурс с таким именем не найден, ресурс не может быть найден по URL, ресурс находится в пакете, который не открыт хотя бы для модуля вызывающего или доступа к ресурсу отказано администратором безопасности.

Это повысило вероятность того, что пакет может понадобиться Class в модуле Java.base. Команда exports там сейчас максимально широка. Но добавление этого не изменило ошибку. Мне интересно, есть ли что-то не так с тем, как я это сделал, или есть что-то еще, что я пропускаю.

1 Ответ

0 голосов
/ 04 мая 2018

Классическая ошибка с моей стороны. Я сделал предположение об ошибке, связанной с технологией, которая является новой и незнакомой для меня, вместо того, чтобы сначала проверить очевидное.

Ошибка произошла из-за того, что команда javac не переместила требуемые ресурсы в целевую систему папок.

Я также убедился, что в модуле-info НЕ требуется оператор «export», чтобы разрешить загрузку ресурса.

Так что, на самом деле, это была не проблема java-модуля, а просто упущение, которое я частично приписываю отсутствию отбиваний с помощью команд Java на уровне оболочки.

Большое спасибо Алану Бейтману!

...