gpt4 book ai didi

java - Spring Boot 命令行属性不覆盖 application.properties 中定义的属性

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:22:59 24 4
gpt4 key购买 nike

我创建了一个使用遗留库的 Spring Boot 应用程序。这个遗留库在 XML 中定义了许多 Spring Bean。其中之一将属性值作为构造函数参数:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<bean id="myBean" class="com.em.MyBean">
<constructor-arg name="url" value="${my.url}"/>
</bean>
</beans>

在我的 Spring Boot 应用程序中,我有一个 application.properties 定义此属性如下:

my.url=http://localhost:8080

我使用 Maven Spring Boot 插件在本地运行我的应用程序,如下所示:

mvn spring-boot:run

并且属性值按预期注入(inject)到 bean 中。

如果我尝试像这样在命令行上覆盖 my.url 属性:

mvn spring-boot:run -Dmy.url=http://www.override.net

不使用覆盖值,而是使用 application.properties 中的值。

根据 Spring Boot 文档,命令行中的值应作为第一优先级:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html .这里似乎不是这种情况,因为如果我从 application.properties 中删除该属性,则会使用在命令行中传入的值,因此不会忽略命令行值共。 application.properties 值似乎覆盖了命令行值。

有人知道发生了什么事吗?

最佳答案

使用 -D 设置系统属性。 Spring Boot 可以使用系统属性中的配置,所以一般来说,它会起作用。但是,如果 spring-boot:run 为您的应用程序派生一个单独的 JVM,它将无法工作,因为系统属性将设置在错误的 JVM 上。由于它不起作用,我猜这就是正在发生的事情。

您可以使用 -Drun.arguments 将参数传递给正在运行的应用程序,无论它是否在分支 JVM 中运行。参数应该是一个以逗号分隔的列表,每个列表都以 -- 为前缀。例如,要设置 my.url:

mvn spring-boot:run -Drun.arguments=--my.url=http://www.override.net

此问题的另一个可能原因是您的 main 方法没有将它接收到的参数传递到它创建的 SpringApplication 中。您还应该检查您的主要方法是否与此类似:

public static void main(String[] args) throws Exception {
SpringApplication.run(YourApplication.class, args);
}

请注意,args 被传递到对 SpringApplication.run 的调用中。

关于java - Spring Boot 命令行属性不覆盖 application.properties 中定义的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37191969/

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