66

我有一个使用 maven 作为构建工具的应用程序。

我正在使用 Maven 配置文件来设置来自不同配置文件的不同属性。

我想做的是,maven 中的所有活动配置文件也将被移植到 spring 活动配置文件中,因此我可以在 bean 签名(@profile)中引用它们。但我不知道该怎么做。

例如:考虑以下 Maven 设置

<profiles>
    <profile>
        <id>profile1</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
        </properties>
    </profile>
    <profile>
        <id>profile2</id>
        <properties>
        </properties>
    </profile>
    <profile>
        <id>development</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
        </properties>
    </profile>
    <profile>
        <id>production</id>
        <properties>    
        </properties>
    </profile>
</profiles>

假设我运行 maven 时没有指定我希望 spring 拥有的任何其他配置文件profile1development作为活动配置文件。

4

8 回答 8

41

有一种更优雅的方式可以同时在 2 个 maven+spring 配置文件之间切换。

首先,将配置文件添加到 POM(注意 - maven+spring 配置文件由单个系统变量激活):

<profiles>
    <profile>
        <id>postgres</id>
        <activation>
            <activeByDefault>true</activeByDefault>
            <property>
                <name>spring.profiles.active</name>
                <value>postgres</value>
            </property>
        </activation>
        <dependencies>
            <dependency>
                <groupId>postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <version>9.1-901.jdbc4</version>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>h2</id>
        <activation>
            <property>
                <name>spring.profiles.active</name>
                <value>h2</value>
            </property>
        </activation>           
        <dependencies>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <version>1.4.191</version>
            </dependency>
        </dependencies>
    </profile>
</profiles>

其次,为 spring 设置默认配置文件(对于 maven,它已经在 POM 中设置)。对于 Web 应用程序,我将以下几行插入到web.xml

<context-param>
   <param-name>spring.profiles.default</param-name>
   <param-value>postgres</param-value>
</context-param>

第三,将配置文件依赖的 bean 添加到您的配置中。就我而言(XML 配置),它是:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="mainDataSource" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
    <property name="jpaProperties" ref="hibProps"/>
    <property name="packagesToScan">
        <list>
            <value>my.test.model</value>
        </list>
    </property>
</bean>
...
<beans profile="postgres">
    <bean name="mainDataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://127.0.0.1:5432/webchat" />
        <property name="username" value="postgres" />
        <property name="password" value="postgres" />
    </bean>
</beans>

<beans profile="h2">
    <bean name="mainDataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.h2.Driver" />
        <property name="url" value="jdbc:h2:file:./newsdb;INIT=RUNSCRIPT FROM 'classpath:init.sql';TRACE_LEVEL_FILE=0" />
        <property name="username" value="sa" />
        <property name="password" value="" />
    </bean>
</beans>

现在可以:

  • mvn jetty:run使用ormvn jetty:run -Dspring.profiles.active=postgres命令在 Postgres DB 上运行我的网络应用程序
  • 在 H2 DB 上运行我的网络应用程序mvn clean jetty:run -Dspring.profiles.active=h2
于 2016-03-24T12:20:03.453 回答
29

您需要的第一件事是用于保存配置的两个属性文件。文件的名称应与模式 application-{custom_suffix}.properties 匹配。在 Maven 项目的 src/main/resources 目录中创建它们,在主 application.properties 文件旁边,稍后您将使用它来激活其他文件并保存两个配置文件共享的值。

然后是时候修改你的 pom.xml 了。您需要在每个 Maven 配置文件中定义一个自定义属性,并将它们的值设置为与您希望使用特定配置文件加载的相应属性文件的后缀相匹配。以下示例还标记了默认运行的第一个配置文件,但这不是强制性的。

<profile>
    <id>dev</id>
    <properties>
        <activatedProperties>dev</activatedProperties>
    </properties>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
</profile>
<profile>
    <id>release</id>
    <properties>
        <activatedProperties>release</activatedProperties>
    </properties>
</profile>

接下来,在同一文件的构建部分中,为资源插件配置过滤。这将允许您将上一步中定义的属性插入到资源目录中的任何文件中,这是后续步骤。

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    …
</build>

最后,将以下行添加到 application.properties。

spring.profiles.active=@activatedProperties@

运行构建时,资源插件将用活动 Maven 配置文件中定义的属性值替换占位符。启动应用程序后,Spring 框架将根据活动 Spring 配置文件的名称加载适当的配置文件,该配置文件由 spring.profiles.active 属性的值描述。请注意,Spring Boot 1.3 替换了过滤值的默认资源插件语法,并使用@activatedProperties@而不是${activatedProperties}符号。

它工作完美。希望这可以帮到你。

于 2017-08-22T12:15:10.880 回答
23

您必须过滤应用程序的资源,例如属性文件,其中包含要在 spring 中激活的配置文件的信息。

例如

spring.profile = ${mySpringProfile}

对于每个配置文件,为此变量定义一个值 ( mySpringProfile)。

在构建期间,这将根据当前活动配置文件中定义的值进行过滤。

