簡體   English   中英

使用Maven-shade-plugin讀取資源文件uber jar構建

[英]Reading resource file uber jar build with 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我可以看到jar內有config.yaml文件。 但是,當我嘗試使用java -jar運行它時,我收到帶有無法找到config.yaml消息的java.io.FileNotFoundException

這是Andrea Boccacci向我提供的解決方案。 這是他的答覆,他讓我在這里張貼:

您的文件位於jar文件中,因此您無法從File類訪問它,請嘗試使用getResourceAsStream ,然后如果有這樣的API readValue(InputStream, Class)交換到readValue(InputStream, Class) 如果不是,您可以將輸入流寫入實際的臨時文件,然后調用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM