【问题标题】:How to externalize application.properties to an external filesystem location in Spring Boot?如何将 application.properties 外部化到 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;

}

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

【问题讨论】:

    标签: spring tomcat deployment spring-boot


    【解决方案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 属性,如果您希望它外部)。
        猜你喜欢
        • 2015-09-10
        • 2016-01-01
        • 2021-05-17
        • 2015-10-27
        • 2020-11-09
        • 1970-01-01
        • 2017-10-22
        • 1970-01-01
        • 2019-08-17
        相关资源
        最近更新 更多