使用 PropertiesLauncher 启动的 Spring-boot(特定于配置文件)应用程序中出现覆盖应用程序属性的问题

2024-04-30

我在尝试使用文件系统上的覆盖文件中声明的另一个值来覆盖类路径上特定于配置文件的应用程序属性文件中声明的属性时遇到困难。

我有一个自动配置的 Spring-boot 应用程序(即,使用@EnableAutoconfiguration)有多个配置文件,我使用它启动PropertiesLauncher而不是JarLauncher(原因与部署限制有关 - 我需要将分解的目录而不是存档部署到只读文件系统。)

在我的应用程序的根目录中,我有一些特定于配置文件的应用程序属性,例如:

application-dev.properties
application-qa.properties
application-prd.properties

为了论证起见,我们可以说application-dev.properties包含:

foo.bar=baz
foo.baz=other

对于任何环境,可能需要覆盖existing财产,以及提供absent一个(例如,生产密码),我看到的问题是已经在application-${profile}.properties类路径上的文件。 (提供类路径文件中不存在的属性可以正常工作,这是not问题。)

假设我在文件系统位置有一个覆盖属性文件,例如:

/local/appname/dev/overrides/application.properties

我想覆盖该属性,foo.bar,以及声明一个新属性,foo.password.

因此覆盖文件的内容是:

foo.bar=overridden-value
foo.password=something

当我启动应用程序时,我使用如下命令行:

java -Dspring.config.location=file:/local/appname/dev/overrides/ 
     -Dspring.profiles.active=dev 
     org.springframework.boot.loader.PropertiesLauncher 
     --debug &

我看到的问题是虽然foo.password, 财产not声明于application-dev.properties file is拾取,覆盖foo.bar被忽略 - 我仍然看到它的价值,baz from application-dev.properties而不是价值,overridden-value from /local/appname/dev/overrides/application.properties.

随着--debug选项已启用,我可以看到ConfigFileApplicationListener记录它已加载覆盖文件(来自文件系统)和配置文件特定文件(来自类路径),以该顺序.

我很想得出一个也许天真的结论,因为覆盖文件首先列出,所以它首先被加载,然后被类路径中的“默认”配置文件特定文件覆盖,该文件稍后列出。不过,我确实很欣赏,日志中的列出顺序不一定与行为相关。我尝试改变声明的路径的顺序spring.config.location财产,使得classpath:之前列出的file:...但这并没有帮助,而且我也不相信它会起作用,因为 Spring-boot 文档明确指出,即使您提供了值,也始终会搜索默认属性位置spring.config.location.

Spring-boot 文档对于 Spring-boot 可执行 JAR 的属性解析顺序非常具体,在下降优先顺序:

  1. 命令行参数。
  2. Java 系统属性(System.getProperties()).
  3. 操作系统环境变量。
  4. JNDI 属性来自java:comp/env
  5. A RandomValuePropertySource只具有属性random.*.
  6. 应用属性outside你打包的罐子(application.properties包括 YAML 和配置文件变体)。
  7. 打包的应用程序属性inside你的罐子(application.properties包括 YAML 和配置文件变体)。
  8. @PropertySource对你的注释@Configuration类。
  9. 默认属性(使用指定SpringApplication.setDefaultProperties).

注意第 6 行和第 7 行 - 属性outside超过属性inside你的罐子。

据我所知,没有说明的是,这可能是我困惑/问题的根源,当你not使用 JAR 但使用分解的目录(因此PropertiesLauncher.)

如果分解目录的行为与 JAR 的规定一致,我希望在中声明的属性值/local/appname/dev/overrides/application.properties将覆盖任何相同名称中声明的classpath:application-dev.properties,但事实似乎并非如此。

还从 Spring-boot 文档(附录 C.4)中注意到PropertiesLauncher)是提到loader.home属性,被描述为“...[附加属性文件的]位置”,e.g. /opt/app(默认为${user.dir})'.

所以我尝试使用loader.home代替spring.config.location,但无济于事。

(更新:我也尝试使用loader.config.location我有两个注释:它似乎想要一个文件而不是一个目录(所以它的行为是not类似于spring.config.location),当我did提供文件路径而不是父目录,它仍然没有帮助。)

