如何使用Spring Boot和Maven设置配置文件?

时间:2018-08-24 12:49:48

标签: java spring maven spring-boot

我有2个环境来设置我的API,所以我有生产和开发人员。我首先需要找到一种自动执行此操作的方法,例如,在运行时不发送任何参数(-D)的情况下,应用程序找到了一种识别环境的方法,但我没有找到任何方法来执行此操作这样。

因此,我阅读了一个教程,同样也有一种放置环境变量并定义我的application.properties的方法。因此,请按照以下步骤操作:

  1. 我在应用程序中定义了3个文件,application.properties,application-dev.properties和application-prod.properties。

  2. 在application.properties中,我具有配置spring.profiles.active = $ {MYENV:local}。

  3. 在application-dev.properties内部,我有spring.profiles.active = dev。

  4. 在application-prod.properties内部,我有spring.profiles.active = prod。

  5. 我知道我是否通过了mvn spring-boot命令:run -Dspring-boot.run.profiles =(PROFILE)Spring会完美地选择配置文件。

我有两个问题:

  1. 我的环境变量在Windows上正确存在,为什么在我运行应用程序时spring不会在$ {MYENV:local}上填充该变量,我是否还需要进行其他配置?

  2. 我开始使用微服务,因此,如果我有多个微服务,则这种设置环境变量的方法将很难维护。有什么方法可以更容易地配置配置文件而无需发送命令行?

3 个答案:

答案 0 :(得分:1)

在应用程序启动期间,您需要将变量-Dspring.profiles.active=dev传递给虚拟机。

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html

请勿将此变量放入您的application-${env}.properties文件中。重点在于,spring在基于spring.profiles.active的应用程序启动期间解析正确的配置。因此,在您的情况下,您不需要application.properties文件。您可以简单地删除它。保留您的dev和prod配置并提供适当的变量。您无需在系统变量中进行设置-您需要直接指导应用。试试:

java -jar myApplication.jar -Dspring.profiles.active=dev

如果您希望根据系统属性解析环境,则可以尝试:

java -jar myApplication.jar -Dspring.profiles.active=%MYENV%

如果您想知道哪个env应用程序正在运行,可以尝试:

@Value("${spring.profiles.active}")
private String activeProfile;

Maven概要文件在编译期间已解决。那是两个不同的世界。

答案 1 :(得分:1)

您可以通过以下不同方式来设置配置文件:

1)使用application.properties:

spring.profiles.active=dev

2)使用@Profile批注:

@Configuration
@Profile({ "profile1", "profile2" })
public class Test {

  @Bean
  public Employee employee() {
    ...
  }
}

3)使用Maven:

<profile>
        <id>production</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <activeProfile>production</activeProfile>
        </properties>
    </profile>

4)使用vmargument,我们可以如下所示:

mvn spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=production"

5)使用System.setProperty():

System.setProperty("spring.profiles.active", "dev");

6)通过实现WebApplicationInitializer

@Configuration
public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        servletContext.setInitParameter("spring.profiles.active", "dev");
    }
}

7)使用web.xml:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/app-config.xml</param-value>
</context-param>
<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>dev</param-value>
</context-param>

答案 2 :(得分:0)

有多种方法可以做到这一点。我个人最直接的发现如下:

第1步:除了您的application.properties文件之外,还要创建更多property文件(每个配置文件一个)。例如-application-test.propertiesapplication-prod.properties。现在,您的resource文件夹中有三个属性文件。

第2步:在您的application.properties文件中,在spring.profiles.active中提及当前的个人资料。例如-spring.profiles.active=test将激活测试配置文件。

第3步:定义特定于配置文件的bean。

@Bean
@Profile("test")
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
    return args -> {
        System.out.println("Let's inspect the beans provided by Spring Boot:");
        String[] beanNames = ctx.getBeanDefinitionNames();
        Arrays.sort(beanNames);
        for (String beanName : beanNames)
            System.out.println(beanName);
    };
}

如果活动配置文件之一是test,则会创建一个bean。