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

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. hdu 3405 world islands

    求删点后最小的生成树,n<50....数据好弱,直接暴力枚举就行...删点的时候直接g[i][j]=INF就行了. #include<iostream> #include<al ...

  2. 【MongoDB】The description of index(一)

    From this blog, we start to talk about the index in mongo Database, which is similar to the traditio ...

  3. poj 1011 Sticks ,剪枝神题

    木棒 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 118943 Accepted: 27429 Description 乔治拿 ...

  4. [置顶] ANDROID 返回,菜单和HOME键的监听

    ------网上找了很多资料,项目中使用,最后将经验总结如下: 1,返回和菜单键是可以直接重写onKeyDown(int keyCode, KeyEvent event) 方法监听: @Overrid ...

  5. poj2387(最短路)

    题目连接:http://poj.org/problem?id=2387 题意:有N个点,给出从a点到b点的距离,当然a和b是互相可以抵达的,问从1到n的最短距离. 分析:最短路裸题. #include ...

  6. POJ 3458 Colour Sequence(简单题)

    [题意简述]:事实上题意我也没有特别看懂.可是依据它少许的题目描写叙述加上给的例子.就大胆的做了例如以下的推測: 就是说,如今给出一串字符s.然后紧接着给出可见的字符串visible还有隐藏的字符串h ...

  7. hosts文件导致无法访问网站

    前段时间有人反映无论怎么样都无法在自己的电脑上访问法兰克官网,那台电脑的DNS也无法解析,通过查看hosts文件后发现,原来该电脑的hosts文件木马修改过了,屏蔽了相关的域名,删除新增的或者用其他机 ...

  8. Python用Tkinter的Frame实现眼睛护士的倒计时黑色屏幕

    import Tkinter,time class MyFrame(Tkinter.Frame): def __init__(self): Tkinter.Frame.__init__(self) s ...

  9. HDU 1016 Prime Ring Problem 题解

    Problem Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ... ...

  10. 斯坦福ML公开课笔记14——主成分分析

    上一篇笔记中,介绍了因子分析模型,因子分析模型使用d维子空间的隐含变量z来拟合训练数据,所以实际上因子分析模型是一种数据降维的方法,它基于一个概率模型,使用EM算法来预计參数. 本篇主要介绍PCA(P ...