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

2024-04-18

是否可以有多个 application.properties 文件? (EDIT:请注意,这个问题演变成了标题上的问题。)

我尝试有2个文件。

  • 第一个位于应用程序 Jar 中的根文件夹中。
  • 第二个位于类路径中指定的目录中。

2 个文件都命名为“application.properties”。

是否可以“合并”两个文件的内容? (第二个文件的属性值会覆盖第一个文件的属性值)或者,如果我有一个文件,那么另一个文件将被忽略?

UPDATE 1:可以“合并”内容。昨天好像第一个被忽略了,但似乎是因为当时有什么东西坏了。现在效果很好。

UPDATE 2: 又回来了!同样,仅应用两个文件之一。很奇怪......它是在我使用 Spring Tool Suite 构建应用程序 jar 文件后开始的。而且 Jar 版本似乎总是忽略第二个版本(在类路径中),而在 STS 上运行的扩展版本的行为有所不同。我可以从哪里开始调查呢?

UPDATE 3:

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

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

UPDATE 4:

我设法在使用 -jar 选项时在外部路径中加载 application.properties 文件。

关键是 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属性启动器无法使用 https://stackoverflow.com/questions/21322673/spring-boot-properties-launcher-unable-to-use。顺便说一句,在 Spring Boot Maven 插件文档中(http://docs.spring.io/spring-boot/docs/1.1.7.RELEASE/maven-plugin/repackage-mojo.html http://docs.spring.io/spring-boot/docs/1.1.7.RELEASE/maven-plugin/repackage-mojo.html),没有提到指定 ZIP 会触发使用 PropertiesLauncher。 (也许在另一个文档中?)

构建 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 中。

现在 C:\My\External\Dir\config 中的 application.properties 文件已加载。

作为奖励,该目录中的任何文件(例如,静态 html 文件)也可以由 jar 访问,因为它位于加载程序路径中。

至于UPDATE 2中提到的非jar(扩展)版本,可能存在类路径顺序问题。

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


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

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

上面的列表在this http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-application-property-files文档的一部分

这意味着如果找到一个属性,例如application.properties under src/resources将被在中找到的同名属性覆盖application.properties in the /config打包的 jar 的“下一个”目录。

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

查看 Spring Boot 提供的用于属性读取的整套功能(提示:除了从application.properties) 查看this http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config文档的一部分。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot:是否可以使用 fat jar 在任意目录中使用外部 application.properties 文件? 的相关文章