然后在您的应用程序的引导过程中,您将根据此文件选择适当的配置文件(不能帮助您更多,因为您没有向我们提供更多信息,但这很容易。

注意:我找不到在 maven 中获取当前活动配置文件的方法(类似于 project.profiles.active 保存您的 -P 值),这就是为什么您必须为每个配置文件设置一个新变量的原因。

注意 2:如果您正在运行 Web 应用程序,而不是使用此中间文件,请在您的 web.xml 中过滤此值

<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>${mySpringProfile}</param-value>
</context-param>

注意 3:这实际上是一种不好的做法,您应该在运行时使用系统属性设置配置文件

于 2014-08-21T09:41:41.017 回答
6

对于 Spring Boot 应用程序,可以在 Maven 配置文件中添加一个属性,pom.xml然后在application.properties.

将 Maven 配置文件添加到pom.xml,例如,一个名为的属性spring.profile.from.maven

<profiles>
    <profile>
        <id>postgres</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <spring.profile.from.maven>postgres</spring.profile.from.maven>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <scope>runtime</scope>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>noDb</id>
        <properties>
            <spring.profile.from.maven>noDb</spring.profile.from.maven>
        </properties>
    </profile>
</profiles>

引用 Maven 属性application.properties

spring.profiles.include=@spring.profile.from.maven@

使用此设置,使用postgresMaven 配置文件或不使用配置文件运行 maven 会将postgresSpring 配置文件添加到 Spring 的活动配置文件列表中,而使用 Maven 配置文件运行 mavennoDb会将noDbSpring 配置文件添加到 Spring 的活动配置文件列表中。

于 2019-08-11T08:29:06.150 回答
2

${activeProfile}在 web.xml 中添加占位符:

<context-param>
  <param-name>spring.profiles.active</param-name>
  <param-value>${activeProfile}</param-value>
</context-param>

在 pom.xml 中为每个配置文件设置属性:

<profiles>
  <profile>
    <id>profile1</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
      <activeProfile>profile1</activeProfile>
    </properties>
  </profile>
  <profile>
    <id>profile2</id>
    <properties>
      <activeProfile>profile2</activeProfile>
    </properties>
  </profile>
</profiles>

添加maven-war-plugin并设置<filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>以在运行时替换占位符mvn package -Pprofile1or mvn package -Pprofile2

<build>
  <plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.2.2</version>
    <configuration>
      <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
    </configuration>
  </plugin>
</build>
于 2019-03-05T09:20:44.607 回答
1

我目前正在构建一个小型 webapp(由于我无法控制的原因)必须能够在仅支持 Servlet 2.5 和 Java 6 的旧服务器/容器上运行。还需要 webapp 配置完全自包含,因此甚至无法使用系统变量和/或 JVM 参数。管理员只需要每个环境的 .war 文件,该文件可以放入容器中进行部署。

我在我的 web 应用程序中使用 Spring 4.x。这就是我配置我的应用程序的方式,以便使用活动的 Maven 配置文件来设置活动的 Spring 4.x 配置文件。


pom.xml 文件更改

我将以下位添加到我的 POM 文件中。我的 POM 使用的是模型版本 4.0.0,而我在构建时正在运行 Maven 3.1.x。

<modelVersion>4.0.0</modelVersion>

...

<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <!-- Default to dev so we avoid any accidents with prod! :) -->
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <!-- This can be a single value, or a comma-separated list -->
            <spring.profiles.to.activate>dev</spring.profiles.to.activate>
        </properties>
    </profile>
    <profile>
        <id>uat</id>
        <properties>
            <!-- This can be a single value, or a comma-separated list -->
            <spring.profiles.to.activate>uat</spring.profiles.to.activate>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <!-- This can be a single value, or a comma-separated list -->
            <spring.profiles.to.activate>prod</spring.profiles.to.activate>
        </properties>
    </profile>
</profiles>

...

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <webResources>
                    <webResource>
                        <filtering>true</filtering>
                        <directory>src/main/webapp</directory>
                        <includes>
                            <include>**/web.xml</include>
                        </includes>
                    </webResource>
                </webResources>
                <failOnMissingWebXml>true</failOnMissingWebXml>
            </configuration>
        </plugin>
        ...
    </plugins>
</build>

web.xml 文件更改

<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Setup for root Spring context
-->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-core-config.xml</param-value>
</context-param>
<!--
Jim Tough - 2016-11-30
Per Spring Framework guide: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-environment

...profiles may also be activated declaratively through the spring.profiles.active 
property which may be specified through system environment variables, JVM system 
properties, servlet context parameters in web.xml, or even as an entry in JNDI.
-->
<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>${spring.profiles.to.activate}</param-value>
</context-param>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

现在我可以创建基于 Java 的配置类,如下面的配置类,只有在特定的 Spring 配置文件处于活动状态时才会使用。

@Configuration
@Profile({"dev","default"})
@ComponentScan
@EnableTransactionManagement
@EnableSpringDataWebSupport
public class PersistenceContext {
    // ...
}
于 2016-11-30T17:32:01.077 回答
1

spring boot 插件本身可以提供帮助:

  <profiles>
    <profile>
      <id>postgres</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
              <jmxPort>9001</jmxPort>
              <environmentVariables>
                <SPRING_PROFILES_ACTIVE>postgres</SPRING_PROFILES_ACTIVE>
              </environmentVariables>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>h2</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
              <jmxPort>9002</jmxPort>
              <environmentVariables>
                <SPRING_PROFILES_ACTIVE>h2</SPRING_PROFILES_ACTIVE>
              </environmentVariables>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
于 2021-10-12T19:51:49.057 回答
0

在spring boot应用程序中,有几种设置profile的方式(dev、uat、prod等)

例如:您可以将其添加到您的属性文件中:

spring.profiles.active=dev

以编程方式:

SpringApplication.setAdditionalProfiles("dev");

要指定哪些配置文件处于活动状态,请使用此行

@ActiveProfiles("dev")

在 Unix 环境中

export spring_profiles_active=dev

使用 dev 配置文件运行 jar 文件。

java -jar -Dspring.profiles.active=dev JARNAME.jar

这里JARNAME.jar的意思是你的应用程序的 jar

于 2021-11-04T09:58:46.397 回答