我有2个环境来设置我的API,所以我有生产和开发人员。我首先需要找到一种自动执行此操作的方法,例如,在运行时不发送任何参数(-D)的情况下,应用程序找到了一种识别环境的方法,但我没有找到任何方法来执行此操作这样。
因此,我阅读了一个教程,同样也有一种放置环境变量并定义我的application.properties的方法。因此,请按照以下步骤操作:
我在应用程序中定义了3个文件,application.properties,application-dev.properties和application-prod.properties。
在application.properties中,我具有配置spring.profiles.active = $ {MYENV:local}。
在application-dev.properties内部,我有spring.profiles.active = dev。
在application-prod.properties内部,我有spring.profiles.active = prod。
我知道我是否通过了mvn spring-boot命令:run -Dspring-boot.run.profiles =(PROFILE)Spring会完美地选择配置文件。
我有两个问题:
我的环境变量在Windows上正确存在,为什么在我运行应用程序时spring不会在$ {MYENV:local}上填充该变量,我是否还需要进行其他配置?
我开始使用微服务,因此,如果我有多个微服务,则这种设置环境变量的方法将很难维护。有什么方法可以更容易地配置配置文件而无需发送命令行?
答案 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.properties
和application-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。