随机推荐

  • 在 c# .Net 中创建基于索引的类

    我有一些类 想使用索引或类似的东西访问它们的属性 ClassObject 0 或者更好的是ClassObject PropName 而不是这个 ClassObj PropName Thanks 您需要索引器 http msdn micros
  • 如何在VBA中创建n个数组

    我有下面的代码 它可以完美地工作并完成我需要的技巧 但是我希望这段代码运行 n 次并创建 n 个数组 我的数据集是 我的代码是 Option Explicit Private Sub Test Const startRow As Long
  • 在 Drupal 8 中按节点获取分类术语 ID

    我正在尝试按特定节点获取分类数据 如何使用 Node 对象获取分类术语 ID Drupal 版本 8 3 6 你可以这样做 termId node gt get field yourfield gt target id 然后你可以加载该术语
  • 自动引用计数下,为什么不允许retain、release、dealloc?

    当尝试使用时 retain release and dealloc在 Xcode 4 2 中使用自动引用计数构建应用程序时 我收到如下错误 自动引用计数禁止 显式消息发送 dealloc 为什么我会看到这个错误 是 retain relea
  • 只能使用releaseImplementation和debugImplementation从maven添加Kotlin Multiplatform Mobile库

    每次我将 Kotlin Multiplatform Mobile 库发布到 Maven Central 时 我似乎唯一可以在 Android 应用程序中添加 使用 Android 依赖项的方法是添加releaseImplementation
  • 如何在 Ember.js 中指定动态根 URL?

    Ember 允许在路由器上指定根 URL http emberjs com guides routing toc specifying a root url http emberjs com guides routing toc speci
  • Symfony 4. InheritanceType("JOINED") 和 ParamConverter。奇怪的现象

    我已经定义了 CoreCase 类 ORM Entity repositoryClass App Repository CoreCaseRepository ORM InheritanceType JOINED ORM Discrimina
  • 块和保留周期

    一个小问题 为什么 Xcode 会抱怨listing 1会导致保留周期 而在listing 2它不是 在这两种情况下 clients is an int实例变量 在listing 2它被分配了0 in the init method 背景信
  • Powershell命令:rm -rf

    rm是删除item 但是参数是多少 rf做或表示 每当我输入 help rf 时 它都会打印 powershell 中可用命令的完整列表 如果您输入会发生什么rm rf在 powershell 中 通过阅读周围的资料 我发现它会删除驱动器上
  • GitHub Atom - 删除编辑器中的中心线

    我刚刚下载了 GitHub Atom Editor 正在对其进行自定义 但我无法删除编辑器中间的那行 有人帮我看看如何删除那条线吗 该行由wrap guide 包提供 您可以使用以下选项来删除该行 Option 1 禁用换行指南包裹 去At
  • 使用 XML 和 XSLT 生成 SQL

    我有一个 XML 定义 其中包含一个带有子元素的元素 例如 a b b a
  • 可以用宏获取评论吗?

    我试图解析一些代码并重新格式化它们 但似乎引用只会忽略注释 有什么办法可以实现这一点吗 我想我必须深入 erlang 方面 不 您无法在宏内获取代码注释 它们永远不会成为 AST 的一部分 并且仍然被丢弃在 Elixir 的标记器中
  • 使用 CRON 作业执行 PHP 脚本 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想每天午夜运行一个 PHP 脚本
  • JPEG 标头丢失/损坏

    我有一个 130kb jpeg 图像 无法在任何程序中打开 我需要修复它 从我使用的各种图像恢复软件中 我得到的只是 图像头损坏 丢失 当我查找文件的属性时 我什至没有得到任何信息 没有尺寸等 只有文件大小 一旦图像的标头丢失 是否可以恢复
  • 如何在 Ruby 中进行模糊子字符串匹配?

    我发现了很多关于模糊匹配的链接 将一个字符串与另一个字符串进行比较 看看哪个字符串的相似度得分最高 我有一个很长的字符串 一个文档 和一个子字符串 子字符串来自原始文档 但已被转换多次 因此可能会引入奇怪的工件 例如这里有一个空格 那里有一
  • Neo4j 的数据库级验证

    我使用 Neo4j 作为我的图形数据库 假设我想限制用户名字段的长度小于10 有没有办法在数据库级别施加这样的约束 现在 您必须在应用程序级别上执行此操作 或者通过注册一个事务提交挂钩来检查该属性字段是否符合特定标准 See http do
  • 免费的 XSD 到 DTD 转换实用程序?

    我有一个 XSD XML 架构 需要将其转换为 DTD 有免费的实用程序或简单的方法来完成此任务吗 例如 XSLT Python 脚本也很受欢迎 Note 这是问题的相反方向免费 DTD 到 XSD 转换实用程序 https stackov
  • Akka Actor 询问和类型安全

    我如何使用 Akka Actor Ask 并维护类型安全 或者避免使用 询问 而使用 告诉 打电话时 or ask在 Akka Actor 上 Future Any 返回 我必须通过进行显式转换future mapTo MyType 我不喜
  • Android - 拥有多个共享首选项是不好的做法吗?

    我有一个应用程序使用SharedPreferences 一个仅存储应用程序版本以检查更改日志的更新 另一个包含一些布局信息clear 当用户选择时被调用 我终于设法得到了PreferenceFragment工作并注意到一种趋势 所以我想在我
  • Spring Boot:是否可以使用 fat jar 在任意目录中使用外部 application.properties 文件?

    是否可以有多个 application properties 文件 EDIT 请注意 这个问题演变成了标题上的问题 我尝试有2个文件 第一个位于应用程序 Jar 中的根文件夹中 第二个位于类路径中指定的目录中 2 个文件都命名为 appli