#java #jar #resources #java-module
Вопрос:
Я разрабатываю настольные приложения в виде Java-модуля с Java 16.0.2
помощью и JavaFX 16
и помещаю его в банку. Когда я запускаю JAR как модуль ClassLoader.getResource(String name)
, метод может находить файлы ресурсов только в корневом каталоге ресурсов. Файлы ресурсов, расположенные в каталоге в корневом каталоге ресурса, не могут быть найдены.
Я показываю пример.
Файловая система проекта является стандартной:
├───java
│ │ module-info.java
│ │
│ └───org
│ └───example
│ └───java_module_resource_issue
│ JavaModuleResourceIssue.java
│
└───resources
│ foo.xml
│
└───bar
boo.xml
module-info.java:
module org.example.java_module_resource_issue {
}
JavaModuleResourceIssue.java:
package org.example.java_module_resource_issue;
public class JavaModuleResourceIssue {
public static void main(String[] args) {
System.out.println(JavaModuleResourceIssue.class.getClassLoader().getResource("foo.xml"));
System.out.println(JavaModuleResourceIssue.class.getClassLoader().getResource("bar/boo.xml"));
}
}
Когда я запускаю банку как модуль:
>java --module-path . --module org.example.java_module_resource_issue
jar:file:///D:/Projects/java_module_resource_issue/./JavaModuleResourceIssue-1.0-SNAPSHOT.jar!/foo.xml
null
Когда я запускаю БАНКУ как БАНКУ:
>java -jar JavaModuleResourceIssue-1.0-SNAPSHOT.jar
jar:file:/D:/Projects/java_module_resource_issue/JavaModuleResourceIssue-1.0-SNAPSHOT.jar!/foo.xml
jar:file:/D:/Projects/java_module_resource_issue/JavaModuleResourceIssue-1.0-SNAPSHOT.jar!/bar/boo.xml
Содержимое БАНКИ:
│ foo.xml
│ module-info.class
│
├───bar
│ boo.xml
│
├───META-INF
│ MANIFEST.MF
│
└───org
└───example
└───java_module_resource_issue
JavaModuleResourceIssue.class
Вопрос не в том, как я могу получить доступ к файлам ресурсов. Я уже нашел для себя решение. Проблема в том, что библиотечные методы также используют этот ClassLoader.getResource()
метод.
Например, если я добавляю CSS для списка таблиц стилей сцены, я могу сделать это только по имени файла, и менеджер стилей не может найти файл с помощью этого getResource()
метода. (Было бы неплохо, если бы я мог добавить эти файлы по URL-адресу.)
Проблема не возникает, если я не использую модули, но тогда появляется предупреждение о том, что это неподдерживаемый способ использования JavaFX.
Является ли это ошибкой в реализации getResource()
?
Комментарии:
1.
java --module-path . -cp .:resources --add-modules org.example.java_module_resource_issue org.example.java_module_resource_issue.JavaModuleResourceIssue
делает это для меня. Вам также нужно задать путь к классу2. @g00se Спасибо за совет! Это работает для меня именно так:
java -cp JavaModuleResourceIssue-1.0-SNAPSHOT.jar -p . -m org.example.java_module_resource_issue
илиjava -cp* -p . -m org.example.java_module_resource_issue