谁能发现我做错了什么,或者我做了什么错误的假设?


谢谢,戴夫,你的建议 100% 正确。

如果我将属性文件重命名为/local/appname/dev/overrides to application-dev.properties然后是该文件中的属性值do覆盖那些classpath:application-dev.properties.

我确信我had昨天尝试了这个组合,但我认为阻止它工作的一定是当我在指定spring.config.location并犯了这个错误,所以它没有在正确的位置寻找覆盖文件。

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

使用 PropertiesLauncher 启动的 Spring-boot(特定于配置文件)应用程序中出现覆盖应用程序属性的问题 的相关文章

  • java中的csv到pdf文件

    我正在尝试获得一个csv文件解析为pdf 到目前为止我所拥有的内容附在下面 我的问题是这段代码最终出现在 pdf 中的文件在 csv 文件的第一行被截断 我不明白为什么 附示例 本质上我想要一个没有任何操作的 csv 文件的 pdf 版本
  • 将链接对象转换为流或集合

    我想迭代堆栈跟踪 堆栈跟踪由可抛出对象组成 其 getCause 返回下一个可抛出对象 最后一次调用 getCause 返回 null 示例 a gt b gt null 我尝试使用 Stream iterable 这会导致 NullPoi
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 如何解决 onEditCommit 事件上的类型不匹配错误?

    我在 Fxml 中使用 onEditCommit 事件在用户编辑数据后检索数据 FXML 代码
  • Java:从元素创建 DOM 元素,而不是文档

    如您所知 在 Java 中创建 Dom 元素的正确方法是执行以下操作 import org w3c dom Document import org w3c dom Element Document d Element e e d creat
  • 如何将 Spotlight for Help 插入本地化的 macOS 应用程序?

    我正在 macOS 上使用 Swing GUI 框架实现 Java 应用程序 当使用system外观和感觉以及screen菜单栏 Swing 自动插入一个搜索栏 called 聚光灯寻求帮助 https developer apple co
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • @EnableTransactionManagement 的范围是什么?

    我试图了解正确的放置位置 EnableTransactionManagement多个 JavaConfig 上下文的情况下的注释 考虑以下场景 我在 JPAConfig java 和 AppConfig java 中有 JPA 配置以及一组
  • 在 Spring Context 加载实际的 Spring Bean 之前是否模拟了模拟 bean (@MockBean)?

    让我们以下面的例子为例 Autowired MockBean private Foo foobar Spring Context 是否加载类Foo首先 然后应用模拟 或者是 Mockbean以某种方式被检测到 Spring 创建并应用模拟而
  • 尝试在没有 GatewayIntent 的情况下访问消息内容

    我希望每当我写一条打招呼的消息时 机器人都会在控制台中响应一条消息 但它只是给我一个错误 JDA MainWS ReadThread WARN JDA Attempting to access message content without
  • 如何在java中使jpeg无损?

    有没有人可以告诉我如何使用编写 jpeg 文件losslessjava中的压缩 我使用下面的代码读取字节来编辑字节 WritableRaster raster image getRaster DataBufferByte buffer Da
  • tomcat 过滤所有 web 应用程序

    问题 我想对所有网络应用程序进行过滤 我创建了一个过滤器来监视对 apache tomcat 服务器的请求 举例来说 它称为 MyFilter 我在 netbeans 中创建了它 它创建了 2 个独立的目录 webpages contain
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • Apache Commons CLI:替代已弃用的 OptionBuilder?

    IntelliJ 显示此示例代码中不推荐使用 OptionBuilderhttp commons apache org proper commons cli usage html http commons apache org proper
  • 不兼容的类型:在 java netbeans 中对象无法转换为 String

    我试图在我的项目中使用对象数组 但出现错误 incompatible types Object cannot be converted to String 在这一行 ST1 new String emt1 emt2 emt3 emt4 现在
  • .properties 文件的 log4j2 KeyValuePair

    如何在属性文件中的 log4j2 中创建键值对 我知道在 log4j 版本 1 中它是这样完成的 log4j appender x additionalFields key value log4j2 中的 XML 方式是
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http

随机推荐