为不同环境建造

为不同的环境构建相同的工件一直很烦人。您有多个环境,例如测试和生产服务器,或者可能是一组运行具有不同配置的相同应用程序的服务器。在本指南中,我将解释如何使用配置文件来构建和打包为特定环境配置的工件。有关配置文件概念的更深入解释,请参阅构建配置文件简介。

笔记:

  • 本指南假定您具有基本的 Maven 知识。
  • 它将展示一种配置 Maven 以仅解决简单配置设置的方法。通过简单的配置设置,我的意思是您只有一个文件或一小组文件,这些文件因每个环境而异。还有其他更好的方法来处理二维和多维配置问题。

    此示例假定使用标准目录布局

    pom.xml
    src/
      main/
        java/
        resources/
      test/
        java/

下面src/main/resources有三个文件:

  • environment.properties- 这是默认配置,默认会打包在工件中。
  • environment.test.properties- 这是测试环境的变体。
  • environment.prod.properties- 这与测试变体基本相同,将在生产环境中使用。

    在项目描述符中,您需要配置不同的配置文件。此处仅显示测试配置文件。

     <profiles>
       <profile>
         <id>test</id>
         <build>
           <plugins>
             <plugin>
               <artifactId>maven-antrun-plugin</artifactId>
               <executions>
                 <execution>
                   <phase>test</phase>
                   <goals>
                     <goal>run</goal>
                   </goals>
                   <configuration>
                     <tasks>
                       <delete file="${project.build.outputDirectory}/environment.properties"/>
                       <copy file="src/main/resources/environment.test.properties"
                             tofile="${project.build.outputDirectory}/environment.properties"/>
                     </tasks>
                   </configuration>
                 </execution>
               </executions>
             </plugin>
             <plugin>
               <artifactId>maven-surefire-plugin</artifactId>
               <configuration>
                 <skip>true</skip>
               </configuration>
             </plugin>
             <plugin>
               <artifactId>maven-jar-plugin</artifactId>
               <executions>
                 <execution>
                   <phase>package</phase>
                   <goals>
                     <goal>jar</goal>
                   </goals>
                   <configuration>
                     <classifier>test</classifier>
                   </configuration>
                 </execution>
               </executions>
             </plugin>
           </plugins>
         </build>
       </profile>
    
       .. Other profiles go here ..
    
     </profiles>

    此代码段中配置了三件事:

    1. 它将 antrun 插件配置为在测试阶段执行 run 目标,它将environment.test.properties文件复制到environment.properties.
    2. 它将配置测试插件以在构建测试和生产工件时跳过所有测试。这很有用,因为您可能不想针对生产系统运行测试
    3. 它将 JAR 插件配置为使用“测试”分类器创建“附加”JAR。

      要激活此配置文件执行mvn -Ptest install,Maven 将执行配置文件中的步骤以及正常步骤。从这个构建中,您将获得两个工件,“foo-1.0.jar”和“foo-1.0-test.jar”。这两个罐子将相同。

注意事项

  • 目前 Maven 不允许项目构建只生成附加的工件。(即它还必须产生一个“主要”工件)这会导致打包和安装两个相等的 JAR。JAR 插件可能还应该得到对这个用例的改进支持,因为两个不同的输出目录将用作构建 JAR 的基础。
  • 删除任务的使用可能看起来有点奇怪,但需要确保复制任务实际上会复制文件。复制任务将查看源文件和目标文件的时间戳,只有在复制文件时它才会知道实际的源文件可能与上次执行时不同。
  • 构建后,测试配置将位于目标/类中,并且不会被覆盖,因为资源插件使用相同的时间戳检查,因此您应该在使用配置文件执行 Maven 后始终进行清理。
  • 由于上述原因,您必须一次只在一次执行中为单个环境构建工件,并且在更改配置文件开关时执行“mvn clean”。如果没有,您可能会得到带有一组混合配置文件的工件。

资源

  1. 构建配置文件简介
  2. 标准目录布局