【问题标题】:Reading resource file uber jar build with maven-shade-plugin使用 maven-shade-plugin 读取资源文件 uber jar 构建
【发布时间】:2019-04-30 06:01:47
【问题描述】:

我有一个读取资源.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 运行它时,我收到 java.io.FileNotFoundException 并显示无法找到 config.yaml 的消息。

【问题讨论】:

    标签: java maven jar executable-jar maven-shade-plugin


    【解决方案1】:

    这是 Andrea Boccacci 提供给我的解决方案。这是他让我在这里发布的答案:

    您的文件位于 jar 文件中,因此您无法从 File 类访问它,如果有这样的 API,请尝试使用 getResourceAsStream,然后切换到 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);
    

    【讨论】:

      猜你喜欢
      • 2013-11-28
      • 1970-01-01
      • 2013-04-11
      • 2012-02-07
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 2012-03-07
      相关资源
      最近更新 更多