弹簧启动 jar 外部属性



我正在创建一个 Spring Boot 应用程序,但我遇到了这个问题。
我在 recource 文件夹中有我的application.properties,但我还需要 jar 外部的外部属性文件来配置属性,例如:
名字
密码
等。
我想在 jar 外部和内部资源文件夹内有外部属性文件,以便在开发时进行测试。
我尝试创建这样的配置文件:

@Configuration
 @PropertySource("classpath:" + SpringConfiguration.EXTERNALIZED_PROPERTIES)
 @PropertySource(value = "file:./" + 
 SpringConfiguration.EXTERNALIZED_PROPERTIES, ignoreResourceNotFound = true)
 public class SpringConfiguration {
       static final String EXTERNALIZED_PROPERTIES = "external.properties";
 }

但它仍然从资源文件夹中读取属性。如何让它从罐子外面读取?

尝试将绝对系统路径指定为 file: 属性的值。

或者,我建议先将该绝对路径设置为ENV变量,然后在file:中使用该变量:

@PropertySource("file:${EXTERNAL_RESOURCE_DIR}/application.properties") 

这样,当该目录更改时,您无需更改代码。

Maciej Kowalski的类似答案。

@PropertySources({
@PropertySource(value = {"classpath:application.properties"}, ignoreResourceNotFound = true),
@PropertySource(value = {"file:${external.config.location}/application.properties"}, ignoreResourceNotFound = true)

})

假设在文件夹"/home/me/configs"中,您有"application.properties"文件。

使用自定义文件夹运行应用程序:

java -jar app.jar --external.config.location="/home/me/configs"

java -jar app.jar --external.config.location="C:\users\your_user\configs"

此外,您可以将其导出为环境变量 (unix)

export JAVA_OPTS='-Dexternal_config_location=/home/me/configs'

解决方案是删除外部属性和配置文件。而不是使用它,将所有属性放在 application.properties。并将应用程序属性放入带有jar的文件夹中。Spring 会自动将此属性文件优先于jar内的属性文件。

如果你想要不同的开发和生产道具,请使用application-dev.properties和application-prod.properties,并在启动时设置正确的spring配置文件。如果您需要覆盖jar中的任何属性,只需将-Dmyproperty=myvalue添加到启动命令

@cuteBrick但是这样,您需要复制/编辑整个应用程序属性。当您只需要修改子集时,请使用 Spring 配置文件:放置application-dev.properties和/或application-prod.properties附近的 JAR 文件,并仅覆盖必要的属性(URL、机密)。

然后,运行指定弹簧配置文件的应用程序:-Dspring.profiles.active=dev(顺便说一句,默认的弹簧配置文件是default

如果需要添加外部属性,则只能在application.properties中指定。

例如: myapplication.username='john'

从 Spring 启动代码中,您可以像这样访问它:

 @Autowired  
 private Environment env;
//To access it
 String username = env.getProperty("myapplication.username");  

@Value("$myapplication.username")

如果您的要求如您所提到的,我认为没有必要使用外部文件。

最新更新