5

我想使用 Maven 来处理不同本地和测试区域的工件生成。我相信我可以使用不同的配置文件,但我不确定。

在 Maven 中,我可以选择不同的目录来选择打包时使用的文件(例如 application.properties)吗?我该如何设置?

我想要的一个想法是在我的项目中拥有以下资源文件夹

  • 当地的
  • 构建服务器
  • 开发者
  • 系统
  • 产品

每个文件夹都应该包含不同版本的 application.resources,它是 Spring 中的一个文件,可用于处理用于变量的硬编码字符串。对于本地构建——我们的开发人员也在不同的操作系统上工作。如果我需要,我还想让它在不同的操作系统上无缝。

主要成果是:

  • 从 IDE (IntelliJ) 内部控制Maven 生命周期阶段
  • 不复杂的阶段和团队流程
  • 为每个开发人员保持一致
  • 在运行阶段(例如安装)时,使每个开发人员/区域的不同配置看起来不可见

理想情况下,我会根据最佳实践(Duvall、Matyas、Glover)设置我的项目。

4

3 回答 3

4

我们目前提供不同的属性,但不是通过不同的文件夹。我们通过混合

  • 春天的PropertyPlaceholderConfigurer
  • Maven 配置文件(我们用来构建开发环境的东西),
  • 构建服务器(在我们的例子中是 TeamCity)
  • Maven 阶段以生成正确的工件
  • 启动和构建参数

我对我们所做的事情的理解是有限的,但希望这可以作为一个有用的例子,供其他人甚至我自己考虑。

正如您将在下面看到的,我们提供了指向不同属性文件的参数。每个属性文件都有一个区域/环境的配置。我将尽我所能解释当前的用途,以防它为其他人提供一些用途。

profile为了使用 Maven 配置文件,我们在 pom中创建了一个标识,development其中包括一个名为的区域配置属性env。我还不完全知道它是如何在我们的项目中使用的,但是你会在下面看到我们的 POM 包括一个 Maven 编译器插件和一个 Maven Tomcat 插件。

每天,作为开发人员,我们从 IntelliJ 内部在 Tomcat 上本地运行我们的应用程序并提供env属性。在启动时,该env属性作为设置为的参数提供classpath*:dev-common.properties。该文件是一个属性配置文件 - 为我们的不同区域设置占位符值。

的值env可供我们使用PropertyPlaceholderConfigurer


示例 1profile - pom.xml 中的 Maven 实现:

aprofile在我们的 pom 中的实现是:

<profile>
        <id>development</id>
        <activation>
            <property>
                <name>env</name>
                <value>development</value>
            </property>
        </activation>
        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>2.3.2</version>
                        <configuration>
                            <source>1.6</source>
                            <target>1.6</target>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.tomcat.maven</groupId>
                        <artifactId>tomcat7-maven-plugin</artifactId>
                        <version>2.0-SNAPSHOT</version>
            ...
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </profile>

示例 2 - 用于正常构建的属性占位符配置器:

我们还使用了一个 Spring 组件,一个PropertyPlaceholderConfigurer. 我们将它与构建参数一起使用来设置指向资源文件的类路径指针。

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>
                ${env}
            </value>
        </list>
    </property>


示例 3 - 用于测试的属性占位符配置器:

我们有专门为集成测试设置的 Spring Contexts,它也使用PropertyPlaceholderConfigurer. 这些是由集成测试类使用@ContextConfiguration(locations = {"classpath:test-dataexchange-application-context.xml"})@RunWith(SpringJUnit4ClassRunner.class)) 组合而成的。

测试上下文中,我们配置PropertyPlaceholderConfigurer如下来获取集成测试区域的属性:

<bean id="testpropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath*:dev-local-common.properties</value>
        </list>
    </property>


其他注意事项:

我们使用 Team City 进行构建管理,但我还没有看到这些设置是如何在那里使用的,如果有的话。我可以想象有能力将上述方法结合在一起以帮助持续集成和交付。

我看不到在哪里使用了标识为的配置文件development。这是我必须与我的团队成员一起跟进的事情。


资源:

于 2013-06-11T14:24:00.607 回答
3

如果您使用的是 Spring Boot,有一种简单的方法可以做到这一点。

在 maven 中创建两个配置文件,并在每个配置文件中使用您要执行的 Spring 配置文件的名称设置一个属性。

    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <!-- Default spring profile to use -->
            <spring.profiles.active>dev</spring.profiles.active>
            <!-- Default environment -->
            <environment>develop</environment>
        </properties>
    </profile>

在你的 application.properties 中,添加这个属性: spring.profiles.active=${spring.profiles.active}

使用此模式 application-profile.properties 为每个配置文件创建一个 application.property。例如:application-dev.properties application-prod.properties

请务必在资源插件中进行主动过滤:

  ...
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
  </resource>
 ...

另一种方法是在执行maven 的过程中创建一个名为activeprofile.properties 的文件。Spring boot 会查找此文件以加载活动配置文件。您可以按如下方式创建此文件:

   <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <phase>prepare-package</phase>
                    <configuration>
                        <target>
                            <echo message="spring.profiles.active=${spring.profiles.active}" file="target/classes/config/activeprofile.properties" />
                        </target>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
            </configuration>
        </plugin>
于 2015-03-13T00:08:21.423 回答
1

旨在在中央服务器(CI / Build server)上一次为每个环境生成一个工件,旨在生成一个工件并在本地一键启动/测试应用程序,提供一致的易于学习的方式来检查和运行您的构建,并签入和配置您的 CI。

您可以在 Maven 中使用配置文件并利用 Maven 目标来使用构建服务器(在我们的例子中是 TeamCity)来实现正确的构建。

在 Spring 上下文中使用属性占位符配置application.resources器,每个区域都有一个文件和一个文件名掩码,例如application-resources-${region}.

于 2013-07-16T09:03:30.807 回答