弹簧启动应用程序的外部配置

时间:2015-03-17 18:06:02

标签: java spring-boot tomcat

我有一个spring-boot应用程序,我想用外部配置文件运行。 当我以jar形式运行它(带有嵌入式servlet容器)时,一切都很好。 但我想在外部servlet容器(Tomcat)下运行它,这里我有外部配置问题。我尝试过@PropertySource,但在这种情况下,应用程序只获取war文件配置中不存在的属性:外部配置不会覆盖内部配置。 所以问题是:如何配置外部配置以覆盖内部配置?

4 个答案:

答案 0 :(得分:25)

当您将应用程序作为jar运行时,您可能在当前目录中以application.properties的形式使用外部配置。但是,当在外部tomcat中部署为战争时,“当前目录”不是很有用。即使您发现当前目录是什么,它很可能是在该tomcat中运行的所有应用程序的相同位置,因此当您运行多个应用程序时,这将无法正常工作。

我们在这里做的是在我们的应用程序中声明两个PropertySources

@PropertySources({@PropertySource(value={"classpath:internal.properties"}), @PropertySource(value={"file:${application.properties}"})})

internal.properties包含“内置”默认值。第二个PropertySource是包含外部配置的文件。请注意文件的名称本身是如何属性。

我们在应用程序的Context元素中进行外部定义(在tomcat中):

<Context docBase="/path/to/your/war/your.war">
    <Parameter name="application.properties" value="/path/to/your/properties/application.properties"/>
</Context>

这允许您在tomcat中运行多个应用程序,每个应用程序使用它自己的外部属性文件。您甚至可以使用不同属性运行相同应用程序的多个实例。

答案 1 :(得分:17)

要在部署为war文件时外部化Spring Boot application.properties,可以在配置Spring Boot应用程序时在开头设置spring.config.location

public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder) {
        return springApplicationBuilder
                .sources(Application.class)
                .properties(getProperties());
    }

    public static void main(String[] args) {

        SpringApplicationBuilder springApplicationBuilder = new SpringApplicationBuilder(Application.class)
                .sources(Application.class)
                .properties(getProperties())
                .run(args);
    }

   static Properties getProperties() {
      Properties props = new Properties();
      props.put("spring.config.location", "classpath:myapp1/");
      return props;
   }

有关详细信息,请查看此solution

答案 2 :(得分:15)

Spring Boot商品many ways用于指定商品的位置,不需要修改商家信息。

Yo可以定义 spring.config.location 值,例如:

  • tomcat/conf/Catalina/<host>上下文描述符中:

    <Context>
        <Parameter name="spring.config.location" value="/path/to/application.properties" />
    </Context>
    
  • 作为tomcat setenv.sh文件中的JVM参数:

    -Dspring.config.location=/path/to/application.properties
    
  • 作为SPRING_CONFIG_LOCATION环境变量。

答案 3 :(得分:0)

您可以将配置文件文件夹添加到 set Classpath 行catalina.bat,catalina.sh(如果要使用的话,可以选择该行),也可以添加到setenv.bat / sh文件中。您的配置文件将被添加到war classpath。

例如;

在Windows环境中。

set CLASSPATH=D:\app\conf