繁体   English   中英

如何从系统变量设置 Spring 配置文件?

[英]How to set Spring profile from system variable?

我有一个使用另一个项目的 Spring 项目。 每个项目都有自己的 spring 配置文件,使用每个配置文件的applicationContext.xml*.properties从 java 代码初始化。 我从args[]注入配置文件。 问题是第二个项目使用applicationContext.xml中 env 的默认配置 我无法将args[]中的 env 注入第二个项目,我尝试寻找一篇文章来解释 Spring 配置文件的工作原理。

  1. 当没有在applicationContext.xml中配置默认值时,是否有一个层次结构可以查看配置文件?
  2. System var 是否比applicationContext.xml配置更强?
  3. 您认为应对我的挑战的最佳解决方案是什么?

关于该主题的文章甚至示例将不胜感激。

SPRING_PROFILES_ACTIVE 是覆盖/选择 Spring 配置文件的环境变量

如果您提供 JVM 的 Spring 配置文件,则应该没有问题:

java -Dspring.profiles.active=development -jar yourApplication.jar 

另请参阅 Spring 文档:

http://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html

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。 无论如何,我相信他们都有相同的优先级

*回答你的问题,系统变量有更高的优先级*


从 applicationContext 获取基于配置文件的 bean

  • 在 Bean 上使用 @Profile

@Component
@Profile("dev")
public class DatasourceConfigForDev

现在,配置文件是dev

注意:如果配置文件以@Profile("!dev")则配置文件将排除 dev 并用于所有其他配置。

  • 在 XML 中使用配置文件属性

<beans profile="dev">
    <bean id="DatasourceConfigForDev" class="org.skoolguy.profiles.DatasourceConfigForDev"/>
</beans>

设置配置文件的值:

  • 通过 WebApplicationInitializer 接口以编程方式

    在 Web 应用程序中,可以使用 WebApplicationInitializer 以编程方式配置 ServletContext
@Configuration
public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
            servletContext.setInitParameter("spring.profiles.active", "dev");
    }
}
  • 通过 ConfigurableEnvironment 以编程方式

    您还可以直接在环境上设置配置文件:
    @Autowired
    private ConfigurableEnvironment env;

    // ...

    env.setActiveProfiles("dev");
  • web.xml 中的上下文参数

    配置文件也可以在 web 应用程序的 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>
  • JVM系统参数

    作为参数传递的配置文件名称将在应用程序启动期间激活:

     -Dspring.profiles.active=dev

    在 IDE 中,您可以设置应用程序运行时要使用的环境变量和值。 以下是Eclipse中的运行配置:

Eclipse 运行配置 - 屏幕截图不可用

  • 环境变量

    通过命令行设置: export spring_profiles_active=dev

任何未指定配置文件的 bean 都属于“默认”配置文件。


优先顺序是:

  1. web.xml 中的上下文参数
  2. 网络应用初始化器
  3. JVM 系统参数
  4. 环境变量

如果您使用 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>

!注意! 如果您在使用&遇到问题&请将其替换为&amp;

以前的大多数答案要么已经过时,要么无缘无故地过于复杂。

此时,您可以在 application.properties 中轻松设置活动配置文件,如下所示:

YOUR_PROFILE<\/code>在哪里...您的个人资料

我多次使用它,其中大部分是我将数据源与其存储库、实体、控制器等隔离开来...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM