Чтение файла ресурсов uber jar build с помощью maven-shade-plugin

У меня есть простой проект, который читает файл ресурса .yaml:

var yamlObjectMapper = new ObjectMapper(new YAMLFactory());
var classLoader = Application.class.getClassLoader();
var file = new File(Objects.requireNonNull(classLoader.getResource("config.yaml")).getFile());
var appConfig = yamlObjectMapper.readValue(file, ApplicationConfig.class);

Так что из IDE работает нормально. Теперь я хочу создать исполняемый файл uber JAR, который будет включать все ресурсы внутри. Пользуюсь maven-shade-plugin.

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <minimizeJar>true</minimizeJar>
                        <transformers>
                            <transformer implementation = "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>mypackage.Application</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Итак, я ожидаю, что файлы ресурсов будут включены в jar. И когда я запускаю jar tf myapplication-0.0.1-SNAPSHOT.jar, я вижу, что внутри банки находится файл config.yaml. Однако, когда я пытаюсь запустить его с java -jar, я получаю java.io.FileNotFoundException с сообщением о том, что config.yaml не может быть найден.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 027
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот решение, предоставленное мне Андреа Боккаччи. Вот его ответ, который он разрешил мне опубликовать здесь:

Ваш файл находится внутри jar-файла, поэтому вы не можете получить к нему доступ из класса File, попробуйте использовать getResourceAsStream, а затем переключитесь на readValue(InputStream, Class), если есть такой API. в противном случае вы можете записать входной поток в фактический временный файл, затем вызовите readValue(File, Class) и затем удалите извлеченный файл.

Вот как мой код выглядит сейчас и работает:

var yamlObjectMapper = new ObjectMapper(new YAMLFactory());
var classLoader = Application.class.getClassLoader();
var resource = classLoader.getResourceAsStrean("config.yaml");
var appConfig = yamlObjectMapper.readValue(resource, ApplicationConfig.class);

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