为了账号安全,请及时绑定邮箱和手机立即绑定

弹簧启动属性,具有来自依赖项的配置文件

弹簧启动属性,具有来自依赖项的配置文件

素胚勾勒不出你 2022-09-22 10:26:25

问题:

我在软件中有3个部分:

  • 客户端 A 服务

  • 客户端 B 服务

  • 目标 C 服务

我想从A和B
连接到C,我写了一个具有以下设置的库:

  • /src/main/java/pkg.../目标连接器.java

  • /src/main/java/pkg.../目标配置.java

  • /src/main/resources/应用程序开发属性

  • /src/main/resources/application-tst.properties

  • /src/main/resources/application-prd.properties

我的客户 A 和 B 都有自己的来源和属性:

  • /src/main/java/pkg.../Client{A/B}Service.java

  • /src/main/java/pkg.../Client{A/B}Config.java

  • /src/main/resources/应用程序开发属性

  • /src/main/resources/application-tst.properties

  • /src/main/resources/application-prd.properties

连接器的属性包含服务的一些登录信息,例如

target.url=https://....

target.usr=blablabla

target.key=mySHAkey

在目标配置中用于预配置连接器,例如


@Value("target.url")

String url;

@Value("target.usr")

String usr;

@Value("target.key")

String key;


@Bean

public TargetConnector connector() {

  return new TargetConnector(url, usr, key);

}

现在,当我在客户端中使用连接器 jar 时,我可以通过软件包扫描找到配置。连接器类已加载,但问题是它不加载属性文件。


研究


我发现多个属性文件不能具有相同的名称(例如,客户端应用程序-{profile}.属性与来自连接器的应用程序冲突),因此我尝试将目标连接器的应用程序-{profile}.属性重命名为应用程序连接器-{profile}.属性。

仍然没有加载的属性(这是有道理的,因为我没有例如连接器开发配置文件,但我的配置文件只是命名为dev)。


此外,即使我尝试使用以下命令从连接器显式加载其中一个属性文件:


@PropertySource({"classpath*:application-connector-dev.properties"}) 

找不到

问题

我的问题实际上是3分层的:

  1. 如何在依赖项 jar 中加载属性文件?

  2. 如果属性文件的名称与 application.properties 的名称不同,如何加载属性文件的分析版本?例如,应用程序连接器属性

  3. 如何组合问题 1 和 2 中的答案,将属性的分析版本加载到 jar 中?

如果需要进一步解释,请询问。

我选择了接受的答案中给出的方法。我刚刚为包含所需值的 dev,tst,prd 配置文件创建了 3 个配置,并使用正确的配置文件注释了配置文件。


查看完整描述

3 回答

?
白衣染霜花

TA贡献1489条经验 获得超9个赞

您正在使用@Configuration带注释的类。也许您可以为每个配置文件提供一个。下面是一个示例:


@Configuration

@Profile("profileA")

@PropertySource({"classpath:application-profileA.properties"})

public class ConfigurationProfileA{

 @Value("${target.url}")

 String url;

 @Value("${target.usr}")

 String usr;

 @Value("${target.key}")

 String key;


 @Bean

 public TargetConnector connector() {

   return new TargetConnector(url, usr, key);

 }

}

对配置文件B执行相同的操作(也许您可以更好地构建它,但这里的关键点是注释@Profile(“”)和@PropertySource(“”))


一旦你有了配置类,Spring将使用你想要的配置类,只需填写 -spring.profiles.active=profileA(或你在@Profile(“)注释中编写的配置文件的名称)


查看完整回答
反对 回复 2022-09-22
?
侃侃无极

TA贡献1691条经验 获得超10个赞

我认为这行中有一个拼写错误@PropertySource({“类路径*:应用程序连接器-dev.properties”})请通过删除星号进行检查。


查看完整回答
反对 回复 2022-09-22
?
大话西游666

TA贡献1485条经验 获得超13个赞

为了使用特定配置文件运行,您可以使用例如选项运行-spring.profiles.active=dev

如果您不使用配置文件运行,它将加载您似乎没有的默认配置文件。application.properties

此外,建议始终具有应用程序.properties,并在其中放入公共属性和将在其他属性文件中重写的默认值。

另一个错误是如何分配带有注释的属性,您需要使用@Value@Value("${PROPERTY_FROM_PROPERTIES_FILE}")


查看完整回答
反对 回复 2022-09-22

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信