maven不引入parent_Maven pom.xml中的元素modules、parent、properties以及import

本文介绍了Maven中关键元素如modules、parent、properties和import的使用,展示了如何通过模块聚合、继承父pom实现项目结构的复用与简化,以及如何通过dependencyManagement管理子模块依赖,确保版本一致性。
摘要由CSDN通过智能技术生成

前言

maven的核心是 pom.xml,那么我们就来看看那些不同的地方

给我印象最深的就是如下四个元素:modules、parent、properties、import

modules

从字面意思来说,module 就是模块,而 pom.xml 中的 modules 也正是这个意思,用来管理同个项目中的各个模块

如果 maven 用的比较简单,或者说项目的模块在 pom.xml 没进行划分,那么此元素是用不到的

稍微复杂一点的项目都是要用到的

需求场景

如果我们的项目分成了好几个模块,那么我们构建的时候是不是有几个模块就需要构建几次了(到每个模块的目录下执行 mvn 命令)?

当然,你逐个构建没问题,但是非要这么麻烦的一个一个的构建吗

简单的做法就是使用聚合,一次构建全部模块

具体实现

既然使用聚合,那么就需要一个聚合的载体,先创建一个普通的 maven 项目 account-aggregator,如下图:

AOYAZh4AmAFQMgCYgZIpOZ5MnfMPeT4LeT4L9V4a+mktU6qRAQAw5BfaQggCHYNYBgAAAABJRU5ErkJggg==

因为是个聚合体,仅仅负责聚合其他模块,那么就只需要上述目录,该删除的就删了

注意 pom.xml 中的红色部分

4.0.0

com.youzhibing.account

account-aggregator

1.0.0-SNAPSHOT

pom

Account Aggrregator

http://maven.apache.org

account-register

account-persist

创建子模 account-register、account-persist

右击 account-aggregator,new --> other --> Maven,选择 Maven Module,创建 moven 模块

AEB1zOl02xZFAAAAAElFTkSuQmCC

创建完成后,项目结构如下,那么此时 account-aggregator 可以收缩起来了,我们操作具体子模块就好了

02dbe9d0f3009414e5d3986935e2448e.png

当我们打开包结构的子模块的 pom.xml 时,发现比预期的多了一些内容,我们做下处理就好了

Txmoen4PAADoh75koAp7y0DZPC5Pm87sUTYAANBPZKAqarUvAhAAAEMxkAwEAADQyP8DKztcOIIfdWAAAAAASUVORK5CYII=

那么编码完了之后,我们只需要构建 account-aggregator 就好了,所有的子模块都会构建

parent

继承,和 java 中的继承相当,作用就是复用

需求场景

若每个子模块都都用的了 spring,那么我们是不是每个子模块都需要单独配置 spring依赖了?

这么做是可以的,但是我们有更优的做法,那就是继承,用 parent 来实现

具体实现

配置父 pom.xml

我们就用聚合pom来做父pom,配置子模块的公共依赖

父(account-aggregator) pom.xml

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

4.0.0

com.youzhibing.account

account-aggregator

1.0.0-SNAPSHOT

pom

Account Aggrregator

http://maven.apache.org

account-register

account-persist

org.springframework

spring-core

4.0.2.RELEASE

org.springframework

spring-beans

4.0.2.RELEASE

org.springframework

spring-context

4.0.2.RELEASE

org.springframework

spring-context-support

4.0.2.RELEASE

junit

junit

4.7

test

View Code

account-register 的 pom.xml

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

4.0.0

com.youzhibing.account

account-aggregator

1.0.0-SNAPSHOT

../pom.xml

account-register

account-register

http://maven.apache.org

UTF-8

javax.mail

mail

1.4.3

com.icegreen

greenmail

1.4.1

test

View Code

account-persist 的 pom.xml

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

4.0.0

com.youzhibing.account

account-aggregator

1.0.0-SNAPSHOT

account-persist

account-persist

http://maven.apache.org

UTF-8

org.springframework

spring-jdbc

4.0.2.RELEASE

com.alibaba

druid

1.0.16

View Code

依赖的 jar 包全部 ok,需要做的则是在各个模块中进行代码开发了!

依赖管理

继承可以消除重复,那是不是就没有问题了? 还是有小瑕疵的

假设将来需要添加一个新的子模块account-util,该模块只是提供一些简单的帮助工具,不需要依赖spring、junit,那么继承后就依赖上了,有没有什么办法了?

有,maven已经替我们想到了,那就是 dependencyManagement 元素,既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性

