- Maven进阶
- 一. 深入理解pom
- 1⃣️ 重新认识Maven
- 2⃣️ POM的四个层次
-
Maven的完整性
- 在入门的时候我们介绍说Maven是一款「构架管理」和「依赖管理」的工具. 但事实上这姿势Maven的一部分功能. Maven本身的产品定位是一款「项目管理工具」
-
项目管理功能的具体表现
-
下面是spring-boot-starter的POM文件, 可以看到: 除了我们熟悉的坐标标签, dependenices标签, 还有description, url, organization, licenses, developers, scm, issueManagement等这些描述项目信息的标签
-
description标签: 当前jar包的介绍
organization标签: 组织, 子标签name: 组织名, 子标签url: 官网地址
licenses标签: 类似于授权许可相应的, 子标签name: 许可名, 子标签url: 许可地址
developers标签: 开发对应标签, 子标签developer, 子标签name: 开发组织名, 子标签email: 开发组织邮箱, 子标签organization: ,子标签organizationUrl: 官网
scm标签: 软件配置管理, 子标签connection: 链接一般是git:git://, 子标签developerConnection: 开发链接一般是git:ssh, 子标签url: 链接一般是git:https仓库地址
issueManagement解决问题管理, 子标签system: 一般来说是github或者gitee这类型的种类, 子标签url: 对应的地址链接
-
code
4.0.0 org.springframework.boot spring-boot-starter 2.5.6 spring-boot-starter Core starter, including auto-configuration support, logging and YAML https://spring.io/projects/spring-boot Pivotal Software, Inc. https://spring.io Apache License, Version 2.0 https://www.apache.org/licenses/LICENSE-2.0 Pivotal info@pivotal.io Pivotal Software, Inc. https://www.spring.io scm:git:git://github.com/spring-projects/spring-boot.git scm:git:ssh://git@github.com/spring-projects/spring-boot.git https://github.com/spring-projects/spring-boot GitHub https://github.com/spring-projects/spring-boot/issues …… -
所以从「项目管理」的角度来看, Maven提供了如下这些功能:
-
项目对象(POM): 将整个项目本体抽象, 封装为应用成虚中的一个对象, 以便于管理和操作
-
全局性构建逻辑重用: Maven对整个构建过程进行分装之后, 程序只需要制定配置信息即可完成构建. 让构建过程从Ant的「编程式」升级到了Maven的「声明式」
-
构件的标准集合: 在Maven提供的标准框架体系内, 所有的构件都可以按照统一的规范生成和使用
-
构件关系定义: Maven定义了构件之间的三种基本关系, 让大型应用系统可以使用Maven来进行管理
- 继承关系: 通过从上倒下的继承关系, 将各个子构件中的重复信息提取到父构建中统一管理
- 聚合关系: 将多个构建聚合为一个整体, 便于统一操作
- 依赖关系: Maven定义了依赖的范围, 依赖的传递, 依赖的排除, 版本总裁机制等一系列规范和标准, 让大型项目可以有序容纳数百甚至更过依赖
-
插件目标系统: Maven核心程序定义抽象的生命周期, 然后将插件的目标绑定到生命周期中的特定阶段, 实现了标准和具体实现解耦合, 让Maven程序极具扩展性
-
项目描述信息的维护: 我们不仅可以在Pom中声明项目描述信息, 更可以将整个项目相关信息收集起来生成HTMl页面组成的一个可以直接访问的站点. 这些项目描述信息包括:
-
公司和组织信息
-
项目许可
-
开发成员信息
-
issue管理信息
-
SCM信息
…等
-
-
-
-
超级POM
官方解释
The Super POM is Maven’s default POM. All POMs extend the Super POM unless explicitly set, meaning the configuration specified in the Super POM is inherited by the POMs you created for your projects.
译文:Super POM 是 Maven 的默认 POM。除非明确设置,否则所有 POM 都扩展 Super POM,这意味着 Super POM 中指定的配置由您为项目创建的 POM 继承。
所以我们自己的POM即使没有明确指定一个父工程(副POM), 其实也默认继承了超级POM. 就好比一个Java类默认继承了Object类
那么超级POM中定义如下
4.0.0 central Central Repository https://repo.maven.apache.org/maven2 default false central Central Repository https://repo.maven.apache.org/maven2 default false never ${project.basedir}/target ${project.build.directory}/classes ${project.artifactId}-${project.version} ${project.build.directory}/test-classes ${project.basedir}/src/main/java ${project.basedir}/src/main/scripts ${project.basedir}/src/test/java ${project.basedir}/src/main/resources ${project.basedir}/src/test/resources maven-antrun-plugin 1.3 maven-assembly-plugin 2.2-beta-5 maven-dependency-plugin 2.8 maven-release-plugin 2.5.3 ${project.build.directory}/site release-profile performRelease true true maven-source-plugin attach-sources jar-no-fork true maven-javadoc-plugin attach-javadocs jar true maven-deploy-plugin true -
父POM
-
和Java一样, POM之间其实也是单继承的. 如果我们给一个POM制定了父POM, 那么继承关系如下图
-
-
有效POM
-
概念
有效pom英文翻译为effective Pom, 他的概念是这样的–在POM继承关系中, 子POM可以覆盖父POM中的配置; 如果子POM没有覆盖, 那么父POM中的配置将会被继承. 按照这个规则, 继承管系中的所有POM叠加到一起, 就得到了一个最终生效的POM. 显然Maven世纪运行过程中, 执行构建操作就是按照这个最终生效的POM来运行的. 这个最终生效的POM就是有效POM,
-
查看有效POM命令
mvn help:effective-pom
-



