一个典型的项目将是开发环境、测试环境和生产环境,这些环境的数据库配置是不一样的,并使用正确的配置。

Maven为了支持构建的灵活性,内置了三大特性,即属性、Profile和资源过滤。本章将介绍这些特性。

Maven属性

Maven的六类属性:     
     Maven一共同拥有六类属性。各自是:     
    1.  内置属性:主要有两个经常使用内置属性-${basedir}表示项目根文件夹。即包括pom.xml文件的文件夹;${version}表示项目的版本号。

    2.  POM属性:用户能够使用该类属性引用POM文件里相应元素的值。

比如${project.artifactId}就相应了<project><artifactId>元素的值,经常使用的POM属性包含:

    • ${project.build.sourceDirectory}:项目的主源代码文件夹,默觉得src/main/java/。
    • ${project.build.testSourceDirectory}:项目的測试源代码文件夹,默觉得src/test/java/。

    • ${project.build.directory}:项目构建输出文件夹,默觉得target/。
    • ${project.outputDirectory}:项目的主代码编译输出文件夹。默觉得target/classes/。
    • ${project.testOutputDirectory}:项目測试代码编译输出文件夹。默觉得target/test-classes/。
    • ${project.groupId}:项目的groupId。

    • ${project.artifactId}:项目的artifactId。

    • ${project.version}:项目的version。

    • ${project.build.finalName}:项目打包输出文件的名称,默觉得${project.artifactId}-${project.version}。
     这些属性都相应了一个POM元素,它们中的一些属性的默认值是在超级POM中定义的。
  3.  自己定义属性:用户能够在POM的<properties>元素下自己定义Maven属性。比如:
<project>
...
<properties>
<my.prop>hello</my.prop>
</properties>
...
</project>
     然后在POM中其它地方使用${my.prop}的时候会被替换成hello。
  4. Settings属性:与POM属性同理。用户使用以settings.开头的属性引用settings.xml文件里XML元素的值。如经常使用的${settings.localRepository}指向用户本地仓库的地址。
  5. Java系统属性:全部Java系统属性都能够使用Maven属性引用,比如${user.home}指向了用户文件夹。

用户能够使用mvn help:system查看全部的Java系统属性。

  6. 环境变量属性:全部环境变量都能够使用以env.开头的Maven属性引用。比如${env.JAVA_HOME}指代了JAVA_HOME环境变量的值。用户能够使用mvn help:system查看全部的Java系统属性。

使用范例:
在一个多模块项目中。模块之间的依赖比較常见。这些模块一般会使用相同的groupId和version。这个时候就能够使用POM属性。
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>account-email</artifacId>
<version>${project.version}</version>
</denpendency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>account-persist</artifacId>
<version>${project.version}</version>
</denpendency>
</dependencies>
     通常,甚至该子模块的groupId和version也在聚合模块中约定好,那么如今这几个模块的groupId和version就做到了全然的一致。


构建环境的差异:

     在不同的环境中,项目的源代码应该使用不同的方式进行构建。

比如。我们在开发环境可能使用一套数据库配置,在线上环境可能使用另外一套数据库配置。相似的,对于缓存的配置、对于其它应用的RFC链接都可能在不同的生产环境下有不同的配置。

资源过滤:
     为了应对环境的变化。我们须要将会发生变化的部分提取出来。比如对于数据库的配置来说,我们通常会在src/main/resources文件夹下加入数据库的配置文件.properties文件。连接数据库使用的驱动类、URL、username和password都可能发生变化,因此用Maven属性代替它们:
database.jdbc.driverClass=${db.driver}
database.jdbc.connectionURL=${db.url}
database.jdbc.username=${db.username}
database.jdbc.password=${db.password}
     既然使用了Maven属性,我们就须要定义他们,在这里我们须要用到profile将其包裹起来,针对项目的不同配置,我们应该把profile定义在POM中。
