Java 使用maven为多个环境生成战争?

Java 使用maven为多个环境生成战争?,java,maven,Java,Maven,如何使用maven为多个环境生成战争 我有大约8个环境。dev,dev_local,ci,ci_local,qa,qa_local,prod,prod_local 我不想为*本地环境生成war文件 我有所有环境通用的配置文件。我希望避免为各种环境维护这些文件的重复副本 公共文件可能只有很少的属性,需要针对各种环境进行自定义 战争中的清单文件应具有特定于环境的信息 资源文件应该放在WEB-INF/classes目录中 环境maven插件提供上述所有功能 环境maven插件是多环境maven插件的

如何使用maven为多个环境生成战争

  • 我有大约8个环境。dev,dev_local,ci,ci_local,qa,qa_local,prod,prod_local
  • 我不想为*本地环境生成war文件
  • 我有所有环境通用的配置文件。我希望避免为各种环境维护这些文件的重复副本
  • 公共文件可能只有很少的属性,需要针对各种环境进行自定义
  • 战争中的清单文件应具有特定于环境的信息
  • 资源文件应该放在WEB-INF/classes目录中
环境maven插件提供上述所有功能


环境maven插件多环境maven插件的一个分支。multienv maven插件的核心理念是,src/main/environments目录中的每个目录都是一个环境,每个目录都会生成war。这种哲学太狭隘了。它以牺牲功能为代价提供了简单性。Environments maven插件继续使用src/main/Environments中的目录作为各种环境的名称。但它进一步扩展了插件。下面列出了其中的一些细节

环境排除。 大多数项目都有资源文件,用于各种环境和在开发人员的机器上运行代码,但指向各种环境。例如:dev、dev_local、ci、ci_local、qa、qa_local等-这些qa资源文件用于在qa环境中运行应用程序。qa_本地资源文件用于在指向qa环境的开发人员机器上运行应用程序。运行发布版本时,不应生成dev_local、ci_local和qa_local的war文件。否则,它会减慢构建速度并使构建页面杂乱无章,可能会给执行实际部署的一方造成混乱

environments maven插件允许排除不需要生成war文件的环境。这可以使用插件配置中的excludeEnvironments标记来完成

示例配置

<plugin>
   <groupId>net.sf.environments-maven-plugin</groupId>
   <artifactId>environments-maven-plugin</artifactId>
   <version>1.1.0-SNAPSHOT</version>
   <configuration>
      <excludeEnvironments>dev01, qa01 ,qa02,</excludeEnvironments>
      <parallel>true</parallel>
   </configuration>
   <executions>
      <execution>
         <goals>
            <goal>configuration</goal>
         </goals>
      </execution>
   </executions>
</plugin>
<plugin>
   <groupId>net.sf.environments-maven-plugin</groupId>
   <artifactId>environments-maven-plugin</artifactId>
   <version>1.3.0-SNAPSHOT</version>
   <configuration>
      <commonDir>common</commonDir>
      <filters>
         <filter>ec.properties</filter>
      </filters>
   </configuration>
   <executions>
      <execution>
         <goals>
            <goal>environment</goal>
         </goals>
      </execution>
   </executions>
</plugin>
<plugin>
   <groupId>net.sf.environments-maven-plugin</groupId>
   <artifactId>environments-maven-plugin</artifactId>
   <version>1.1.0-SNAPSHOT</version>
   <configuration>
      <targetPath>WEB-INF/classes</targetPath>
   </configuration>
   <executions>
      <execution>
         <goals>
            <goal>environment</goal>
         </goals>
      </execution>
   </executions>
</plugin>
下图说明了文件/目录命名/结构

注意:要使筛选工作正常,应同时声明commonDir和filters标记

用于将资源文件放置在War文件内的特定目录中的工具 资源文件通常属于war文件中的WEB-INF/classes目录。要在multimaven maven插件中实现这一点,必须在src/main/environments中的每个环境中创建WEB-INF/classes目录,然后将资源文件放在其中。如下图所示,这是多余和丑陋的

  • src
    • 主要
      • 环境
        • 发展
          • WEB-INF
            • 班级
              • 档案
        • 本地开发人员
          • WEB-INF
            • 班级
              • 档案
          • WEB-INF
            • 班级
              • 档案
        • ci_local
          • WEB-INF
            • 班级
              • 档案
