博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Maven之Parent模块配置-关于聚合与继承、依赖管理、占位符、构建管理和多套环境...
阅读量:6092 次
发布时间:2019-06-20

本文共 14389 字,大约阅读时间需要 47 分钟。

hot3.png

本文隶属于新手图文教程《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}

上面的内容多数由系统自动生成。在原有基础上,我额外还加入了以下内容:

  1. 更多模块信息
  2. properties
  3. ependencyManagement
  4. build
  5. 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里面有两种父子关系:

  1. 亲爹 - 管继承,在sub module(子模块)里面通过parent元素进行配置
  2. 干爹 - 管聚合,在Aggregator(聚合器)里面通过modules元素进行配置

继承与聚合

如图:

甲乙两个儿子需要声明谁是自己亲爹,但是亲爹不用声明自己有儿子。儿子们继承亲爹的可继承属性。

干爹需要声明自己有两个干儿子甲和乙,但干儿子不用关心自己有个干爹,对干爹进行build,干爹会拉上两个干儿子一起,当做一整个聚合项目进行build。

由此衍生出各种用法:

  1. 本教程中的study-parent,既是亲爹 - Parent,又是干爹 - Aggregator(聚合器);既起到属性继承的作用,又起到聚合的作用。小型项目整个一起发布时,考虑使用这种方式。
  2. Parent不配置modules元素来声明Sub Module(子模块),但是Sub Module需要声明Parent。这样各个Sub Module继承自同一个Parent的属性,但是分别进行Build操作。多人协作,每个人负责一个模块时,考虑使用这种方式。
  3. 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节点内引用这些插件。例如:

clean绑定goal

后面章节会进行具体介绍。

另外,在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项目上的为准。

转载于:https://my.oschina.net/mzdbxqh/blog/846018

你可能感兴趣的文章
TurboMail邮件服务器证券行业邮件归档解决方案
查看>>
Windows Server 2012 R2安装图解
查看>>
MyEclipse不能自动编译解决方法
查看>>
JAVA笔记——this关键字
查看>>
程序猿装B指南
查看>>
我的友情链接
查看>>
DSP中测算程序段运行时间
查看>>
SpringTask 任务调度
查看>>
hadoop的计数器
查看>>
一个集群网址
查看>>
将 RedirectToOptimalOWAServer 设置为 False 后通过代理连接到客户端访问服务器失败...
查看>>
使用properties配置spring
查看>>
UISegment总结
查看>>
开源 java CMS - FreeCMS2.8 自定义标签 infoNextList
查看>>
Rhel7 重置root密码为ooxxbalabala
查看>>
startActivity 报错
查看>>
Linux——kernel服务安全设置
查看>>
我们忽略的IE特效——一些特殊效果
查看>>
mysql 批量修改
查看>>
滚动条的运用范例
查看>>