如何将 application.properties 外部化到 Spring Boot 中的外部文件系统位置?

Posted

技术标签:

【中文标题】如何将 application.properties 外部化到 Spring Boot 中的外部文件系统位置?【英文标题】:How to externalize application.properties to an external filesystem location in Spring Boot? 【发布时间】:2014-08-09 08:04:18 【问题描述】:
@ComponentScan
@EnableAutoConfiguration
@PropertySource(value =  "file:/Users/Documents/workspace/application.properties" )

public class Application  extends SpringBootServletInitializer
    public static void main(String[] args) 
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
    

在这种情况下,它在部署时给出:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] found for dependency:

无法找到将应用程序属性文件外部化的正确方法

我尝试了正确加载的自动装配环境变量,但是我需要手动定义所有的 bean

@Bean 
public JdbcTemplate dataSource() 
    String driverClassName = env
            .getProperty("spring.datasource.driverClassName");
    String dsUrl = env.getProperty("spring.datasource.url");
    String username = env.getProperty("spring.datasource.username");
    String password = env.getProperty("spring.datasource.password");
    //DataSource dataSource = new SimpleDriverDataSource(new driverClassName, dsUrl, username, password);
    JdbcTemplate jdbc = new JdbcTemplate(dataSource);
    return jdbc;


这部署不会抛出错误但没有响应。

【问题讨论】:

【参考方案1】:

如果您将 WAR 部署到 Tomcat,那么您需要定义一个上下文 XML,如下所述:https://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Defining_a_context

例如,如果您有 http://localhost:8080/my-app/,您通常会定义 $CATALINA_BASE/conf/Catalina/localhost/my-app.xml。

该文件将如下所示:

<Context docBase='path/to/my-app/my-app.war'>
   <Environment name='app_config_dir' value='path/to/my-app/' type='java.lang.String'/>
</Context>

在您的代码中,实现 ApplicationContextAware 并覆盖 setApplicationContext。这是一个例子:

public class Setup implements ApplicationContextAware 

  @Override
  public void setApplicationContext(ApplicationContext applicationContext)  throws BeansException 
    log.info("Set application context. App Config Property: ",applicationContext.getEnvironment().getProperty("app_config_dir"));
  

您现在可以从app_config_dir 加载属性文件。

【讨论】:

【参考方案2】:

您也可以使用@PropertySource,因为它在您将应用程序作为war 文件部署到tomcat 时很有用。

@PropertySource 不起作用,因为您缺少 @Configuration 注释。根据Spring-Boot 文档,@PropertySource 注释应该出现在您的@Configuration 类中。

以下作品

@Configuration
@ComponentScan
@EnableAutoConfiguration
@PropertySource(value =  "file:/Users/Documents/workspace/application.properties" )

public class Application  extends SpringBootServletInitializer
    public static void main(String[] args) 
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);

您还可以加载多个属性文件。例如:

@PropertySource(value = "classpath:application.properties", "file:/Users/overriding.propertis", ignoreResourceNotFound = true)

请注意,声明文件的顺序很重要。如果在两个或多个文件中定义了相同的键,则与最后声明的文件中的键关联的值将覆盖任何先前的值。

【讨论】:

【参考方案3】:

您可以定义一个名为SPRING_CONFIG_LOCATION 的环境变量,并为其指定一个值,该值可以是文件夹(应以/ 结尾)或文件。在任何情况下,位置都应该以file:为前缀:

SPRING_CONFIG_LOCATION = file:C:/workspace/application.properties

SPRING_CONFIG_LOCATION = file:C:/workspace/

更多关于这个here。

【讨论】:

现在所有部署在服务器上的应用程序都会扫描该文件或文件夹的属性,尽管它适用于已部署的战争!任何建议【参考方案4】:

不需要使用@PropertySource注解来定义它。您应该只使用spring.config.location 属性来设置您的application.properties 位置。例如,可以在命令行中设置该属性:

java -jar myapp.jar --spring.config.location=/Users/Documents/workspace/

【讨论】:

我实际上是将它打包成一个 .war 并将其部署在 tomcat 服务器中。我想不出除了 export CATALINA_OPTS="-Dspring.config.location=file:/usr/local/myapp/application.properties" 之外的命令行参数,我的架构师指出要更改网络服务器级别的变量,我们为此需要重启服务器!需要将其作为一些现有的环境变量传递,并且文件名需要在 war build 中! 您不必使用环境变量。您可以使用 Spring Environment 中已知的任何内容(例如,ServletContext init 参数,如果您希望它内部存档,或 JNDI 属性,如果您希望它外部)。

以上是关于如何将 application.properties 外部化到 Spring Boot 中的外部文件系统位置?的主要内容,如果未能解决你的问题,请参考以下文章

未从 application.properties 中提取 Spring Boot JOOQ sql 方言

Spring boot 的 properties 属性值配置 application.properties 与 自定义properties

Jar不包含我的课程文件gitlab-ci

logback-结合spring profile使用

日志记录:在 Spring Boot 中使用 log4j2.properties 文件实现 Log4j2

如何将thinkcmf导入eclipse