在 dependencyManagement 元素下得依赖声明不会引入实际的依赖,不过它能够约束 dependencies 下的依赖使用

在父 pom.xml 中配置 dependencyManagement 元素

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

4.0.0

com.youzhibing.account

account-aggregator

1.0.0-SNAPSHOT

pom

Account Aggrregator

http://maven.apache.org

account-register

account-persist

org.springframework

spring-core

4.0.2.RELEASE

org.springframework

spring-beans

4.0.2.RELEASE

org.springframework

spring-context

4.0.2.RELEASE

org.springframework

spring-context-support

4.0.2.RELEASE

junit

junit

4.7

test

View Code

account-persist的pom.xml(account-register也一样) :

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

4.0.0

com.youzhibing.account

account-aggregator

1.0.0-SNAPSHOT

account-persist

account-persist

http://maven.apache.org

UTF-8

org.springframework

spring-core

org.springframework

spring-beans

org.springframework

spring-context

org.springframework

spring-context-support

junit

junit

org.springframework

spring-jdbc

4.0.2.RELEASE

com.alibaba

druid

1.0.16

View Code

使用这种依赖管理机制似乎不能减少太多的POM配置,就少了version(junit还少了个scope),感觉没啥作用呀

其实作用还是挺大的,父 pom.xml 使用 dependencyManagement 能够统一项目范围中依赖的版本

当依赖版本在父POM中声明后,子模块在使用依赖的时候就无须声明版本,也就不会发生多个子模块使用版本不一致的情况,帮助降低依赖冲突的几率

如果子模块不声明依赖的使用,即使该依赖在父 pom.xml 中的 dependencyManagement 中声明了,也不会产生任何效果

import

import 只在 dependencyManagement 元素下才有效果,作用是将目标 pom.xml 中的 dependencyManagement 配置导入并合并到当前 pom.xml 的 dependencyManagement 元素中

如下就是讲 account-aggregator中 的 dependencyManagemen t配置导入并合并到当前 pom.xml 中

com.youzhibing.account

account-aggregator

1.0.0-SNAPSHOT

pom

import

properties

通过 properties 元素用户可以自定义一个或多个 maven 属性,然后在 pom.xml 的其他地方使用 ${属性名} 的方式引用该属性,这种做法的最大意义在于消除重复和统一管理

maven 总共有 6 类属性,内置属性、POM属性、自定义属性、Settings属性、java系统属性和环境变量属性

内置属性

两个常用内置属性 ${basedir} 表示项目跟目录,即包含 pom.xml 文件的目录;${version} 表示项目版本

pom 属性

用户可以使用该类属性引用POM文件中对应元素的值。如${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/testclasses/

${project.groupId}:项目的groupId

${project.artifactId}:项目的artifactId

${project.version}:项目的version,与${version} 等价

${project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}-${project.version}

自定义属性

如下 account-aggregator 的 pom.xml,那么继承了此 pom.xml 的子模块也可以用此自定义属性

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

4.0.0

com.youzhibing.account

account-aggregator

1.0.0-SNAPSHOT

pom

Account Aggrregator

http://maven.apache.org

account-register

account-persist

account-another

4.0.2.RELEASE

4.7

org.springframework

spring-core

${spring.version}

org.springframework

spring-beans

${spring.version}

org.springframework

spring-context

${spring.version}

org.springframework

spring-context-support

${spring.version}

junit

junit

${junit.version}

test

View Code

settings属性

与 pom 属性同理,用户使用以 settings. 开头的属性引用 settings.xml 文件中的 XML 元素的值

Java系统属性

所有 java 系统属性都可以用 maven 属性引用,如 ${user.home} 指向了用户目录

环境变量属性

所有环境变量属性都可以使用以 env. 开头的 maven 属性引用,如 ${env.JAVA_HOME} 指代了 JAVA_HOME 环境变量的的值

聚合与继承的关系

1、聚合主要是为了方便快速构建项目,继承主要是为了消除重复配置

2、对于聚合模块而言,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在;对于继承的父pom 而言,它不知道有哪些子模块继承它,但那些子模块都必须知道自己的父pom 是什么

3、聚合pom 与继承中的父pom 的 packaging 都必须是 pom;同时,聚合模块与继承中的父模块除了 pom 外,都没有实际的内容

结束语

maven越来越流行,这方面的资料也是越来越多,《Maven实战》给我的感觉就相当不错,本博客的内容大多取自其中;网上资料也越来越多,就博客园中就有不少;

最后强调一点:看了是好,实践更好,写博客记录下来那是最好!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值