最近在看pom文件,又发现了几个信息盲区:
1、一个独立的SpringBoot项目,它的pom文件结构是怎样的?
2、一个有子模块的SpringBoot项目,它的pom文件结构又是怎样的?
3、为什么有些依赖不需要在dependencyManagement中管理?
一、pom文件结构
POM(Project Object Model )从字面意思可以理解为:项目对象模型。Maven 的 POM 文件是一个 XML 文件,定义了 Maven 项目的结构和配置信息。
POM 文件树形目录结构图
├── 父类依赖parent
│ └── groupId...
├── 模块管理modules
│ └── module...
├── 项目信息
│ ├── groupId...
├── 属性定义properties
│ └── propertie...
├── 依赖管理dependencyManagement
│ └──dependencies ...
├── 项目依赖dependencies
│ └── dependency...
├── 仓库配置repositories
│ └── repository ...
└── 构建配置build
│ └── plugins...
├── 版本控制scm
│ └── url...
├──开发者信息developers
│ └── developer...
├──构建分布管理distributionManagement
│ └── repository...
├──构建环境配置profiles
│ └── profile...
...
从上面的树形结构图可以看出,POM 中的元素还是非常多的。项目信息、父类依赖、模块管理、属性定义、依赖管理、项目依赖、构建配置都是我们经常用到的,其他元素用得比较少。
二、重要元素说明
1、项目信息
modelVersion: POM模型的版本。目前使用的是4.0.0版本。
groupId: 项目组的标识符。
artifactId: 项目的标识符。
version: 项目的版本。
<groupId>, <artifactId>, <version>: 标识项目的基本坐标。
<packaging>: 定义项目的打包类型,如 jar, war, pom 等。
这五个元素是每一个maven项目必需的。
一般的父项目打包类型是pom文件。子项目打包类型为jar或war。
除了必须的元素,还有一些描述类的元素,比如name、description、url等。
2、父依赖
parent:定义父项目,用于继承配置。每一个SpringBoot项目都有一个父项目依赖。
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version> <!-- 请根据你的 Spring Boot 版本进行调整 -->
<relativePath/> <!-- lookup parent from repository -->
有了父依赖,在添加官方的starter时,就不需要显式指定 Spring Boot 的版本号。如下所示:
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-xxx</artifactId>
3、模块管理
modules:是在父项目的pom中管理子模块的。在创建父项目里创建子模块时一般会自动生成。有几个子模块,就有几个module。
4、依赖管理
dependencyManagement:用于统一管理跨多个项目的依赖版本。独立的项目无需此项,也没有必要。
如果是SpringBoot的官方依赖spring-boot-starter-xxx也无需在这里进行管理,它们已经被spring-boot-dependencies管理了,我们直接引用即可。
非官方的starter、第三方jar包和项目的子模块可以在这里进行管理,以供其他模块引用。
<dependencies>
<dependency>
<groupId>xxx.spring.boot</groupId>
<artifactId>xxx-spring-boot-starter</artifactId>
<version>...</version>
</dependency>
</dependencies>
在父类项目管理,子项目就可以简单地引用。
<dependency>
<groupId>xxx.spring.boot</groupId>
<artifactId>xxx-spring-boot-starter</artifactId>
</dependency>
5、属性管理
properties:自定义属性。
在管理依赖的时候,可以把依赖的版本号提取出来放在properties中集中管理。
在依赖管理中直接引用。
6、项目依赖
dependencies:列出项目所需的依赖。它是pom中比较重要的元素,不管是独立的项目,还是父子项目。
在父项目中,可以使用dependencies引入整个项目组都使用的jar包。在子项目中可以引入只有当前项目使用的jar包。
7、构建配置
build:构建部分,定义项目的构建设置,包括插件和资源。
如果项目的打包类型为pom,这个元素用不到。如果项目只供其他项目引用,不需要打包,这个元素也用不到。只针对打包成jar和war的项目有用。
比如说用maven的插件打包成jar包,名称为xxx。
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
<finalName>xxx</finalName><!-- jar包的名称,后缀为.jar-->
有时候因为项目的特殊性可能需要多个插件打包。
8、其他元素
profiles:用于设置不同环境下的项目配置。
distributionManagement:管理项目的发布配置,如仓库和站点。
scm:版本控制相关的信息,如 Git URL。
developers:项目参与者的信息。
repositories: 项目使用的仓库列表。
一级元素很多,看不完根本看不完。而且其他元素目前都没用到过,用到的时候再说吧。
三、pom文件结构
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 父依赖 -->
<parent>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<relativePath>...</relativePath>
</parent>
<!-- 子模块管理 -->
<modules>
<module>...</module>
<module>...</module>
<modules>
<!-- 项目基本坐标信息 -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<!-- 项目描述和URL -->
<name>...</name>
<description>...</description>
<url>...</url>
<!-- 属性 -->
<properties>
<property.name>...</property.name>
</properties>
<!-- 依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<scope>...</scope>
</dependency>
<!-- 更多管理的依赖 -->
</dependencies>
</dependencyManagement>
<!-- 项目依赖 -->
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<scope>...</scope>
</dependency>
<!-- 更多依赖 -->
</dependencies>
<!-- 构建配置 -->
<build>
<plugins>
<plugin>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<!-- 插件的配置 -->
</plugin>
<!-- 更多插件 -->
</plugins>
</build>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<!-- 版本控制 -->
<scm>
<url>...</url>
<connection>...</connection>
<developerConnection>...</developerConnection>
<tag>...</tag>
</scm>
<!-- 组织信息 -->
<organization>
<name>...</name>
<url>...</url>
</organization>
<!-- 许可证信息 -->
<licenses>
<license>
<name>...</name>
<url>...</url>
<distribution>...</distribution>
<comments>...</comments>
</license>
</licenses>
<!-- 开发者信息 -->
<developers>
<developer>
<id>...</id>
<name>...</name>
<email>...</email>
</developer>
<!-- 更多开发者 -->
</developers>
<!-- 构建分布管理 -->
<distributionManagement>
<repository>
<id>...</id>
<name>...</name>
<url>...</url>
</repository>
<snapshotRepository>
<id>...</id>
<name>...</name>
<url>...</url>
</snapshotRepository>
<site>
<id>...</id>
<url>...</url>
</site>
</distributionManagement>
<!-- 构建环境配置 -->
<profiles>
<profile>
<id>...</id>
<activation>
<activeByDefault>...</activeByDefault>
<os>
<name>...</name>
<family>...</family>
<arch>...</arch>
<version>...</version>
</os>
</activation>
<build>
<plugins>
<plugin>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
</plugin>
</plugins>
</build>
</profile>
</profiles>
四、最后总结
再回到最初的信息盲区:
1、一个独立的SpringBoot项目,它的pom文件结构是怎样的?
一个独立的SpringBoot项目,它的pom文件里有项目的基本信息、SpringBoot的父依赖、项目依赖和构建信息。
2、一个有子模块的SpringBoot父项目,它的pom文件结构又是怎样的?
一个有子模块的SpringBoot父项目,它的pom文件里有项目的基本信息、SpringBoot的父依赖、依赖管理、自定义属性、模块管理、公共依赖。
父项目下的子模块,它的pom文件里有项目的基本信息、父项目依赖、项目依赖和构建信息。
3、为什么有些依赖不需要在dependencyManagement中管理?
被spring-boot-dependencies管理的官方starter无需再添加到依赖管理里。被spring-cloud-xxx-dependencies管理的jar包也无需添加到依赖管理里。
有个小技巧,先引入某个jar包,如果不需要版本号,则无需添加到依赖管理里。如果需要版本号,而且没有被添加到依赖管理过,就有必要放到dependencyManagement里进行管理。
pom文件的元素太多了,再看下去就要淹没在这信息的海洋里了,赶紧打住。为用而看,不用不看!
领取专属 10元无门槛券
私享最新 技术干货