在开发项目时,设想有以下场景:

  1. 你的Maven项目存放在一个远程代码库中(比如github),该项目需要访问数据库,你有两台电脑,一台是Linux,一台是Mac OS X,你希望在两台电脑上都能做项目开发。但是,安装Linux的电脑上安装的是MySQL数据库,而Mac OS X的电脑安装的是PostgreSQL数据库。此时你需要找到一种简单的方法在两种数据库连接中进行切换,你会怎么做?

  2. 此外,你的项目需要部署。为了调试,在开发时我们在Java编译结果中加入了调试信息(Java默认)。而在部署时你希望Java编译结果中不出现调试信息。此时你又会怎么做?

答案是Profile。Maven的Profile用于在不同的环境下应用不同的配置。一套配置即称为一个Profile。这里的“环境”可以是操作系统版本,JDK版本或某些文件是否存在这样的物理环境,也可以是你自己定义的一套逻辑环境。比如上面的A中所说的Linux和Mac OS X便是一种物理环境,而B中讲的开发环境和部署环境则为逻辑环境。Maven提供了Activation机制来激活某个Profile,它既允许自动激活(即在某些条件满足时自动使某个Profile生效),也可以手动激活。

一个Profile几乎可以包含所有能够出现在pom.xml中的配置项,比如<artifactId>,<outputDirectory>等。相当于在Profile中定义的配置信息会覆盖原有pom.xml中的相应配置项。

(一)定义Profile

一般来说,我们将Profile的定义放在pom.xml文件的最后:

<profiles><profile><id>apple</id><activation><activeByDefault>true</activeByDefault></activation><properties><fruit>APPLE</fruit></properties></profile><profile><id>banana</id><properties><fruit>BANANA</fruit></properties></profile></profiles>

在上面的配置中,我们定义了两个Profile,一个id为apple,该Profile将fruit属性设置为APPLE,另一个id为banana,它将fruit属性设置为BANANA。此外,第一个Profile还配置了“<activeByDefault>true</activeByDefault>”,表明该Profile默认即是生效的。

为了打印出fruit这个属性,我们再向pom.xml中添加一个maven-antrun-plugin插件,我们可以通过该插件的echo任务来打印属性信息。我们将该打印配置在Maven的initialize阶段(任何阶段都可以):

<plugin><artifactId>maven-antrun-plugin</artifactId><executions><execution><phase>initialize</phase><goals><goal>run</goal></goals><configuration><tasks><echo>Fruit:${fruit}</echo></tasks></configuration></execution></executions></plugin>

配置完成之后,执行:“mvn initialize”,由于id为apple的Profile默认生效,此时将在终端输出“APPLE”字样:

......[INFO] Executing tasks[echo] Fruit:APPLE[INFO] Executed tasks......
 
 

如果要使用id为banana的Profile,我们可以显式地指定使用该Profile:"mvn initialize -Pbanana":

......[INFO] Executing tasks[echo] Fruit:BANANA[INFO] Executed tasks......

(二)手动激活Profile

事实上,在上面的例子中,我们在显示“BANANA”时便使用了手动激活Profile的方式。手动激活Profile要求我们在运行mvn命令时通过“-PprofileId”的方式指定使用某个Profile。比如,对于上文提到的B点,我们可以通过一下配置完成:

<profile><id>production</id><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><debug>false</debug></configuration></plugin></plugins></build></profile>

在开发时,我们使用“mvn clean install”,此时名为production的Profile并没有被激活,所以还是采用Java编译默认的配置(即在结果中包含了调试信息)。当需要为生产部署环境编译时,便可以使用“mvn clean install -Pproduction”。

本人认为,Maven的Profile机制最大的好处在于它的自动激活性(请参考下文),因为如果手动激活,在运行mvn命令时我们依然需要告诉Maven一些信息(即这里的“-PprofileId”)来完成配置,我们完全可以通过另外的方法来达到相同的目的。比如,我们可以定义一个父pom和两个子pom(比如pom.xml和pomB.xml),在父pom中我们存放两个子pom共享的配置(比如上面的maven-antrun-plugin),而在两个子pom中分别配置不同的信息以代表不同的环境,比如在pom.xml中(默认执行的pom),我们将fruit属性设置成APPLE,而在pomB.xml中,将fruit属性设置成BANANA。此时,pom.xml和pomB.xml都继承自父pom。虽然在默认情况下Maven会将名为“pom.xml”的文件作为输入文件,但是我们通过“-f”参数来指定其他pom文件。比如,如果我们要显示“APPLE”,我们可以直接执行“mvn initialize”,如果要显示“BANANA”,则可以执行“mvn initialize -f pomB.xml”。

(三)自动激活Profile

在自动激活Profile中,我们需要为某个Profile预先定义一些前提条件(比如操作系统版本),当这些前提条件满足时,该Profile将被自动激活。比如,对于上文中的A点,我们可以为Mac OS X和Linux(Unix)分别定义一套数据库连接:

       <profile><id>mac</id><activation><activeByDefault>false</activeByDefault><os><family>mac</family></os></activation><properties><database.driverClassName>org.postgresql.Driver</database.driverClassName><database.url>jdbc:postgresql://localhost/database</database.url><database.user>username</database.user><database.password>password</database.password></properties></profile><profile><id>unix</id><activation><activeByDefault>false</activeByDefault><os><family>unix</family></os></activation><properties><database.driverClassName>com.mysql.jdbc.Driver</database.driverClassName><database.url>jdbc:mysql://localhost:3306/database</database.url><database.user>username</database.user><database.password>password</database.password></properties></profile>

