gpt4 book ai didi

java - Uber jar 不读取外部属性文件

转载 作者:行者123 更新时间:2023-12-02 12:54:03 30 4
gpt4 key购买 nike

我正在创建一个 uber jar,即具有我的项目依赖项的 jar。我有一堆该项目使用的属性文件。我希望能够在运行我的项目之前更改这些属性文件,因此我希望它们位于 jar 之外。这是我的 pom 的相关部分

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2</version>
<configuration>

<artifactSet>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.json</exclude>
</excludes>
</artifactSet>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>path.to.main.Main</mainClass>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path>
<Class-Path>conf/</Class-Path>
</manifestEntries>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>install</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/conf</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.json</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

所以本质上,我想创建一个文件夹 ${basedir}/target/conf 并复制所有 .properties.json文件到它。另外,这是我阅读文件的方式

InputStream in = this.getClass().getClassLoader().getResourceAsStream("filename.properties");

我面临一些问题

  1. 当我执行mvn clean install时,我仍然看到.properties.json文件在 >classes 文件夹。难道他们不应该被排除吗?

  2. conf 文件夹是使用所有文件创建的,但是当我运行 jar 并尝试更改属性时,更改未生效 。我如何确保 conf 文件夹被添加到类路径中?

  3. 我希望能够从 src/main/resources 文件夹加载 .properties.json 文件,同时我正在开发,所以我不想将它们放在单独的文件夹中。这可能吗?

最佳答案

我遇到了同样的问题,Uber jar 没有读取外部配置文件。我尝试了下面的配置,它的效果非常好。请参阅下面的配置,它可能会帮助遇到 uber jar 不读取 extenarl 文件问题的人。我不确定这是否是最好的方法,但尚未在网上找到任何灵魂:)

  1. 我已使用 IncludeResourceTransformer 包含资源。
  2. 使用过滤器从 uber jar 中删除属性文件。
  3. 在类路径/conf 中从外部文件夹读取属性。

    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.3</version>
    <executions> <!-- Run shade goal on package phase -->
    <execution>
    <phase>package</phase>
    <goals>
    <goal>shade</goal>
    </goals>
    <configuration>
    <transformers>
    add Main-Class to manifest file
    <transformer
    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
    <manifestEntries>
    <Main-Class>JobName</Main-Class>
    <Class-Path>conf/</Class-Path>
    </manifestEntries>
    </transformer>
    <transformer
    implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
    <resource>src/main/resources/config.properties</resource>
    <file>${project.basedir}/src/main/resources/config.properties</file>
    </transformer>
    </transformers>
    <finalName>FinalJarName</finalName>
    <filters>
    <filter>
    <artifact>groupId:artifactId</artifact>
    <excludes>
    <exclude>**/*.properties</exclude>
    </excludes>
    </filter>
    </filters>
    </configuration>
    </execution>
    </executions>
    </plugin>

祝你好运。

关于java - Uber jar 不读取外部属性文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44507697/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com