当前位置: 首页 > 知识库问答 >
问题:

如何根据选定的配置文件在属性文件之间切换

葛雪松
2023-03-14

我们的简介如下:

<profiles>
     <!-- Local/Windows development  -->
    <profile>
        <id>local</id>
        <activation/>
        <properties>
            <INSTALL_MACHINE_LIST>localhost</INSTALL_MACHINE_LIST>
            <COPY_MODE>local</COPY_MODE>
        </properties>
    </profile>
    <!-- Development -->
    <profile>
        <id>dev</id>
        <activation/>
        <properties>
            <INSTALL_MACHINE_LIST>dev01</INSTALL_MACHINE_LIST>
        </properties>
    </profile>
    <!-- QA -->
    <profile>
        <id>qa</id>
        <activation/>
        <properties>
            <INSTALL_MACHINE_LIST>dqa01</INSTALL_MACHINE_LIST>
        </properties>
    </profile>
    <!-- Production -->
    <profile>
        <id>prod</id>
        <activation/>
        <properties>
            <INSTALL_MACHINE_LIST>prod01</INSTALL_MACHINE_LIST>
        </properties>
    </profile>
</profiles>

对于我们的测试环境,我们有两个属性文件(在src/main/test/resources下)应用程序本地。性质和应用。属性文件。计划是使用本地应用程序。“本地”配置文件模式下的属性(在我们的开发windows系统上)和应用程序。其他配置文件模式的属性。在spring上下文(spring context.xml)中,目前,我们正在根据使用的配置文件在两个属性文件之间手动切换。正在寻找自动选择本地应用程序的方法。“本地”配置文件和应用程序的属性。任何其他类型的配置文件的属性。有没有办法在基于xml的spring上下文文件中使用if-then-else条件?我试过:

<bean id="flag" class="java.lang.Boolean">
    <constructor-arg value="#{ profile == 'local' ? true: false }" />
</bean>
<util:properties id="machineMetaDbProps" location="#{ flag ? 'application-local.properties' : 'application.properties' }"/>

获取错误:

Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Property or field 'profile' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' - maybe not public?'

共有2个答案

高朝明
2023-03-14

在基于XML的配置中,您可以通过以下方式使Spring可以访问与概要文件相关的属性文件:

<beans profile="local">
    <context:property-placeholder 
             location="classpath:docker-db.properties" ignore-unresolvable="true"/>
</beans>
<beans profile="test">    
      <context:property-placeholder
             location="classpath:test-db.properties" ignore-unresolvable="true"/>
</beans>

关于活动概要文件,您还可以手动将属性文件提供给spring vi java配置,如下所示:

@Configuration
@Profile("local")
public class LocalPropertyReader {

    @Bean
    public static PropertyPlaceholderConfigurer properties() {
        PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        Resource[] resources = new ClassPathResource[] {
            new ClassPathResource("docker-db.properties"), new ClassPathResource("application-local.properties")
        };
        ppc.setLocations(resources);
        ppc.setIgnoreUnresolvablePlaceholders(true);
        return ppc;
    }
}



@Configuration
@Profile("test")
public class ProdPropertyReader {


    @Bean
    public static PropertyPlaceholderConfigurer properties() {
        PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        Resource[] resources = new ClassPathResource[] {
            new ClassPathResource("test-db.properties"), new ClassPathResource("application-test.properties")
        };
        ppc.setLocations(resources);
        ppc.setIgnoreUnresolvablePlaceholders(true);
        return ppc;
    }
}

这可以通过以下方式实现:

>

  • 使用Spring上下文环境:ctx。getEnvironment()。setActiveProfiles(“本地”)
  • 使用系统属性:system。setProperty(“spring.profiles.active”、“local”)
  • 在运行时传递系统参数:-Dspring。个人资料。active=“local”
  • 在web中启用配置文件。xml

    <context-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>local</param-value>
    </context-param>
    

    更多信息:

    使用Spring示例加载环境配置和属性

  • 孟杰
    2023-03-14

    尝试按以下方式命名属性文件:

    application.properties
    application-prod.properties
    application-test.properties
    

    并在启动应用程序时使用“-Dspring.profiles.active=test”

    https://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html#howto-根据环境更改配置

     类似资料:
    • 我们正在开发Spring Boot2.1.6,我们需要在应用程序中实现Spring Boot profile 我们的项目中目前有两个属性文件application.properties和bucket.properties(s3配置)文件。 上面的配置工作正常,spring boot能够正确地拾取文件。 但是我想在资源文件夹中创建以下类型的文件夹结构来正确地隔离文件。 一旦这样做,我就在上面的Pro

    • 我的项目的src/main/resources文件夹中有名为:TransactionExpiry.properties的属性文件。 我可以使用@PropertySource(“classpath:/transactionexpiry.properties”)读取代码中的属性 现在,我不想添加应用程序范围,并添加特定于环境的配置文件,如transactionexpiry-dev.properties

    • 问题内容: 有点卡在这里。我有一个带有3个配置文件的pom。Theese配置文件具有不同的版本名称。我要在构建特定配置文件时将该版本名称注入属性文件。 我的个人资料: 和filter.properties看起来像这样: 怎么做?我通过命令构建项目: 问题答案: 您需要做的是在POM文件的部分中添加一个新部分。 像这样: 这将在指定文件的指定文件夹()内部查找,并在遇到定义的变量时更改文件。 因此,

    • 我正在使用Java的发送SMS。我已经加载了log4j jar文件,并将文件放置在正确的位置,但它仍然无法读取它,并得到以下异常: 例外文本:

    • 问题内容: 开始进行log4j配置的最简单方法是什么? 问题答案: 将名为的文件放在类路径的根目录中: 不需要什么了。Log4j将发现它并进行自我配置。

    • 我想将部署在karaf中的所有包的配置文件放在karaf 文件夹中。我希望当捆绑包配置文件改变时,karaf能够注意到。 我有一个包含几个特性的发行版,一个XML特性的例子。我已经尝试了几件事,例如,我将配置文件添加到如下功能中,但这不起作用。 我尝试过的一些事情: http://karaf.922171.n3.nabble.com/OSGi-bundle-configuration-file-t