《maven实战》学习笔记7——maven项目版本管理和灵活构建

说明

《maven实战》一书内容很多,整个maven要学的东西也很多,不过,结合个人实际情况,我打算把这一篇作为这次对maven学习的一个阶段性收尾,待其他更急需补充的知识有一定眉目了,再回过头来继续深入。

maven版本管理

对于maven版本管理,最重要的是需要区分出快照版本SNAPSHOT和发布版本release,据目前的了解,快照版本格式是固定的,而发布版本有几种,例如带release单词的和不带release单词的。
快照版本由于每次发布都带时间戳,所以适用于开发阶段团队协作,但同时也是不稳定的。
发布版本就需要是比较稳定的版本,定了就不能变,如果要变就要发布新的发布版本。
不过,要更好的了解maven版本管理,必须先比较熟悉版本控制,结合实际情况,就是需要先比较熟悉svn版本控制。
由于目前我虽然天天在用svn,却还没有系统的学一下,所以对svn也还不是太熟,再加上目前实际工作对maven版本管理似乎也没有什么需求,因此maven版本管理这一块就先只做了解。

灵活构建

根据我的理解,maven灵活构建指的是经过一定的配置后,可以使maven在不同的场景很容易的改变一些构建细节,例如某些属性实际值的使用。
maven提供了属性properties、profiles、资源过滤三个特性来实现。

属性properties

这个说白了就相当于配置的一个变量,里边的标签名就是变量名,只不过有一些标签是maven默认的,或者说约定了的,同时也能自定义并使用,例如我在某个项目的pom.xml中这样配置:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring.version>4.0.9</spring.version>
    <auth.name>tzx</auth.name>
</properties>

在上边的例子中,前三个是maven默认的一些属性名,而spring.version、auth.name是我自己加的,有了这些配置,在这个pom.xml文件中就能用${auth.name}${spring.version}这样的方式获取到里边配置的值,这样大大增加可维护性以及减少重复配置。
就比如这里的spring.version,如果这个项目导入了很多个spring的jar包,那么每个依赖配置都要配置version,如果有了spring.version,那么在依赖配置的version那里就可以使用${spring.version},以后如果要升级spring版本,就可以只改动properties中的spring.version的值就可以了。
需要注意的是,我的这个配置是在项目的pom.xml中,但是实际上不只是能配置在这里,还能配置在maven的settings.xml中,例如我之前学习代码管理工具sonar的时候就在setting.xml中配置过mysql数据库相关的属性:

<properties>
       <sonar.jdbc.url>
        jdbc:mysql://localhost:3306/sonar
       </sonar.jdbc.url>
       <sonar.jdbc.driver>com.mysql.jdbc.Driver</sonar.jdbc.driver>
       <sonar.jdbc.username>sonar</sonar.jdbc.username>
       <sonar.jdbc.password>sonar</sonar.jdbc.password>
       <sonar.host.url>http://localhost:9000</sonar.host.url>
</properties>

除开上边两个之外,maven还能用maven内置属性、环境变量、系统变量等等,可以用mvn help:system命令来查看有哪些环境变量和系统变量,至于具体的内置属性有哪些,可以需要时网上查询一下。

maven的profiles

在说这个之前,先来看一个在前几篇记录中,讲maven仓库时有在settings.xml中出现过的一个配置:

<profiles>
   <profile>
     <id>nexus</id>
     <repositories>
      <repository>
         <id>repo1</id>
         <url>http://192.168.0.224:8081/nexus/content/groups/public</url>
         <releases>
                <enabled>true</enabled>
                <updatePolicy>daily</updatePolicy>
                <checksumPolicy>ignore</checksumPolicy>
         </releases>
      </repository>
      <repository>
         <id>repo2</id>
         <url>http://192.168.0.224:8081/nexus/content/groups/public-snapshots</url>         
         <snapshots>
                <enabled>true</enabled>
         </snapshots>
      </repository>
     </repositories>
     <pluginRepositories>
      <pluginRepository>
         <id>repo3</id>
         <url>http://192.168.0.65:8082/nexus/content/groups/public</url>
         <releases>
                <enabled>true</enabled>
         </releases>
      </pluginRepository>
      <pluginRepository>
         <id>repo4</id>
         <url>http://192.168.0.65:8082/nexus/content/groups/public-snapshots</url>
         <snapshots>
                <enabled>true</enabled>
         </snapshots>
      </pluginRepository>
     </pluginRepositories>
   </profile>
</profiles>

很显然,这就是一个这里要说的profiles的配置,这种配置的基本形式是,在一个profiles中可以配置多个profileprofile里就是具体的配置信息,据我理解,几乎所有能在profile之外配置的信息都可以放到这里边配置。
在这个配置中,最重要的是id属性,这是每个profile的唯一标示。
之后可以使用很多种方法来激活这个配置,例如可以在settings.xml文件的profiles标签之外增加这样的配置:

<activeProfiles>
    <activeProfile>nexus</activeProfile>
</activeProfiles>

然后,上边所配置的profile就被激活,可以被使用了。
除了上边这种激活方式,还可以通过‘命令行激活’、‘环境变量激活’、‘文件是否存在激活’等各种激活方式,不过目前我还完全没有用过这些方式,就暂时认为不常用,稍作了解就好。
那么除开上述的所有激活方式外,还有一种就是在profile内部配置激活:

<activation>
      <activeByDefault>true</activeByDefault>
</activation>

这种配置的意思,从字面意思其实就可以理解,那就是默认激活。不过需要注意的是,假如有用上述任何一种方式激活过某个profile,那么所有这种默认激活的方式都会失效。

web资源过滤

这个目前感觉也似乎不怎么常用,因此暂时只需要知道有这么回事就好。

推荐文章