请注意,以上两个Profile在默认情况下都没有被激活,Maven在运行时会检查操作系统,如果操作系统为Mac OS X,那么Maven将自动激活id为mac的Profile,此时将使用PostgreSQL的数据库链接,如果操作系统为Linux或Unix,那么将使用MySQL数据库连接。

Maven使用Profile相关推荐

  1. Apache Maven 使用 profile 和 filtering 实现多种环境下的资源配置管理

     http://archboy.org/2012/05/21/apache-maven-profile-filtering-multiple-build-environments/ 构建项目时可能 ...

  2. 使用maven的profile区分本地环境和线上环境

    使用maven的profile区分本地环境和线上环境 多环境开发,使用maven-profile,就可以在打包的时候通过参数的调整,最终打的包也不同. 以区分本地数据库和线上数据库为例 比如测试环境, ...

  3. 利用MAVEN的profile 实现打包环境的切换

    乐哉码农 产生问题的背景 由于在项目开发的时候,我们一般都是使用的本地库,数据库连接写的是本地的,如果我们将项目打成war的时候,里面的配置连接写的是我们本地的,当我们直接把war拷贝到服务器上面进行 ...

  4. maven中profile的使用详解

    maven中profile使用详解 1. profile语法 1.1 profile中的配置结构 1.2 profile的定义位置 1.3 如何激活profile 1.4 查看当前处于激活状态的pro ...

  5. maven spring profile 协同

    请在网上查相关的使用情景,这里直接上要点.另外,可能不只一种方法,但这里只有一种. 1.POM.XML片段,使web.xml文件中有关活跃spring profile的内容可以被maven自动替换 & ...

  6. maven的profile详解

    详细内容请见:https://www.cnblogs.com/wxgblogs/p/6696229.html Profile能让你为一个特殊的环境自定义一个特殊的构建:profile使得不同环境间构建 ...

  7. MAVEN利用Profile构建不同环境的部署包

    通常,项目要在多个环境部署,每种环境都有各自的资源配置参数,比如:数据库连接.Redis服务器地址等等. 所以,各个环境打包出来的资源是不一样的,如果手动的修改,费时费力.我们可以利用MAVAN的pr ...

  8. Maven中profile和filtering实现多个环境下的属性过滤

    背景 项目构建的时候,需要根据不同的场景来改变项目中的属性资源,最为常见的莫过于数据库连接配置了,试想有生产环境.测试缓存.发布环境等,需要为不同的场景下来动态的改变数据库的连接配置.而使用maven ...

  9. Maven学习-Profile详解

    Profile能让你为一个特殊的环境自定义一个特殊的构建:profile使得不同环境间构建的可移植性成为可能.Maven中的profile是一组可选的配置,可以用来设置或者覆盖配置默认值.有了prof ...

最新文章

  1. java radiobutton获取信息_如何获取JRadioButton的文本值
  2. java序列化流_java 序列化流与反序列化流
  3. android线程改变布局,Android线程中设置控件的值提示报错的解决方法
  4. Java实现归并排序(转)
  5. 【身份证识别】基于matlab BP神经网络身份证号码识别【含Matlab源码 1344期】
  6. date和datetime长度设置多少_太原市玻璃温室大棚多少钱
  7. java servlet 视频_Servlet开发的理论提升视频教程 - JavaWeb - Java - 私塾在线 - 只做精品视频课程服务...
  8. 华为海思和MTK 智能手机
  9. BP神经网络算法简介
  10. 如何进行“基于示例”的搜索
  11. Prometheus邮件报警设置
  12. 【JavaScript 教程】第六章 数组11— filter() :过滤数组中的元素
  13. 事关微信支付,别成为背锅侠!
  14. 爱奇艺密码加密js分析
  15. with在python中啥意思_python中with的用法
  16. Chrome浏览器怎么安装插件
  17. OpenCV 颜色检测| color detection
  18. 传奇世界最好的版本:
  19. 275、Java基础51 - 数字与字符串【格式化输出】 2019.11.21
  20. 黄河科技学院计算机应用技术在哪个校区,黄河科技学院成考计算机应用技术(高升专)专业_黄河科技学院成考报名_成考计算机应用技术专业就业方向_中国教育在线...

热门文章

  1. 模电(三)晶体三极管
  2. DSP28335:多功能复用引脚GPIO
  3. 如何提取视频中的音频,不需要软件,在线就能做到
  4. HaploMerger2: 从高杂合二倍体基因组组装中重建单倍型
  5. 空洞卷积atrous/dilated convolution
  6. PHP开发环境配置指南
  7. CUDA入门教程;Transformer太火不是好事?;探求GPU极限性能的利器|AI系统前沿动态...
  8. Wikibon突破分析:数字技能差距预示IT服务支出的反弹
  9. 数据挖掘经典十大算法_条件熵、信息增益介绍
  10. 交换机的端口工作模式一般可以分为三种:Access,Multi,Trunk。