Maven学习
简介:主要用于jar包的构建和管理(其他详细介绍可以参考官网)
一、分模块开发
1.1 按照功能拆分
- 银行取款:柜台取款、
app
取款、电脑网银取款,虽然都是取款但是场景不一样;如果三个场景都放在一个项目代码中,当项目运行出错时,三个场景的业务都无法办理,所以可以进行拆分。
按照某一个功能的不同使用场景进行拆分
1.2 按照模块拆分
- 如项目中有
pojo
、utils
、service
、dao
、controller
等模块,可以按照这些模块进行拆分。
把
pojo
、utils
、service
、dao
、controller
等模块拆分出来,一个模块一个项目,然后把拆分出来的模块进行聚合,这样就可以运行了。
二、POM文件解析
2.1 描述
POM
:project object model
项目对象模型- 个人理解:
pom.xml
中有很多的配置,通过标签方式,然后赋值在标签中,就好像是一个java对象中有很多属性,如:<modelVersion>4.0.0</modelVersion>
理解成pom.setModelVersion("4.0.0")
,学习maven
就是类似于理解java对象
中每个属性
的含义
2.2 具体标签
-
modelVersion
:声明此POM
符合哪个版本的项目描述符;如:<modelVersion>4.0.0</modelVersion>
就是符合4.0.0
版本的项目描述符 -
parent
:如果父项目存在就声明父项目的坐标信息,这样子项目就不需要声明groupId
和version
了,因为子项目会继承父项目的groupId
和version
groupId
:项目开发组或公司的唯一标识artifactId
:项目唯一标识version
:项目版本号parent
使用举例:
// 无父级 <groupId>com.ntzhuima.boot</groupId> <artifactId>daguo</artifactId> <version>2.0.0-jdk8-snapshot</version> // 有父级 <parent> <groupId>com.ntzhuima.boot</groupId> <artifactId>daguo-framework</artifactId> <version>${revision}</version> </parent> <artifactId>daguo-common</artifactId>
-
packaging
:打包方式,默认是jar
。如:<packaging>jar</packaging>
<packaging>pom</packaging>
和<packaging>jar</packaging>
的区别- 答:作为父级项目,没有代码需要编译或者测试,也没有资源需要处理,是了聚合工程用的,把多个模块聚合在一个模块中使用
pom
;而jar
表示项目将会编译成jar
包,作为服务使用
-
name
:项目的全称 -
description
:项目功能的描述 -
url
: 项目主页的URL
(代码仓库的地址) -
inceptionYear
:项目开始的年份,4位数字
,如2024
,此值在生成版权声明以及作为信息时使用 -
organization
:这个元素描述了项目所属组织的各种属性。在创建文档时使用这些属性(用于版权声明和链接) -
licenses/license*
:这个元素描述了项目的license
,如果项目没有license
,也可以不配置 -
developers/developer*
:这个元素描述了项目的开发者信息,如果项目没有开发者,也可以不配置 -
contributors/contributor*
:这个元素描述了项目的贡献者信息,如果项目没有贡献者,也可以不配置 -
mailingLists/mailingList*
:这个元素描述了项目的邮件列表信息,如果项目没有邮件列表,也可以不配置 -
prerequisites
:这个元素描述了项目构建和运行所需要的先决条件 -
modules/module*
:这个元素描述了项目包含的模块,如果项目没有模块,也可以不配置;通常在父工程中使用,编译父工程时,modules
中的子工程也会被编译- 使用举例
<modules> <module>daguo-dependencies</module> <module>daguo-framework</module> </modules>
- 使用举例
-
properties/key=value*
:这个元素描述了Maven构建过程中的常量,在POM
其他地方可以直接引用,如${project.version}
- 使用举例
<properties> <revision>2.0.0</revision> <!-- Maven 相关 --> <java.version>1.8</java.version> <maven.compiler.source>${java.version}</maven.compiler.source> </properties>
-
dependencyManagement和dependencies/dependency*
在单体项目中,引用项目直接使用
dependencies
标签就可以了;如果是一个大的项目,包含很多子模块,为了实现版本的统一和管理,通常使用dependencyManagement
dependencies
:自动引入声明在dependencies
里的所有依赖,并默认被所有的子项目继承。如果项目中不写依赖项,则会从父项目继承(属性全部继承)声明在父项目dependencies
里的依赖项
dependencyManagement
里只是声明依赖,并没有真正的引入(可以理解为只在父项目,外层来声明项目中要引入哪些jar
包),因此子项目需要显示的声明需要的依赖。如果不在子项目中声明依赖,是不会从父项目中继承的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version
和scope
都读取;
当子模块dependencies
中没有指定版本号时,父模块的dependencyManagement
对应的引用模块才会生效,如果子模块dependencies
中指定了版本号,则以子模块的为准。
build
、pluginManagement
、plugins
- 举例:
// 父POM
<build>
<pluginManagement>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>${xxxx}</mainClass>
</configuration>
</plugin>
</pluginManagement>
</build>
// 子POM
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</build>
build
构建项目所需要的信息,pluginmanagement
是插件的声明,即使在项目中的pluginManagement
下声明了插件,Maven
会加载该插件pluginManagement
声明可以被继承。pluginManagement
一般是用来在父POM
中定义,提供给子POM
使用,子POM
也可以覆盖这个定义,而且你在父POM
中定义了版本之后,子模块中直接应用groupId
和artifactId
,而不用指定版本,对于多个模块来说,可共享父POM
的定义,方便了统一管理;而在父POM
中的pluginManagement
并不会介入到Maven
的生命周期。pluginManagement
和dependencyManagement
一样的性质,只起到声明作用。
- 其他的标签请参考下文附录的官方文档查阅