<profiles>
<profile>
<id>dev</id>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.url>jdbc:mysql://192.168.1.100:3306/test</db.url>
<db.username>dev</db.username>
<db.password>dew-pwd</db.password>
</properties>
</profile>
</profiles>
     这里将这个profile命名为dev是为了将开发环境下的配置与其它环境差别开来。
     在默认情况下。Maven属性仅仅会在POM中被解析,如今我们须要的是其在资源文件里也要被解析,因此我们须要定制maven-resources-plugin的行为,使其在处理资源文件时,可以对Maven属性进行过滤,即开启资源过滤。
     为主资源文件夹开启过滤:
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resouces>
     为測试资源开启过滤:
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResouces>
     主资源文件夹和測试资源文件夹都能够超过一个,Maven同意用户声明多个资源文件夹。而且为每一个资源文件夹提供不同的过滤配置。

<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>/src/main/sql</directory>
<filtering>false</filtering>
</resource>
</resouces>
     最后我们仅仅须要在使用mvn的时候。在命令行激活profile,Maven就行在构建项目的时候使用profile中属性值替换数据库配置文件里的属性引用,命令例如以下:
     $mvn clean install -Pdev
     mvn的- P參数表示在命令行激活一个profile。

这里激活了id为dev profile。

能够在处理完之后的资源文件里看到。全部maven属性都已经被替换了过来。


Maven profile:

     在不同环境下的构建非常可能是不同的,典型的情况就是数据库的配置。

除此之外,有些环境可能须要配置插件运行一些特殊的操作。或者使用特殊版本号的依赖,或者须要一个特殊的构件名称。为了能让构建在各个环境下方便地移植,Maven引入了profile的概念。profile可以在构建的时候改动POM的一个子集,或者加入额外的配置元素。用户可以使用非常多方式激活profile。以实现构建在不同环境下的移植。

激活profile: 
 1 .命令行激活
     用户能够使用mvn命令行參数-P加上profile的id来激活profile,多个id之间以逗号分隔。

比如,以下的命令激活了dev-x和dev-y两个profile:

     $mvn clean install -Pdev-x, dev-y
 2.settings文件显式激活
     假设用户希望某个profile默认一直处于激活状态。就能够配置settings.xml文件的activeProfiles元素,表示其配置的profile对于全部项目都处于激活状态,代码例如以下:
<settings>
...
<activeProfiles>
<activeProfile>dev-x</activeProfile>
</activeProfiles>
</settings>
 3 .系统属性激活
 4. 操作系统环境激活     
 5. 文件存在是否激活
 6. 默认激活
     最以下的4种方式并不经常使用,因此不多做介绍。
Profile的种类:
     依据详细的须要,能够在下面位置声明profile:
  • pom.xml:非常显然。pom.xml中声明的profile仅仅对当前项目有效。
  • 用户settings.xml:用户文件夹下.m2/settings.xml中的profile对本机上该用户全部的Maven项目有效。

  • 全局settings.xml:Maven安装文件夹下conf/settings.xml中的profile对本机上全部的Maven项目有效。
     为了不影响其它用户且方便升级Maven。用户应该选择配置用户范围的settings.xml,避免改动全局范围的settings.xml文件。

也正是由于这个原因。一般不会在全局的settings.xml文件里加入profile。

     不同类型的profile中能够声明的POM元素也是不同的。pom.xml中的profile能够随着pom.xml一起被提交到代码仓库中、被Maven安装到本地仓库中、被部署到远程Maven仓库中。换言之,能够保证该profile伴随着某个特定的pom.xml一起存在,因此它能够改动或者添加非常多POM元素,见例如以下:
<project>
<repositories></repositories>
<pluginRepositories></pluginRepositories>
<distributionManagement></distributionManagement>
<dependencies></dependencies>
<dependencyManagement></denpendencyManagement>
<modules></modules>
<properties></properties>
<reporting></reporting>
<build>
<plugins></plugins>
<defaultGoal></defaultGoal>
<resources></resources>
<testResources></testResources>
<finalName></finalName>
</build>
</project>
     因为settings.xml与详细项目无关,所以在当中能够配置的profile元素较少:
<project>
<repositories></repositories>
<pluginRepositories></pluginRepositories>
<properties></properties>
<project>

版权声明:本文博主原创文章,博客,未经同意不得转载。

