背景:

  如何加载不同环境的配置文件已经成了势在必行的,我们通常利用profile进行,详情参见我上篇博客 http://www.cnblogs.com/lianshan/p/7347890.html,但是单单的profile实在无法满足我们的需求,因为这实在是太简单太单一了,我们将它与maven-assembly-plugin,结合起来,来实现配置分离的问题。

profile不同环境参数设置

  此参数的配置与上篇几乎相同,不过是在properties的属性声明将其与assembly结合起来,具体示例如下。

  1. <profiles>
  2. <profile>
  3. <id>dev</id>
  4. <activation>
  5. <activeByDefault>true</activeByDefault>
  6. </activation>
  7. <properties>
  8. <env.devMode>dev</env.devMode>
  9. <skipAssemblyDEV>false</skipAssemblyDEV>
  10. <skipAssemblyUAT>true</skipAssemblyUAT>
  11. <skipAssemblyPROD>true</skipAssemblyPROD>
  12. </properties>
  13. </profile>
  14. <profile>
  15. <id>uat</id>
  16. <activation>
  17. <activeByDefault>false</activeByDefault>
  18. </activation>
  19. <properties>
  20. <env.devMode>uat</env.devMode>
  21. <skipAssemblyDEV>true</skipAssemblyDEV>
  22. <skipAssemblyUAT>false</skipAssemblyUAT>
  23. <skipAssemblyPROD>true</skipAssemblyPROD>
  24. </properties>
  25. </profile>
  26. </profiles>

我定义了三个环境的相同的四个变量,我在mvn clean  package -P dev 时指定了环境信息,也就相对于制定了变量的值。

可以观察到  skipAssemblyDEV 、skipAssemblyUAT、 skipAssemblyPROD 这三个值都是排他的,聪明的小伙伴已经可能意识到了,一定有三个地方使用了这三个变量,并将他们指向了指定的配置文件。

好我们来观察assembly的相关配置。

  1. <!--assembly test start-->
  2. <!--this include the xml assembly-->
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-assembly-plugin</artifactId>
  6. <version>3.0.0</version>
  7. <executions>
  8. <execution>
  9. <id>make-assembly-dev</id> <!--The identifier of this execution for labelling the goals during the build 标志-->
  10. <phase>package</phase> <!--The build lifecycle phase to bind the goals in this execution to 指定其编译阶段-->
  11. <goals>
  12. <goal>single</goal> <!--The goals to execute with the given configuration-->
  13. </goals>
  14. <configuration>
  15. <skipAssembly>${skipAssemblyDEV}</skipAssembly> <!--profile声明参数调用-->
  16. <descriptors>
  17. <descriptor>src/main/assembly/dev/assembly.xml</descriptor> <!--加载指定的assembly配置文件-->
  18. </descriptors>
  19. </configuration>
  20. </execution>
  21. <execution>
  22. <id>make-assembly-uat</id>
  23. <phase>package</phase>
  24. <goals>
  25. <goal>single</goal>
  26. </goals>
  27. <configuration>
  28. <skipAssembly>${skipAssemblyUAT}</skipAssembly>
  29. <descriptors>
  30. <descriptor>src/main/assembly/uat/assembly.xml</descriptor>
  31. </descriptors>
  32. </configuration>
  33. </execution>
  34. <execution>
  35. <id>make-assembly-prod</id>
  36. <phase>package</phase>
  37. <goals>
  38. <goal>single</goal>
  39. </goals>
  40. <configuration>
  41. <skipAssembly>${skipAssemblyPROD}</skipAssembly>
  42. <descriptors>
  43. <descriptor>src/main/assembly/prod/assembly.xml</descriptor>
  44. </descriptors>
  45. </configuration>
  46. </execution>
  47. </executions>
  48. </plugin>
  49. <!--assembly test end-->

首先我们通过 profile声明了相应的参数。

  1. skipAssembly 的解释如下,其声明值truefalse 表明我们是否要执行下列声明的配置文件
  1. Flag allowing one or more executions of the assembly plugin to be configured as skipped for a particular build.
    This makes the assembly plugin more controllable from profiles.
  2.  
  3. 此时我们再来观察下assembly.xml的相关配置文件。
  1. <assembly>
  2. <id>assembly-${env.devMode}</id> <!--输出文件名-->
  3. <formats>
  4. <format>tar.gz</format> <!--打包文件结构-->
  5. </formats>
  6. <includeBaseDirectory>false</includeBaseDirectory>
  7. <fileSets>
  8. <fileSet>
  9. <directory>src/main/assembly/bin</directory> <!-- 项目文件目录-->
  10. <outputDirectory>bin</outputDirectory> <!--生成bin目录-->
  11. <directoryMode>0755</directoryMode> <!--目录执行权限-->
  12. <fileMode>0755</fileMode><!--文件执行权限-->
  13. </fileSet>
  14. <fileSet>
  15. <directory>src/main/assembly/uat/conf</directory>
  16. <outputDirectory>conf</outputDirectory>
  17. <directoryMode>0744</directoryMode>
  18. <fileMode>0644</fileMode>
  19. </fileSet>
  20. <fileSet>
  21. <directory>lib</directory>
  22. <outputDirectory>lib</outputDirectory>
  23. <directoryMode>0744</directoryMode>
  24. <fileMode>0644</fileMode>
  25. </fileSet>
  26. </fileSets>
  27. <dependencySets>
  28. <dependencySet>
  29. <outputDirectory>lib</outputDirectory><!-- 依赖jar包放置目录-->
  30. </dependencySet>
  31. </dependencySets>
  32. </assembly>

