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


80

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

  1. 如果没有在以下位置配置默认配置,是否有一个层次结构可以在其中查看配置文件applicationContext.xml
  2. 系统var是否比applicationContext.xml配置强?
  3. 您认为对我的挑战最好的解决方案是什么?

对此主题甚至示例的文章将不胜感激!!提前致谢。

Answers:



62

如果您提供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,但是通常您会设置一个System属性(spring.profiles.active)或一个OS环境变量(SPRING_PROFILES_ACTIVE)。例如,使用-D参数启动您的应用程序(切记将其放在主类或jar存档之前):

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

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

spring.profiles.active =生产

这样设置的值将由System属性或环境变量设置代替,而不由SpringApplicationBuilder.profiles()方法代替。因此,后者的Java API可用于在不更改默认值的情况下扩充配置文件。

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


40

我通常使用基于注释的配置而不是基于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. Web应用程序初始化器
  3. JVM系统参数
  4. 环境变量

完美的答案!
盖拉夫

6

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

泊坞窗运行-e“ SPRING_PROFILES_ACTIVE = prod” -p 8080:8080 -t r.test.co/myapp:latest


春天如何在内部使用此标志。
帕尔马卡姆利什

1

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

application.properties
system properties
environment variable

1

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

spring.profiles.active=mysql 

要么

spring.profiles.active=postgres

要么

spring.profiles.active=mongodb

1

您可以通过提供来设置弹簧轮廓 -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}"
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.