Maven学习笔记(十一年):柔性结构的更多相关文章

  1. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

  2. Maven学习笔记-03-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  3. DeepLearning.ai学习笔记(三)结构化机器学习项目--week2机器学习策略(2)

    一.进行误差分析 很多时候我们发现训练出来的模型有误差后,就会一股脑的想着法子去减少误差.想法固然好,但是有点headlong~ 这节视频中吴大大介绍了一个比较科学的方法,具体的看下面的例子 还是以猫 ...

  4. Maven学习笔记-04-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  5. muduo学习笔记(二)Reactor关键结构

    目录 muduo学习笔记(二)Reactor关键结构 Reactor简述 什么是Reactor Reactor模型的优缺点 poll简述 poll使用样例 muduo Reactor关键结构 Chan ...

  6. python3.4学习笔记(十一) 列表、数组实例

    python3.4学习笔记(十一) 列表.数组实例 #python列表,数组类型要相同,python不需要指定数据类型,可以把各种类型打包进去#python列表可以包含整数,浮点数,字符串,对象#创建 ...

  7. Go语言学习笔记十一: 切片(slice)

    Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...

  8. jQuery 学习笔记:jQuery 代码结构

    jQuery 学习笔记:jQuery 代码结构 这是我学习 jQuery 过程中整理的笔记,这一部分主要包括 jQuery 的代码最外层的结构,写出来整理自己的学习成果,有错误欢迎指出. jQuery ...

  9. Maven学习笔记—仓库

    Maven仓库 1 什么是Maven仓库 在Maven中,任何一个依赖.插件或者项目构建的输出,都可以成为构件,而Maven通常在某个位置统一的存储所有Maven项目共享的构件,这个统一的位置就是Ma ...

随机推荐

  1. 如何搭建NTP服务(转)

    最近,在搭建Oracle RAC过程中,需要用到DNS和NTP,其中,DNS用于域名.IP管理,NTP用于时间同步.其实,很久以前搭建过这两种服务,但技术,本质上,符合“用进废退”的客观规律.用得越频 ...

  2. ABP中动态WebAPI原理解析

    ABP中动态WebAPI原理解析 动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类 ...

  3. SQL简单的日报和月报

    --320, SQL SERVER 日报 --查询2009-01-01当天客户A1,A2,A3的订单数量 SELECT Cust_Name , CONVERT(CHAR(10), Order_Date ...

  4. AE+SceneControl源代码共享

    近来的,博友发私信或邮件交换,第一次使用前SceneControl代做一点project股票,做的很粗糙.我们希望对大家有帮助,欢迎留言交流哈萨克斯坦. 除了主开.保存.数据加载.询价,几个功能主要是 ...

  5. 完美攻略心得之圣魔大战3(Castle Fantisia)艾伦希亚战记(艾伦西亚战记)包含重做版(即新艾伦希亚战记)

    (城堡幻想曲3,纠正大家个错误哦,不是圣魔大战3,圣魔大战是城堡幻想曲2,圣魔大战不是个系列,艾伦西亚战记==艾伦希亚战记,一个游戏日文名:タイトル キャッスルファンタジア -エレンシア戦記-リニュー ...

  6. Android---App Widget(一)

    本文译自:http://developer.android.com/guide/topics/appwidgets/index.html App Widgets是一些较小的应用程序窗口,它们能够被嵌入 ...

  7. Java命令学习系列(7):Javap(转)

    原文出处: Hollis(@Hollis_Chuang) javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码. 一般情况下,很少有人使用javap对class文件 ...

  8. GIT分支管理是一门艺术(转)

    英文原文:http://www.nvie.com/posts/a-successful-git-branching-model/ 原文作者:Vincent Driessen 本文经Linux大棚博主总 ...

  9. Cantor的数表 【找规律】

    小俞同学,近期勤学苦练数学,对一种数表产生了兴趣. 数表例如以下: 1/1 1/2 1/3 1/4 1/5 2/1 2/2 2/3 2/4 3/1 3/2 3/3 4/1 4/2 5/1 她冥思苦相了 ...

  10. poj1260

    给定n类等级的珍珠 每类的珍珠都有需求的个数ai,和价格pi 为了防止游客只买1颗珍珠,所以购买ai个珍珠时,要加上10个的价格 即(ai+10)*pi 有时,购买高等级的珍珠代替低等级的珍珠时,可能 ...