首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SpringBoot Maven项目pom文件一级元素整理

最近在看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文件的元素太多了,再看下去就要淹没在这信息的海洋里了,赶紧打住。为用而看,不用不看!

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OWFwF2J4qmGfM-i7ubiTfIeA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券