使用 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(特定于配置文件)应用程序中出现覆盖应用程序属性的问题 的相关文章

  • 将 MouseListener 添加到面板

    我正在尝试将鼠标操作添加到我的面板中 这就是程序应该做的事情 编写一个程序 允许用户通过按三下鼠标来指定一个三角形 第一次按下鼠标后 画一个小点 第二次按下鼠标后 绘制一条连接前两个点的线 第三次按下鼠标后 绘制整个三角形 第四次按下鼠标会
  • 在 jTextfield 中禁用“粘贴”

    我有一个用 Swing awt 编写的应用程序 我想阻止用户将值粘贴到文本字段中 有没有办法在不使用动作监听器的情况下做到这一点 您可以使用 null 参数调用 setTransferHandler 如下所示 textComponent s
  • 对象数组的数组(二维数组)JNI

    我正在努力创建自定义对象类型 ShareStruct 的二维数组 jobjectArray ret jobjectArray ins jobjectArray outs jclass myClass env gt FindClass env
  • 使类只能从特定类实例化

    假设我有 3 节课class1 class2 and class3 我怎样才能拥有它class1只能通过实例化class2 class1 object new class1 但不是 class3 或任何其他类 我认为它应该与修饰符一起使用
  • 如何作为应用程序发布到页面?

    所以 我有一个应用程序 Facebook 应用程序实体 并且我有一个页面 我想使用应用程序通过java代码 通过restfb或任何其他建议 发布到页面 看起来我错过了页面授予应用程序发布权限的阶段 不知道该怎么做 谢谢你们 乌里 您只能 作
  • 使用 Apache POI Excel 写入特定单元格位置

    如果我有一个未排序的参数 x y z 列表 是否有一种简单的方法将它们写入使用 POI 创建的 Excel 文档中的特定单元格 就好像前两个参数是 X 和Y 坐标 例如 我有如下行 10 4 100 是否可以在第 10 行第 4 列的单元格
  • 最快的高斯模糊实现

    如何以最快的速度实施高斯模糊 http en wikipedia org wiki Gaussian blur算法 我要用Java来实现它 所以GPU http en wikipedia org wiki Graphics processi
  • 如何在 MSSQL 中获取 CURRENT_DATE?

    我正在使用 jpa 3 o 和 Hibernate 我有一个命名查询 SELECT COUNT wt id FROM WPSTransaction wt WHERE wt createdDate gt CURRENT DATE WPSTra
  • JavaFX使节点覆盖父节点边框颜色

    我有一个如下所示的节点 仅使用 css 我希望标签覆盖其父边框颜色 因此标签下方的边框颜色部分变得不可见 我用来制作这个边框的CSS代码 fx border color black fx border width 3 fx border r
  • 无法从资源加载图片

    So I am trying to load a image file from a resource so that when I export my application into a jar file it could be use
  • 如何将 Java 地图转换为在 Scala 中使用?

    我正在开发一个 Scala 程序 该程序调用 Java 库中的函数 处理结果并生成 CSV 有问题的 Java 函数如下所示 Map
  • 具有 JPA 持久性的 Spring 状态机 - 存储库使用

    我试图弄清楚如何轻松使用 Spring 状态机 包括使用 JPA 进行持久化 这是我正在处理的问题 不兼容的数据类型 工厂和持久性 在程序的某个时刻 我想使用连接到用户的状态机 有用于此目的的存储库 项目spring statemachin
  • 拆分/标记化/扫描字符串并注意引号

    Java中是否有默认 简单的方法来分割字符串 但要注意引号或其他符号 例如 给定以下文本 There s a man that live next door in my neighborhood and he gets me down Ob
  • 在 Java 中创建 XML 文件的最佳方法是什么?

    我们目前使用 dom4j 来创建 XML 文件 不过 我猜现在有更好的东西了 如果我们使用的是 Java 1 6 或更高版本 那么在编写 XML 文件时最好使用什么类 运行速度最快 使用简单 我不需要构建一个 DOM 然后编写整个 DOM
  • 在 java 中运行外部应用程序但不要等待它完成

    我正在用java编写一个应用程序 允许我运行其他应用程序 为此 我使用了 Process 类对象 但当我这样做时 应用程序会等待进程结束 然后再退出 有没有办法在 Java 中运行外部应用程序 但不等待它完成 public static v
  • BadPaddingException:无效的密文

    我需要一些帮助 因为这是我第一次编写加密代码 加密代码似乎工作正常 但解密会引发错误 我得到的错误是 de flexiprovider api exceptions BadPaddingException 无效的密文 in the 解密函数
  • 如何以编程方式创建 CardView

    我正在开发一个 Android 应用程序Java Android Studio 我想在活动中创建CardView以编程方式 我想将以下属性设置为CardView layout width wrap content layout row 0
  • 在实现使用原始类型的接口时如何避免警告?

    我正在实施流程工厂 http help eclipse org ganymede index jsp topic org eclipse platform doc isv reference api org eclipse debug co
  • Java/MongoDB 按日期查询

    我将一个值作为 java util Date 存储在我的集合中 但是当我查询以获取两个特定日期之间的值时 我最终得到的值超出了范围 这是我的代码 插入 BasicDBObject object new BasicDBObject objec
  • java中void的作用是什么?

    返回类型 方法返回值的数据类型 如果方法不返回值 则返回 void http download oracle com javase tutorial java javaOO methods html http download oracle

随机推荐