Чтение файла ресурсов uber jar build с помощью maven-shade-plugin - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть простой проект, который читает файл ресурса .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.Теперь я хочу создать исполняемый UAR 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 tf myapplication-0.0.1-SNAPSHOT.jar, я вижу, что внутри банки есть файл config.yaml.Однако, когда я пытаюсь запустить его с java -jar, я получаю java.io.FileNotFoundException с сообщением, что config.yaml не может быть найден.

1 Ответ

0 голосов
/ 29 ноября 2018

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

Ваш файл находится внутри файла 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);
...