Я не могу прочитать файл JSON в каталоге resources из скомпилированного jar-файла моего проекта.
Но ... обо всем по порядку:
Я создал проект Gradle Groovy в рамках идеи Intellij (v2017.3.4 Community Edition) со следующей структурой:
Итак, как видите, у меня есть только класс Main.groovy и папка resources внутри каталога src/main.
Внутри каталога resources есть единственный ресурс db/products.json.
Зайдя в меню File > Project Structure > Modules > Project Module > Sources, мы можем проверить, что папка src/groovy помечена как Sources, а папка resources помечена как Resource Folder, поэтому я могу гарантировать, что эти папки правильно установлены на classpath:
В моем основном классе я добавил следующую строку кода для загрузки ресурса /db/products.json:
Запустив проект в рамках идеи Intellij, я могу проверить, что ресурс загружается без проблем:
Большой! Но...
Когда я компилирую проект с gradle - с помощью команды gradlew build - jar lib ReadJSONResourceFile-1.0-SNAPSHOT создается внутри папки build/libs.
Глядя на структуру jar-файла, мы можем проверить, что папка ресурсов db находится в корневом местоположении jar-файла:
Но когда я выполняю команду jar через:
groovy -cp build/libs/ReadJSONResourceFile-1.0-SNAPSHOT.jar -e "org.company.demo.Main.main()"
ресурс не загружен. getResource() просто возвращает null:
Я пытался обойти это с помощью других решений, представленных здесь на Stack Overflow, но ни одно из них не сработало.
Я кое-что упустил ... Вы можете помочь?
Это должен быть getClass().getResource("/db/products.json"). Принимает ли getResource карту в качестве аргумента?
Да @dagget, я считаю, что проблема. Я создал приложение Java (вместо отличного), и когда я набрал getClass(), идея Intellij сразу предупредила меня, что я не могу вызвать getClass() внутри static method. Затем я создал класс Singleton, чтобы обернуть вызов getClass().getResources(), и все стало работать нормально (запуск приложения как через IDE, так и через банку)
@abdul, это не карта внутри аргументов getResource() ... это просто intellisense идеи Intellij в действии! :)
вы можете использовать аннотацию @groovy.transform.CompileStatic для класса Groovy, чтобы иметь статическую проверку
хороший совет @daggett! Спасибо за вашу помощь
@dagget, поздний ответ :) Вы были правы. Проблема заключалась в вызове getClass() внутри статического метода main. Выполнение вызова внутри non-static method работает должным образом. Спасибо.
Взгляните на эту статью: javaworld.com/article/2077548/learn-java/… Мне удалось использовать этот класс для загрузки изображения (jpg) из ресурсов с помощью groovy.


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