在Maven中管理环境和插件

在2019年,Maven中仍然没有合适的插件来管理环境。尝试解决环境管理问题的唯一方法是Khmarbaise的multienv-maven-plugin。在分享的这篇优锐课学习笔记中,我们将讨论有关使用environment-maven-plugin的详细信息,评估该插件缺少的内容,并查看针对此问题的潜在解决方案。让我们开始吧!

不允许排除环境

对于我从事的几乎所有项目,它们都具有多个环境的资源文件和开发人员计算机上运行的指向特定数据库环境的应用程序的资源文件。例如:dev, dev_local, ci, ci_local, qa, qa_local等。这些QA资源文件用于在QA环境中运行应用程序。qa_local资源文件用于在开发人员计算机上运行指向QA环境的应用程序。运行发行版构建时,不应生成ev_local, ci_localqa_local的war文件。否则,它会减慢构建速度并使混乱的构建页面混乱,从而可能给执行实际部署的团队造成混乱。

multienv-maven-plugin建立在以下原理上:src/main/environmentsrepresents下的每个目录都代表一个环境,而src/main/environments下的所有目录都是环境。此外,还会为每个环境生成一个战争文件。这种理念似乎提供了简单性,但这样做却以适当的功能为代价。

environments-maven-plugin允许排除不需要生成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>

不允许清单定制

当为不同的环境生成战争文件时,有时可能需要添加特定于环境的清单条目。multienv-maven-plugin不提供此功能。可以使用plugins配置中的environmentArchiveConfiguration标记,通过environments-maven-plugin轻松地做到这一点。

你可以为所有环境配置一个,也可以为每个单独的环境配置,如下所示。
为简便起见,已经将环境添加到每个war文件中。清单条目看起来像这样。

环境:ci_local

配置示例

<project>
  ...
<build>
   <plugins>
      <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>
   </plugins>
</build>
  ...
</project>

没有针对特定环境的filter

environment-maven-plugin引入了commonDirfilter标签。commonDir标记采用src/main/environnments中目录的路径。公用目录包含所有环境公用的模板。这些模板可以包含用@(@variable@)括起来的变量。

filter标签可以具有多个filter标签。每个filter标签均采用文件名。

建立战争后,插件会执行以下操作。

• 从公共目录获取模板文件。
• 从环境目录中检索具有在filter标签中声明的名称的文件。 例如,如果当前正在构建dev war,则插件会尝试从src/main/environments/dev目录中的filter标签中查找文件。
• 将filter标记中所有文件中的所有键值对合并到HashMap中。
• 使用HashMap中的那些键值对替换模板中的变量。
• 将上一步中的文件打包到dev war文件中。
• 还打包src/main/environments/${env}目录中的所有文件。

配置示例

<plugin>
   <groupId>net.sf.environments-maven-plugin</groupId>
   <artifactId>environments-maven-plugin</artifactId>
   <version>1.1.0-SNAPSHOT</version>
   <configuration>
      <targetPath>some/where/inside</targetPath>
      <commonDir>common</commonDir>
      <filters>
         <filter>envspec.properties</filter>
      </filters>
   </configuration>
   <executions>
      <execution>
         <goals>
            <goal>environment</goal>
         </goals>
      </execution>
   </executions>
</plugin>

下图说明了文件/目录的命名/结构。
在这里插入图片描述
为了使过滤工作正常进行,应该声明commonDir和filter标签。

不提供将资源文件放置在War文件内特定目录中的功能

资源文件通常属于war文件中的WEB-INF/classes目录。要在multimaven-mavenplugin中实现此目的,必须在src/main/environments内的每个环境中创建WEB-INF/classes目录,然后将资源文件放入其中。这是多余的而且不美观。

为了解决这个问题,environments-maven-plugin引入了一个名为targetPath的新标记。如果用值的目录路径声明此标记,则将war中打包的资源文件放在目录内。所以。看起来像这样。

       •	app.jar
                  o	some
                             	where
                                         	inside
                                                     	resource files

配置示例

<plugin>
   <groupId>net.sf.environments-maven-plugin</groupId>
   <artifactId>environments-maven-plugin</artifactId>
   <version>1.1.0-SNAPSHOT</version>
   <configuration>
      <targetPath>some/where/inside</targetPath>
   </configuration>
   <executions>
      <execution>
         <goals>
            <goal>environment</goal>
         </goals>
      </execution>
   </executions>
</plugin>

不允许构建单个环境

multienv-maven-plugin不提供构建单个环境的功能。结果是,仅针对个别环境就必须维护一套完全独立的设置。

environments-maven-plugin使用命令行选项**-Dem.env**解决了此问题。该选项的值是src/main/environment中感兴趣的环境的目录名称。

 mvn clean install -Dem.env=dev_local 

结论

environments-maven-plugin是 **mutlienv-maven-plugin.**的分支。我确实向multienv-maven-plugin提交了pull请求,但是我要么说了一个绅士不想听的话,要么他听了我没说的话。最终结果是拉取请求未得到批准。所以我不得不分叉。

1.0、1.1和1.2存在问题。 请使用最新版本:1.3。

项目页面: https://sourceforge.net/projects/environments-maven-plugin/
源代码:https://sourceforge.net/p/environments-maven-plugin/code/ci/master/tree/
概述页面: https://environments-maven-plugin.sourceforge.io/index.html

最后,该插件位于Maven Central中。

这篇分享就到这了,觉得意犹未尽的小伙伴可以加入我们Java学习资料交流qq群:907135806 进行深入探讨;想要更多JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java学习资料和视频课程的童鞋可以加vx:ddmsiqi 获取。

抽丝剥茧 细说架构那些事 ——【优锐课】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值