[英]How to set Spring profile from system variable?
我有一个使用另一个项目的 Spring 项目。 每个项目都有自己的 spring 配置文件,使用每个配置文件的applicationContext.xml
和*.properties
从 java 代码初始化。 我从args[]
注入配置文件。 问题是第二个项目使用applicationContext.xml
中 env 的默认配置 我无法将args[]
中的 env 注入第二个项目,我尝试寻找一篇文章来解释 Spring 配置文件的工作原理。
applicationContext.xml
中配置默认值时,是否有一个层次结构可以查看配置文件?applicationContext.xml
配置更强?关于该主题的文章甚至示例将不胜感激。
SPRING_PROFILES_ACTIVE 是覆盖/选择 Spring 配置文件的环境变量
如果您提供 JVM 的 Spring 配置文件,则应该没有问题:
java -Dspring.profiles.active=development -jar yourApplication.jar
另请参阅 Spring 文档:
69.5 设置激活的 Spring 配置文件
Spring Environment 有一个 API,但通常您会设置系统属性 (spring.profiles.active) 或操作系统环境变量 (SPRING_PROFILES_ACTIVE)。 例如,使用 -D 参数启动您的应用程序(记住将其放在主类或 jar 存档之前):
$ java -jar -Dspring.profiles.active=production demo-0.0.1-SNAPSHOT.jar
在 Spring Boot 中,您还可以在 application.properties 中设置活动配置文件,例如
spring.profiles.active=生产
以这种方式设置的值会被 System 属性或环境变量设置替换,但不会被 SpringApplicationBuilder.profiles() 方法替换。 因此,后一种 Java API 可用于扩充配置文件而无需更改默认值。
有关更多信息,请参阅第 25 章“Spring Boot 功能”部分中的配置文件。
我通常使用基于注释的配置而不是基于 XML 的配置来配置 applicationContext。 无论如何,我相信他们都有相同的优先级。
*回答你的问题,系统变量有更高的优先级*
@Component
@Profile("dev")
public class DatasourceConfigForDev
现在,配置文件是dev
注意:如果配置文件以@Profile("!dev")
则配置文件将排除 dev 并用于所有其他配置。
<beans profile="dev">
<bean id="DatasourceConfigForDev" class="org.skoolguy.profiles.DatasourceConfigForDev"/>
</beans>
@Configuration
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.setInitParameter("spring.profiles.active", "dev");
}
}
@Autowired
private ConfigurableEnvironment env;
// ...
env.setActiveProfiles("dev");
<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>
作为参数传递的配置文件名称将在应用程序启动期间激活:
-Dspring.profiles.active=dev
在 IDE 中,您可以设置应用程序运行时要使用的环境变量和值。 以下是Eclipse中的运行配置:
通过命令行设置: export spring_profiles_active=dev
任何未指定配置文件的 bean 都属于“默认”配置文件。
如果您使用 docker 部署 spring boot 应用程序,则可以使用标志e设置配置文件:
docker run -e "SPRING_PROFILES_ACTIVE=prod" -p 8080:8080 -t r.test.co/myapp:latest
您可以通过提供-Dspring.profiles.active=<env>
来设置弹簧配置文件
对于source(src) 目录中的java 文件,可以通过System.getProperty("spring.profiles.active")
对于test 目录中的java 文件,您可以提供
SPRING_PROFILES_ACTIVE
到<env>
或
因为“test”任务会忽略“environment”、“jvmArgs”和“systemProperties”。 在 root build.gradle
添加一个任务来设置 jvm 属性和环境变量。
test {
def profile = System.properties["spring.profiles.active"]
systemProperty "spring.profiles.active",profile
environment "SPRING.PROFILES_ACTIVE", profile
println "Running ${project} tests with profile: ${profile}"
}
我的解决方案是将环境变量设置为spring.profiles.active=development
。 这样在该机器上运行的所有应用程序都将引用该变量并启动应用程序。 spring加载属性的顺序如下
application.properties
system properties
environment variable
如果我运行命令行: java -Dspring.profiles.active=development -jar yourApplication.jar
从我的 webapplication 目录它指出路径不正确。 所以我只是在 application.properties 文件中手动定义了配置文件,如下所示:
spring.profiles.active=mysql
或
spring.profiles.active=postgres
或
spring.profiles.active=mongodb
参加聚会为时已晚,但这里是该主题的新趋势: https : //howtodoinjava.com/spring-boot2/logging/profile-specific-logging/
这是一个很好的例子:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property name="LOG_FILE" value="c:/temp/spring.log}"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d</fileNamePattern>
</rollingPolicy>
</appender>
<springProfile name="local | dev">
<logger name="org.springframework" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</springProfile>
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</springProfile>
<springProfile name="!local & !dev & !prod">
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</springProfile>
</configuration>
!注意! 如果您在使用&
遇到问题&
请将其替换为&
以前的大多数答案要么已经过时,要么无缘无故地过于复杂。
此时,您可以在 application.properties 中轻松设置活动配置文件,如下所示:
YOUR_PROFILE<\/code>在哪里...您的个人资料
我多次使用它,其中大部分是我将数据源与其存储库、实体、控制器等隔离开来...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.