![](/img/trans.png)
[英]I cannot package maven-plugin-api into uber jar using maven-shade-plugin
[英]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.