【问题标题】:Spring Boot External properties outside of jarjar之外的Spring Boot外部属性
【发布时间】:2024-04-20 09:00:01
【问题描述】:

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

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

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

【问题讨论】:

  • 将此@PropertySource("classpath:" + SpringConfiguration.EXTERNALIZED_PROPERTIES) 更改为@PropertySource("file:" + {location}/propertiesfilename) 它将使您可以访问外部,您还必须准确给出{location} 通过 JVM 参数或 spring 参数

标签: java spring spring-boot jar properties


【解决方案1】:

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

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

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

这样,当该目录发生变化时,您就无需更改代码。

【讨论】:

    【解决方案2】:

    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'
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        解决方法是删除 external.properties 和配置文件。而不是使用它,而是将所有属性放入 application.properties。并将 application.properties 放入带有 jar 的文件夹中。 Spring 自动将此属性文件优先于 jar 中的属性文件。

        【讨论】:

          【解决方案5】:

          如果您需要添加外部属性,您可以仅在 application.properties 中指定。

          例如: myapplication.username='john'

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

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

          @Value("$myapplication.username")

          如果您的要求如您所提及的那样,我认为没有必要拥有外部文件。

          【讨论】:

          • 我希望外部文件在不创建新 jar 文件的情况下更改某些属性。
          • *.com/questions/41754459/…这就是你要找的东西?