Как получить файл из каталога ресурсов из библиотеки groovy jar

Я не могу прочитать файл JSON в каталоге resources из скомпилированного jar-файла моего проекта.

Но ... обо всем по порядку:

Я создал проект Gradle Groovy в рамках идеи Intellij (v2017.3.4 Community Edition) со следующей структурой:

Как получить файл из каталога ресурсов из библиотеки groovy jar

Итак, как видите, у меня есть только класс Main.groovy и папка resources внутри каталога src/main.

Внутри каталога resources есть единственный ресурс db/products.json.

Зайдя в меню File > Project Structure > Modules > Project Module > Sources, мы можем проверить, что папка src/groovy помечена как Sources, а папка resources помечена как Resource Folder, поэтому я могу гарантировать, что эти папки правильно установлены на classpath:

Как получить файл из каталога ресурсов из библиотеки groovy jar

В моем основном классе я добавил следующую строку кода для загрузки ресурса /db/products.json:

Как получить файл из каталога ресурсов из библиотеки groovy jar

Запустив проект в рамках идеи Intellij, я могу проверить, что ресурс загружается без проблем:

Как получить файл из каталога ресурсов из библиотеки groovy jar

Большой! Но...

Теперь улов!

Когда я компилирую проект с gradle - с помощью команды gradlew build - jar lib ReadJSONResourceFile-1.0-SNAPSHOT создается внутри папки build/libs.

Глядя на структуру jar-файла, мы можем проверить, что папка ресурсов db находится в корневом местоположении jar-файла:

Как получить файл из каталога ресурсов из библиотеки groovy jar

Но когда я выполняю команду jar через:

groovy -cp build/libs/ReadJSONResourceFile-1.0-SNAPSHOT.jar -e "org.company.demo.Main.main()"

ресурс не загружен. getResource() просто возвращает null:

Как получить файл из каталога ресурсов из библиотеки groovy jar

Я пытался обойти это с помощью других решений, представленных здесь на Stack Overflow, но ни одно из них не сработало.

Я кое-что упустил ... Вы можете помочь?

вы вызываете getClass() статическим методом. может в этом проблема?

daggett 15.03.2018 17:26

Это должен быть getClass().getResource("/db/products.json"). Принимает ли getResource карту в качестве аргумента?

abdul 15.03.2018 17:31

Да @dagget, я считаю, что проблема. Я создал приложение Java (вместо отличного), и когда я набрал getClass(), идея Intellij сразу предупредила меня, что я не могу вызвать getClass() внутри static method. Затем я создал класс Singleton, чтобы обернуть вызов getClass().getResources(), и все стало работать нормально (запуск приложения как через IDE, так и через банку)

Cristian Gonçalves 15.03.2018 18:17

@abdul, это не карта внутри аргументов getResource() ... это просто intellisense идеи Intellij в действии! :)

Cristian Gonçalves 15.03.2018 18:18

вы можете использовать аннотацию @groovy.transform.CompileStatic для класса Groovy, чтобы иметь статическую проверку

daggett 15.03.2018 18:27

хороший совет @daggett! Спасибо за вашу помощь

Cristian Gonçalves 15.03.2018 18:32

@dagget, поздний ответ :) Вы были правы. Проблема заключалась в вызове getClass() внутри статического метода main. Выполнение вызова внутри non-static method работает должным образом. Спасибо.

Cristian Gonçalves 18.04.2018 16:45

Взгляните на эту статью: javaworld.com/article/2077548/learn-java/… Мне удалось использовать этот класс для загрузки изображения (jpg) из ресурсов с помощью groovy.

Ibrahim.H 03.06.2018 16:24
Gradle за прокси-сервером
Gradle за прокси-сервером
Создайте проект Gradle под сетевым прокси.
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
В этой статье блога мы проведем вас через процесс установки Gradle на Ubuntu 22.04, интеграции его с Jenkins и создания задания Gradle. Мы...
5
8
2 956
0

Другие вопросы по теме