为了解决这个问题,environments maven plugin引入了一个名为targetPath的新标签。如果使用目录路径作为值声明此标记,则war中打包的资源文件将放置在目录中。所以看起来像这样

<plugin>
         <groupId>net.sf.environments-maven-plugin</groupId>
         <artifactId>environments-maven-plugin</artifactId>
         <version>1.1.0-SNAPSHOT</version>
         <configuration>
            <excludeEnvironments>dev01, qa01</excludeEnvironments>
            <parallel>true</parallel>
            <archives>
               <environmentArchiveConfiguration>
                  <environment>dev02</environment>
                  <archive>
                     <manifestEntries>
                        <mode>development</mode>
                        <key>value</key>
                     </manifestEntries>
                  </archive>
               </environmentArchiveConfiguration>
               <environmentArchiveConfiguration>
                  <environment>prod01, prod02</environment>
                  <archive>
                     <manifestEntries>
                        <mode>development1</mode>
                        <key>value1</key>
                     </manifestEntries>
                  </archive>
               </environmentArchiveConfiguration>
            </archives>
         </configuration>
         <executions>
            <execution>
               <goals>
                  <goal>configuration</goal>
               </goals>
            </execution>
         </executions>
      </plugin>
  • app_dev.jar
    • WEB-INF
      • 班级
        • 档案
  • app_dev_local.jar
    • WEB-INF
      • 班级
        • 档案
  • app_ci.jar
    • WEB-INF
      • 班级
        • 档案
  • app_ci_local.jar
    • WEB-INF
      • 班级
        • 档案
在这种情况下,目录结构看起来是这样的

  • src
    • 主要
    • 环境
      • 发展
        • 档案
      • 本地开发人员
        • 档案
        • 档案
      • ci_local
        • 档案
示例配置

<plugin>
   <groupId>net.sf.environments-maven-plugin</groupId>
   <artifactId>environments-maven-plugin</artifactId>
   <version>1.1.0-SNAPSHOT</version>
   <configuration>
      <excludeEnvironments>dev01, qa01 ,qa02,</excludeEnvironments>
      <parallel>true</parallel>
   </configuration>
   <executions>
      <execution>
         <goals>
            <goal>configuration</goal>
         </goals>
      </execution>
   </executions>
</plugin>
<plugin>
   <groupId>net.sf.environments-maven-plugin</groupId>
   <artifactId>environments-maven-plugin</artifactId>
   <version>1.3.0-SNAPSHOT</version>
   <configuration>
      <commonDir>common</commonDir>
      <filters>
         <filter>ec.properties</filter>
      </filters>
   </configuration>
   <executions>
      <execution>
         <goals>
            <goal>environment</goal>
         </goals>
      </execution>
   </executions>
</plugin>
<plugin>
   <groupId>net.sf.environments-maven-plugin</groupId>
   <artifactId>environments-maven-plugin</artifactId>
   <version>1.1.0-SNAPSHOT</version>
   <configuration>
      <targetPath>WEB-INF/classes</targetPath>
   </configuration>
   <executions>
      <execution>
         <goals>
            <goal>environment</goal>
         </goals>
      </execution>
   </executions>
</plugin>

net.sf.environments-maven-plugin

源代码

概览页面

编辑

这就是关于配置的说法

应用程序有时将配置存储为代码中的常量。这违反了12个因素,这要求将配置与代码严格分离。不同部署的配置差异很大,而代码则不同。

environments maven插件支持从代码中分离配置

配置管理的另一个方面是分组。有时,应用程序会批量配置到以特定部署命名的组(通常称为“环境”),例如Rails中的开发、测试和生产环境。这种方法不能很好地扩展:随着应用程序部署的增加,需要新的环境名称,如staging或qa。随着项目的进一步发展,开发人员可能会添加他们自己的特殊环境,如joes staging,从而导致配置的组合爆炸,这使得管理应用程序的部署变得非常脆弱。

请注意,它表明为不同的环境维护单独的属性文件是脆弱的,但不建议任何替代方案。虽然知识更渊博的人可以就这种想法的优点和缺点进行争论,但在现实世界中,属性文件被分组到不同的环境中。在这种情况下,需要将这些组正确地打包到war文件中,或者将这些组交付到各自的环境中