当前位置: 首页 > 知识库问答 >
问题:

Spring Boot:是否可以使用外部application.properties文件在任意目录下使用fat JAR?

萧明贤
2023-03-14

我试着有两个文件。

  • 第一个在应用程序JAR的根文件夹上。
  • 第二个在类路径中指定的目录上。

2个文件都名为“Application.Properties”。

事实上,Jar版本的行为是正确的。这是java.exe的规范。当指定-jar选项时,java.exe同时忽略-CLASSPATH选项和CLASSPATH环境变量,并且类路径将只包含jar文件。因此,类路径上的第二个application.properties文件将被忽略。

现在,我如何让类路径上的第二个application.properties加载呢?

更新4:

关键是PropertiesLauncher。

要使用PropertiesLauncher,必须像这样更改pom.xml文件:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>  <!-- added -->
                <layout>ZIP</layout> <!-- to use PropertiesLaunchar -->
            </configuration>
        </plugin>
    </plugins>
</build>

为此,我引用了以下StackOverflow问题:spring boot properties launcher无法使用。顺便说一句,在Spring Boot Maven Plugin文档(http://docs.Spring.io/spring-boot/docs/1.1.7.release/maven-plugin/repackage-mojo.html)中,没有提到指定使用PropertiesLauncher的ZIP触发器。(也许在另一份文件中?)

构建完jar文件后,我可以通过检查jar中的meta-inf/menifest.mf中的Main-Class属性看到PropertiesLauncher。

现在,我可以按如下方式运行jar(在Windows中):

java -Dloader.path=file:///C:/My/External/Dir,MyApp-0.0.1-SNAPSHOT.jar -jar MyApp-0.0.1-SNAPSHOT.jar

注意,应用程序jar文件包含在loader.path中。

(顺便说一句,我更改了问题的标题,以便更具体地说明这个问题。)

共有1个答案

蔺翰音
2023-03-14

如果您没有更改Spring Boot的默认值(意味着您正在使用@enableAutoConfiguration@SpringBootApplication,并且没有更改任何属性源处理),那么它将按照以下顺序(最高覆盖最低)查找属性:

  1. 当前目录的/config子目录
  2. 当前目录
  3. 类路径/config
  4. 类路径根

在文档的这一部分中提到了上面的列表

Spring Boot使用的这个默认顺序允许非常容易的配置外部化,从而使应用程序易于在多个环境中配置(开发、阶段、生产、云等)

要查看Spring Boot为属性读取提供的全部功能(提示:与从application.properties读取相比,还有更多可用功能),请查看文档的这一部分。

从我上面的简短描述或完整文档中可以看出,Spring Boot应用程序是非常友好的DevOps!

 类似资料:
  • 问题内容: 我尝试有2个文件。 第一个位于应用程序Jar的根文件夹中。 第二个在类路径中指定的目录上。 2个文件都命名为“ application.properties”。 是否可以“合并”两个文件的内容?(第二个属性的值会覆盖第一个属性的值)或者,如果我有一个文件,则另一个文件会被忽略? 更新1:可以“合并”内容。昨天似乎第一个被忽略了,但这似乎是因为那时有些问题。现在它运作良好。 更新2:又回

  • Java中的jlink功能允许您为应用程序创建单独的运行时环境。通常,此应用程序所需的所有模块都由jlink压缩成一个大的“模块”文件。 我很感兴趣的是,是否有办法去掉一些模块,使它们成为单独的jar文件,但让jlink能够找到它们并仍然运行应用程序。有没有办法做到这一点? 例如,如果您正在处理一个LGPL库,那么就是这种情况的一个用例。您可能希望将LGPL库从庞大的模块“blob”中删除,并将其

  • 问题内容: 我正在使用一个第三方库,该库通过GraphicsEnvironment:getAllFonts()调用来访问字体。这包括属于JRE和操作系统的字体注册表中的字体。 但是在连接到我们服务器的客户端计算机上,我很可能无法在这些位置中的任何一个中安装字体。那么,如何使JRE可以使用其他字体,以便此调用将它们选中呢?有没有办法扩大其搜索路径? 我可以使用Font.createFont()调用从

  • 是否可以用交易发送任意文本? 是的。文本应该是ASCII编码的,并在交易的数据中以十六进制字符串的形式提供。示例如下: RawTransaction.createTransaction( <nonce>, GAS_PRICE, GAS_LIMIT, "0x<address>", <amount>, "0x<hex encoded text>"); byte[] signedMes

  • 问题内容: 是否可以用来捕获任意一组可选参数? 例如,以下两个都应被接受为输入: 先验的 我不知道会指定哪些可选参数,但是会相应地处理它们。 问题答案: 这是一种黑客手段,但效果很好: 检查未添加的参数并添加它们 例如: 那么结果将是