本文隶属于新手图文教程《IDEA+Maven搭建Spring+SpringMVC+Mybatis项目骨架》
下一篇:
目录 & 项目地址:
本文开始对study-parent模块的pom.xml进行配置。该文件的角色是整个Maven的Parent。文中将对Maven的聚合与继承、依赖管理、占位符、构建管理、多套配置等概念进行解释。以下将pom.xml的元素结构摘录如下:
study-parent/pom.xml
4.0.0 com.oschina study-parent 1.0-SNAPSHOT pom study-common study-plugin study-blog study-web ssm学习项目 模块描述 https://my.oschina.net/mzdbxqh/ mzdbxqh install ${basedir}/target ${project.artifactId}-${project.version}
上面的内容多数由系统自动生成。在原有基础上,我额外还加入了以下内容:
- 更多模块信息
- properties
- ependencyManagement
- build
- profiles
下面分别对重要节点进行说明:
一、坐标 - Group:ArtifactId:Version
我们可以简单地认为,GroupId:ArtifactId:Version:Packaging四个元素构成了一个maven项目的坐标,用于在Maven仓库中准确地定位一个模块的特定版本。一个GroupId(项目)下面可以有很多个ArtifactId(模块),每个ArtifactId(模块)会有很多个Version(版本),每个Version(版本)一般被Packaging(打包)为jar、war、pom中的一种。
但在被引用的时候,Packaging经常是固定的类型,因此更多的时候我们所关心的仅仅是由GroupId:ArtifactId:Version构成的基本坐标。比如配置parent的时候,坐标确定的对象是一个具体的pom项目;在配置依赖的时候,坐标默认定位了一个具体的jar项目。
以下是:study-parent/study-common/pom.xml/坐标
study-common
二、继承与聚合 - Parent/Aggregator
maven里面有两种父子关系:
- 亲爹 - 管继承,在sub module(子模块)里面通过parent元素进行配置
- 干爹 - 管聚合,在Aggregator(聚合器)里面通过modules元素进行配置
如图:
甲乙两个儿子需要声明谁是自己亲爹,但是亲爹不用声明自己有儿子。儿子们继承亲爹的可继承属性。
干爹需要声明自己有两个干儿子甲和乙,但干儿子不用关心自己有个干爹,对干爹进行build,干爹会拉上两个干儿子一起,当做一整个聚合项目进行build。
由此衍生出各种用法:
- 本教程中的study-parent,既是亲爹 - Parent,又是干爹 - Aggregator(聚合器);既起到属性继承的作用,又起到聚合的作用。小型项目整个一起发布时,考虑使用这种方式。
- Parent不配置modules元素来声明Sub Module(子模块),但是Sub Module需要声明Parent。这样各个Sub Module继承自同一个Parent的属性,但是分别进行Build操作。多人协作,每个人负责一个模块时,考虑使用这种方式。
- Parent和Aggregator分开,Sub Module声明同一个Parent,但是有多个Aggregator把Sub Module分成了多组,甚至可能会有一个Sub Module同时在几个Aggregator里面的情况。 整个公司里共用一个Parent,不同的团队分管不同的子系统时,考虑使用这种方式。 不同模块部署在不同机器上,通过远程调用时,考虑使用这种方式。
按照第3种用法,本示范项目可以转化为下面这种变体:
三、占位符 - ${X}
POM.xml里面可以通过${}占位符引用一些变量,例如:
${project.version} ${env.JAVA_HOME} ${project.build.sourceEncoding} ${X}
Parent的properties节点的作用正是用于自定义变量以及覆盖maven内置参数的值。以下代码除了定义第三方依赖的版本外,还覆盖了几个maven内置参数,其发生作用的原理是:
study-parent/pom.xml继承自Parent Poms,其对于插件中参数的配置,采用了占位符的方式。
例如${project.build.sourceEncoding},在Parent Poms中定义为"GBK"。此处对默认值进行覆盖,即实现了批量变更插件配置的目的。
以下是:study-parent/pom.xml/properties
UTF-8 1.8 1.8 4.3.6.RELEASE 1.8.9 3.4.2 1.3.1 5.1.40 1.0.28 4.11 1.7.21 1.2.17 1.2 2.5 2.0 1.2.29 21.0
四、依赖管理 - dependencyManagement
Parent的dependencyManagement节点的作用是管理整个项目所需要用到的第三方依赖。只要约定了第三方依赖的坐标(GroupId:ArtifactId:version),后代模块即可通过GroupId:ArtifactId进行依赖的引入。这样能够避免依赖版本的冲突。当然,这里只是进行约定,并不会真正地引用依赖。
以下是:study-parent/pom.xml/dependencyManagement
org.springframework spring-core ${spring.version} commons-logging commons-logging org.springframework spring-beans ${spring.version} org.springframework spring-context ${spring.version} org.springframework spring-context-support ${spring.version} org.springframework spring-aop ${spring.version} org.springframework spring-aspects ${spring.version} org.springframework spring-webmvc ${spring.version} org.springframework spring-web ${spring.version} org.springframework spring-test ${spring.version} test junit junit ${junit.version} test org.springframework spring-jdbc ${spring.version} org.springframework spring-tx ${spring.version} org.mybatis mybatis ${mybatis.version} org.mybatis mybatis-spring ${mybatis-spring.version} mysql mysql-connector-java ${mysql.version} com.alibaba druid ${druid.version} org.slf4j jcl-over-slf4j ${slf4j.version} org.slf4j slf4j-api ${slf4j.version} org.slf4j slf4j-log4j12 ${slf4j.version} log4j log4j ${log4j.version} jstl jstl ${jstl.version} javax.servlet servlet-api ${servlet-api.version} provided javax.servlet jsp-api ${jsp-api.version} provided com.alibaba fastjson ${fastjson.version} com.google.guava guava ${guava.version}
五、构建配置 - build
build节点的内容可以分为三部分,BaseBuild、Resources、Plugins,下面分开说。
1. BaseBuild
以下是:study-parent/pom.xml/build/BaseBuild
install ${basedir}/target ${project.artifactId}-${project.version}
以下是:study-parent/study-web/pom.xml/build/BaseBuild
${basedir}/src/main/resources/filters/${profile.active}.properties
注意:这里把filters放在了study-web这个包,是因为我准备把所有的资源文件都放在study-web包里。假如这里把filters的内容配置在study-parent包,因为所有子模块都继承了父模块的build属性,结局就是每个子模块都会到自己包下的src/main/resources/filters目录下找dev.properties文件,显然与本意相悖。
2. Resources
以下是: study-parent/study-web/pom.xml/build/Resources
${basedir}/src/main/resources true **/*.properties **/*.xml filters/*.properties
理由同filter,resources节点配置在study-web包下面。
以下是:study-parent/study-blog/study-blog-mapper/pom.xml/build/Resources
${basedir}/src/main/java false **/*.properties **/*.xml
在这个包配置resources节点是为了打包Mybatis的mapper文件。
3. Plugins
实际上,maven自身只是定义了生命周期,本身并没有做任何实现。但它把各个生命周期的不同阶段,绑定了不同插件的不同目标(Goal)。如果没有特别的需要,不用再在Plugins节点内引用这些插件。例如:
后面章节会进行具体介绍。
另外,在properties节点已经提过,maven内置的插件在设定参数时,大部分使用了${}这种占位符来引用maven内置的变量。而properties节点对编码方式、源文件jdk版本和编译版本进行了覆盖,将编码方式设为utf8,jdk设为1.8,故plugins节点不需要再显式地引用这些插件并指定以上参数。
org.apache.tomcat.maven tomcat7-maven-plugin 2.2 ${server.path} ${server.port} ${project.build.sourceEncoding} ${deploy.url} ${server.username} ${server.password}
注意,在配置tomcat7插件的时候,其参数均使用${}占位符,将在下一节进行定义。
六、多套环境配置 - profile
maven中的profile是一种扩展配置机制,她就好比扑克牌,你可以打出一张牌,或者打出一组牌,来告诉maven你的意图。在开发过程中,比方说我们要运行项目,可能会有首次运行进行初始化和后续正常运行两种配置。我们进行项目部署,可能会有开发环境、调试环境和生产环境的差别。此时使用profile来预定义多套配置,让maven应用于不同的阶段、不同的环境,将会非常有用。
以下是:study-parent/pom.xml/profiles
dev dev / 8080 http://127.0.0.1:8080/manager/text username password true test test / 8080 http://测试环境IP:8080/manager/text 测试环境管理账号 测试环境管理密码 prod prod / 8080 http://生产环境IP:8080/manager/text 生产环境管理账号 生产环境管理密码
Parent模块的pom就配置到这里,完整的代码以Github项目上的为准。