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

时间:2016-07-22 07:29:55

标签: java spring spring-profiles

我有一个使用另一个项目的Spring项目。每个项目都有自己的弹簧配置文件,使用*.propertiesargs[]为每个配置文件初始化java代码。我从applicationContext.xml注入个人资料。 问题是第二个项目使用来自 args[]的env的默认配置 我无法将applicationContext.xml的env注入到第二个项目中,我试着寻找一篇能解释Spring配置文件如何工作的文章。

  1. applicationContext.xml未配置默认值时,是否存在查看配置文件的层次结构?
  2. System var是否强于$xml = new SimpleXMLElement($string); $result = $xml->xpath('.//PR_DRE/row/*'); 配置?
  3. 您认为什么是我挑战的最佳解决方案?
  4. 关于该主题或甚至示例的文章将非常感谢!! 提前致谢。

8 个答案:

答案 0 :(得分:63)

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

答案 1 :(得分:37)

如果您为JVM提供Spring配置文件,那么应该没有问题:

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

另见Spring-Documentation:

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

  

69.5设置活动的弹簧配置文件

     

Spring Environment有一个API,但通常你会设置   System属性(spring.profiles.active)或OS环境   变量(SPRING_PROFILES_ACTIVE)。例如。用a启动你的应用程序   -D参数(记得把它放在主类或jar存档之前):

     

$ java -jar -Dspring.profiles.active = production   演示0.0.1-SNAPSHOT.jar

     

在Spring Boot中,您还可以设置活动配置文件   application.properties,例如

     

spring.profiles.active =生产

     

以这种方式设置的值将替换为System属性或环境   变量设置,但不是SpringApplicationBuilder.profiles()   方法。因此,后一个Java API可用于扩充配置文件   不改变默认值。

     

请参阅第25章,“Spring Boot功能”部分中的配置文件   更多信息。

答案 2 :(得分:19)

我通常使用基于注释的配置而不是基于基于XML的配置来配置applicationContext。无论如何,我相信他们两个都具有相同的优先级

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


从applicationContext获取基于概要文件的Bean

  • 在Bean上使用@Profile

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

    现在,个人资料为dev

    注意:如果配置文件指定为     @Profile("!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 Run Configuration - screenshot is unavailable

  • 环境变量

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

  

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


优先顺序为:

  1. web.xml中的上下文参数
  2. WebApplicationInitializer
  3. JVM系统参数
  4. 环境变量

答案 3 :(得分:2)

如果您使用docker来部署spring boot应用程序,则可以使用 e 标志设置配置文件

  

docker run -e&#34; SPRING_PROFILES_ACTIVE = prod&#34; -p 8080:8080 -t   r.test.co/myapp:latest

答案 4 :(得分:1)

我的解决方案是将环境变量设置为spring.profiles.active=development。这样,在该机器上运行的所有应用程序都将引用变量并启动应用程序。 spring加载属性的顺序如下

application.properties
system properties
environment variable

答案 5 :(得分:1)

如果我从我的webapplication目录运行命令行:java -Dspring.profiles.active=development -jar yourApplication.jar,则说明该路径不正确。所以我只是在application.properties文件中手动定义了配置文件,如下所示:

spring.profiles.active=mysql 

spring.profiles.active=postgres

spring.profiles.active=mongodb

答案 6 :(得分:0)

您可以通过提供-Dspring.profiles.active=<env>

来设置弹簧轮廓

对于 source(src)目录中的Java文件,您可以使用 System.getProperty("spring.profiles.active")

对于测试目录中的Java文件,您可以提供

  • SPRING_PROFILES_ACTIVE<env>

因为,“测试”任务将忽略“环境”,“ jvmArgs”和“ systemProperties”。在根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}"
}

答案 7 :(得分:0)

参加聚会为时已晚,但以下是该主题的新趋势: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;