那么这就是一个完整的利用assembly加载不同环境所需配置文件。

具体的构建完成包结构信息如下,关于target 此块只是tar.gz 与assembly有关,其余的为其他插件使用生成,生成的包结构亦如下:

  

最详细的信息请参考apache官网:https://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html

  1.  

  

利用maven-assembly-plugin加载不同环境所需的配置文件及使用场景的更多相关文章

  1. maven (profiles)装载不同环境所需的配置文件

    引子: maven与java的联系在今天的项目已经是不可分割的 ,但是不同的项目有各具特色的项目结构,不同的项目结构使用了不同的maven插件,想要了解一个项目的项目结构,或者自己构建一个具有成熟结构 ...

  2. 重温.NET下Assembly的加载过程

    最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后发现,并没能解决我的问题,有些点写的不是特别详 ...

  3. 重温.NET下Assembly的加载过程 ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线

    重温.NET下Assembly的加载过程   最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后 ...

  4. NET下Assembly的加载过程

    NET下Assembly的加载过程 最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后发现,并没 ...

  5. Django_在单独文件中加载Django环境临时调试

    创建Django环境后,每次在打印调试都需要基于项目有些麻烦. 如何在项目外的文件中加载项目环境进行便携的调试? 创建一个新的 orm.py import os if __name__ == '__m ...

  6. 记录一次maven打包时将test目录下的类打包到jar中,Maven Assembly Plugin的使用

    今天有人问我打包后找不到主类,运行的类写在test中.按照常规,test目录下的文件不会打包到jar包中.(但是我测试一个springboot工程就可以,这里之后再研究) 具体解决如下 第一步:在po ...

  7. Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新

    Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新 摘自: https://blog.csdn.net/johnson_moon/article/details/7887449 ...

  8. maven pom.xml加载不同properties配置[转]

    可以参考http://www.openwebx.org/docs/autoconfig.html 1.pom.xml =========================== <!-- 不同的打包 ...

  9. idea开发maven项目热加载

    JavaWeb项目,尤其是一些大型项目,在开发过程中,启动项目耗费的时间就不短.大大的拖慢了开发速度!在这分享一种不需要插件就能实现热加载的方法! 默认已经创建好一个Maven项目 点击此按钮 点击 ...

随机推荐

  1. (转)typedef 函数指针的用法

    typedef 函数指针的用法   在网上搜索函数指针,看到一个例子.开始没看懂,想放弃,可是转念一想,这个用法迟早要弄懂的,现在多花点时间看懂它,好过以后碰到了要再花一倍时间来弄懂它.其实很多时候都 ...

  2. 转载:Erlang 函数(Efficiency Guide)

    转自:http://www.cnblogs.com/futuredo/archive/2012/10/26/2737644.html Functions 1  Pattern matching 模式匹 ...

  3. c#.net常用函数和方法集

    1.DateTime 数字型 System.DateTime currentTime=new System.DateTime(); 1.1 取当前年月日时分秒 currentTime=System.D ...

  4. 在你开发完brew应用之后 ,你又如果将brew应用由编译成可以部署到brew真机上的程序包呢

    参考自:http://blog.csdn.net/feimor/article/details/6239281 一.准备工作(安装工具) 先安装Visual C++ 6.0,再安装BREW SDK v ...

  5. Android Studio右下角不显示当前branch名称

    当一个project刚从git server端clone下来并open后,或许你会发如今Android Studio的右下角看不到当前是哪个branch的信息.例如以下图: 原因分析:不显示的原因是由 ...

  6. 火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第四节:3D公告板

    <使用Cocos2d-x 开发3D游戏>系列在线课程 第四节:3D公告板 视频地址:http://edu.csdn.net/course/attend/1330/20804 交流论坛:mo ...

  7. ios 生成一个动态的随机的头像/随机数的操作

    在写项目的时候,可能会遇到这种情况,用到集中随机的颜色,或者头像等, 首先:把所需要的图片放进一个数组当中 imgsAry = @[@"t1.png",@"t2.png& ...

  8. Android 4.0 Tabhost图标显示不出来

    安卓4.0会有这个问题,修改Manifest.xml里面的Theme,找到System Resources,里面有Theme.black,选这个就行了.剩下自己要改背景色什么的这个还是比较easy的吧 ...

  9. 浅谈ITIL

    本节内容 浅谈ITIL CMDB介绍 Django自定义用户认证 Restful 规范 资产管理功能开发 浅谈ITIL TIL即IT基础架构库(Information Technology Infra ...

  10. C语言近程型(near)和远程型(far)的区别是什么?

    DOS用一种分段结构来寻址计算机的内存,每一个物理存储位置都有一个可以用段一偏移量方式来访问的相关地址.例如,下面就是一个典型的段式地址:     A000:1234 冒号左边的部分代表段地址(A00 ...