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

时间:2014-06-18 21:44:56

标签: spring tomcat deployment spring-boot

@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;

}

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

4 个答案:

答案 0 :(得分:1)

如果您正在向Tomcat部署WAR,那么您需要按照此处所述定义上下文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加载属性文件。

答案 1 :(得分:0)

无需使用@PropertySource注释来定义它。您应该使用spring.config.location属性来设置application.properties位置。可以在命令行中设置该属性:

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

答案 2 :(得分:0)

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

为前缀
SPRING_CONFIG_LOCATION = file:C:/workspace/application.properties

SPRING_CONFIG_LOCATION = file:C:/workspace/

有关此here的更多信息。

答案 3 :(得分:0)

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

@PropertySource无效,因为您缺少@Configuration注释。根据{{​​3}}文档,您的@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)

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