Не удается найти файлы ресурсов в JAR при запуске в качестве модуля

#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