java
主页 > 软件编程 > java >

基于Maven pom文件使用分析

2024-12-14 | 佚名 | 点击:

project

Maven 是一个强大的构建和依赖管理工具,pom.xml 文件是 Maven 项目的核心配置文件,用于定义项目的构建、依赖关系、插件、目标等。它是 Maven 构建过程的基础,所有的构建配置都需要在该文件中进行定义。

project元素代表整个Maven项目,是POM文件中最外层的元素。

一个完整的 pom.xml 文件大致包括以下几个部分:

子元素分类

项目基础信息

元素名称 描述
parent 指定父POM文件的坐标,继承父项目的配置
modelVersion POM模型的版本,通常为4.0.0
groupId 唯一标识项目的组织或公司名称
artifactId 唯一标识项目的模块名
name 项目的名称
version 项目的版本号
packaging 项目的打包类型,如jar、war、pom等
description 项目的简短描述
url 项目主页的URL地址
inceptionYear 项目开始年份
- parent

parent元素用于定义当前项目的父项目信息,即当前项目所在的模块继承自哪个模块。可被继承的信息包括但不限于:dependencies、plugins、build、reporting等。常用于项目中许多模块都存在共性配置的情况。

通过parent元素从父级POM文件继承属性,可以使子模块重用父级组件中定义的配置和元素等,同时方便子模块修改和覆盖继承的内容。

Maven先查找本地仓库,然后去中央仓库下载指定的父级artifactId和groupId的POM文件,通过继承父POM文件,可以避免在子模块中重复定义相同的属性。

属性:

继承父级的限制:

示例:

1

2

3

4

5

6

<parent>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>2.6.3</version>

    <relativePath/>

</parent>

- modelVersion

modelVersion元素指定当前POM文件的版本号,用于标识当前POM使用的Maven模型版本。如果该元素未被显式定义,并且当前POM文件是基于4.0.0或更高版本创建的,那么它将默认采用4.0.0版本。

modelVersion只能使用Maven支持的版本号。一旦确定了版本号,就应该始终使用相同的版本号,除非你有很好的理由来升级它。另外,如果你想要向后兼容其他版本的POM文件,可以保留旧版本并添加新属性,而不是更新现有元素。

示例:

1

<modelVersion>4.0.0</modelVersion>

- groupId

groupId 元素定义了该项目所属组织或公司的唯一标识符。它是 Maven 项目的全局唯一 ID,用于在仓库中标识项目和依赖项。

通常情况下,groupId 建议以组织或公司的域名倒置为前缀,这样做可避免命名空间冲突。

示例:

1

<groupId>org.xxok.boot</groupId>

- artifactId

artifactId 元素是指当前Maven项目的唯一标识符,用于表示当前构建的项目。

artifactId 元素同样可以让其他依赖引用到它作为依赖的项目POM文件中。

假如项目B需要依赖A项目的jar包,则需要配置A项目的坐标(groupId、artifactId、version),Maven 就会检索并下载 A 项目的 jar 包来满足 B 项目的依赖关系。

示例:

1

<artifactId>my-project</artifactId>

- name

name元素定义项目名称。该元素是一个可选项,但强烈建议在每个POM中都使用它来描述当前项目,以便更容易地理解和识别项目的作用。在Maven生命周期、插件等其他各个地方,也会经常使用到该属性。

需要注意的是,在IDE或其他Maven工具中使用时,name元素可以帮助用户识别并区分不同的模块,以及帮助用户快速找到文档或其他相关信息。

示例:

1

<name>My App Name</name>

- version

version元素表示当前项目的版本号,它用于唯一标识项目和管理依赖项。

在Maven中,通常存在三种类型的版本号:

version元素可以定义在以下几个位置:

示例:

1

<version>1.0-SNAPSHOT</version>

- packaging

packaging元素指定了项目打包的类型。

packaging的可选值:

Maven将按照packaging元素指定的类型对项目进行打包,并将输出内容保存到目标目录中(默认为target目录)。

- description

description元素用于描述该项目的简短说明。description元素并不影响项目的构建和部署过程,只是作为一个文本描述的附加信息存在。

通常情况下,description元素紧随groupId、artifactId和version元素之后,位于pom.xml文件的顶部。

示例:

1

<description>This project description</description>

- url

url元素用于指定项目的URL地址。 该元素通常用于指定项目主页、文档位置或者源代码仓库的地址等。

示例:

1

<url>https://github.com/username/projectname</url>

- inceptionYear

inceptionYear元素代表了项目的创建年份。

示例:

1

<inceptionYear>2010</inceptionYear>

组织与许可信息

元素名称 描述
organization 项目的组织信息,如公司或开发者团队
licenses 项目所使用的开源许可证信息
developers 项目开发人员的列表
contributors 提供贡献但未参与开发的人员列表
mailingLists 项目的邮件讨论列表
- organization

organization元素代表了项目所属的组织信息。

这个元素是可选的,主要用作标识项目所属机构的相关信息,例如组织名称、组织URL等。如果指定了organization元素,Maven会使用该信息生成默认的开发者和组织元素。

示例:

1

2

3

4

<organization>

    <name>ACME Corporation</name>

    <url>http://www.acme.com</url>

</organization>

- licenses

licenses元素用于指定项目相关的许可证信息。

该元素通常包含多个license元素,每个license元素对应一个许可证信息。

示例:

1

2

3

4

5

6

7

8

<licenses>

    <license>

      <name>The Apache Software License, Version 2.0</name>

      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>

      <distribution>repo</distribution>

    </license>

    ...

</licenses>

- developers

developers元素用于列出项目的开发者和其联系方式。

通常情况下,developers元素紧随description元素之后,位于pom.xml文件的顶部。developers元素提供的信息不会直接影响项目的构建和部署过程,只是作为一个文本描述的附加信息存在。

示例:

1

2

3

4

5

6

7

8

9

10

11

12

<developers>

  <developer>

    <id>john_doe</id>

    <name>John Doe</name>

    <email>john.doe@example.com</email>

  </developer>

  <developer>

    <id>jane_doe</id>

    <name>Jane Doe</name>

    <email>jane.doe@example.com</email>

  </developer>

</developers>

- contributors

contributors元素可以用来列举该项目的贡献者列表。元素可以包含多个contributor元素。

每个contributor元素应该至少包含name元素用于指定贡献者的姓名或昵称,可选地,还可以包含email、url和organization等子元素以提供更详细的贡献者信息。

示例:

1

2

3

4

5

6

7

8

9

10

11

12

<contributors>

    <contributor>

      <name>John Doe</name>

      <email>johndoe@example.com</email>

      <url>http://example.com</url>

      <organization>Acme Organization</organization>

      <organizationUrl>http://acme.org</organizationUrl>

    </contributor>

    <contributor>

      <name>Jane Smith</name>

    </contributor>

  </contributors>

- mailingLists

mailingLists元素用于指定项目相关的邮件列表信息。该元素通常包含多个mailingList元素,每个mailingList元素对应一个邮件列表信息。

通常情况下,mailingLists元素紧随developers元素之后,位于pom.xml文件的顶部。mailingLists元素提供的信息不会直接影响项目的构建和部署过程,只是作为一个文本描述的附加信息存在。

示例:

1

2

3

4

5

6

7

8

9

<mailingLists>

  <mailingList>

    <name>Developers List</name>

    <subscribe>dev-subscribe@example.com</subscribe>

    <unsubscribe>dev-unsubscribe@example.com</unsubscribe>

    <post>dev-post@example.com</post>

    <archive>http://example.com/mailman/private/dev-list/</archive>

  </mailingList>

</mailingLists>

自定义属性信息

元素名称 描述
properties 定义项目使用的自定义属性,供整个项目使用
- properties

properties元素用于定义一些可以在该POM及其子项目中重复引用的常量值。该元素通常包含各种 key-value对,其中key代表属性的名称,value代表属性所表示的常量值。

需要注意的是,properties元素的定义仅仅是对属性进行了声明或赋值,并没有定义这些属性具体用于什么目的。确切的属性用途,要依据实际情况而定。

示例:

1

2

3

<properties>

  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

</properties>

除此之外,Maven还有很多内置的属性。

Maven内置属性:

属性名 描述
${project.version} 当前项目的版本号
${project.groupId} 当前项目的组 ID
${project.artifactId} 当前项目的 artifactId
${project.name} 当前项目的名称
${project.description} 当前项目的描述
${project.url} 当前项目的网址(主页)
${project.build.directory} 构建输出目录,默认是 target
${project.build.outputDirectory} 编译后的 .class 文件输出目录
${project.build.finalName} 构建后生成的最终文件名(通常是 <artifactId>-<version>)
${project.build.sourceDirectory} 源代码目录,默认是 src/main/java
${project.build.testSourceDirectory} 测试代码目录,默认是 src/test/java
${maven.version} 当前使用的 Maven 版本号
${maven.home} Maven 的安装目录
${basedir} 项目的根目录路径,通常与 pom.xml 文件所在目录相同
${user.home} 当前用户的主目录路径
${env.<variable>} 获取系统环境变量的值,例如 ${env.PATH} 获取 PATH 环境变量
${project.build.plugins} 当前项目的构建插件
${project.build.pluginManagement} 项目中插件管理部分
${session} 当前 Maven 构建会话对象
${settings.localRepository} 本地 Maven 仓库的路径
${settings.userSettingsFile} 用户的 Maven 配置文件路径(~/.m2/settings.xml)
${settings.globalSettingsFile} 全局 Maven 配置文件路径
${project.basedir} 项目的根目录路径
${project.compileSourceRoots} 编译源文件的根目录列表
${project.testCompileSourceRoots} 测试源文件的根目录列表
${project.testOutputDirectory} 测试编译输出目录
${project.reporting.outputDirectory} 项目报告输出目录(默认 target/site)
${build.timestamp} 构建时间戳,表示构建时间(如 yyyyMMdd-HHmm 格式)
${project.reporting.pluginGroups} 报告插件的组 ID
${project.build.extensions} 项目的构建扩展
${project.distModule} 项目的分发模块信息
${project.testPlugin} 项目的测试插件信息
${project.version} 当前项目的版本号
${project.artifactId} 当前项目的 artifactId
${project.parent.version} 父项目的版本号(如果存在父项目的话)
${project.parent.groupId} 父项目的 Group ID
${project.parent.artifactId} 父项目的 Artifact ID
${project.parent.relativePath} 父项目的 pom.xml 相对路径

模块配置

元素名称 描述
modules 列出项目包含的子模块列表
- modules

modules元素用于指定一个多模块项目的子模块列表。可以包含多个module元素。

每个module元素应该只包含一个子元素:一个目录名或相对路径(默认相对于父项目的pom.xml文件)。当使用mvn命令执行某个多模块项目时,Maven会根据modules元素列出的子模块进行构建。

示例:

1

2

3

4

5

<modules>

    <module>module-a</module>

    <module>module-b</module>

    <module>module-c</module>

  </modules>

项目依赖配置

元素名称 描述
dependencyManagement 统一管理项目依赖版本,避免版本冲突
dependencies 项目运行所需的外部依赖库
- dependencyManagement

dependencyManagement元素提供了一种集中式管理依赖项版本号的机制。该元素包含各种子元素,用于指定项目使用的各种依赖项及其版本。

示例:

1

2

3

4

5

6

7

8

9

10

11

<dependencyManagement>

  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.13.1</version>

      <scope>test</scope>

    </dependency>

    <!-- ... -->

  </dependencies>

</dependencyManagement>

需要注意的是,dependencyManagement元素中的依赖项声明并没有直接使用在项目中,他只是定义了版本和相关配置信息,以供项目的其他模块继承使用。

- dependencies

dependencies元素用于列出项目所依赖的外部库,也就是所谓的“依赖项”。该元素可以包含多个dependency元素。

dependency元素:

dependency的子元素:

示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

<dependencies>

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-core</artifactId>

      <version>5.2.9.RELEASE</version>

    </dependency>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.13.1</version>

      <scope>test</scope>

    </dependency>

  </dependencies>

Maven依赖仓库信息

元素名称 描述
repositories 定义项目依赖的Maven仓库
- repositories

repositories元素用于定义该项目依赖库(dependency)从哪里下载,以及下载顺序。该元素主要包含了一组子元素,用于指定各种资源库。该元素可以包含多个repository元素。

repository元素:

repository元素用于指定Maven项目的远程仓库信息。repository元素应该至少包含一个id、name和url子元素。

多数情况下,Maven会自动下载所需的依赖项,因为它能够从本地仓库中找到这些依赖项。当然,如果某个依赖项需要从远程仓库下载,那么就需要先配置好这些仓库。

示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<repositories>

  <repository>

    <id>central</id>

    <url>https://repo1.maven.org/maven2/</url>

  </repository>

  <repository>

    <id>jboss</id>

    <name>JBoss Repository</name>

    <url>https://repository.jboss.org/nexus/content/groups/public/</url>

  </repository>

  <repository>

    <id>snapshots</id>

    <name>Maven Snapshots</name>

    <url>https://oss.sonatype.org/content/repositories/snapshots/</url>

    <releases>

      <enabled>false</enabled>

    </releases>

    <snapshots>

      <enabled>true</enabled>

    </snapshots>

  </repository>

</repositories>

使用maven中央仓库作为主要软件库,并添加了其他两个外部仓库

需要注意的是,不必在每个pom.xml文件中都重新定义库。实际上你可以在Maven settings.xml文件中定义多个公共库(central、jcenter等), 项目会继承这些已定义的库。

Maven插件仓库信息

元素名称 描述
pluginRepositories 定义Maven插件的仓库
- pluginRepositories

pluginRepositories元素用于定义该项目使用到的插件库(plugins)从哪里下载以及下载顺序。

和repositories元素非常相似,pluginRepositories主要包含了一组子元素,用于指定各种插件资源库。该元素可以包含多个pluginRepository元素。

pluginRepository元素:

pluginRepository元素与repository 元素中的功能类似,pluginRepository 元素用于指定Maven插件库的位置。pluginRepository 元素可以包含以下子元素:

示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<pluginRepositories>

  <pluginRepository>

    <id>central</id>

    <url>https://repo1.maven.org/maven2/</url>

  </pluginRepository>

  <pluginRepository>

    <id>jboss</id>

    <name>JBoss Repository</name>

    <url>https://repository.jboss.org/nexus/content/groups/public/</url>

  </pluginRepository>

  <pluginRepository>

    <id>snapshots</id>

    <name>Maven Snapshots</name>

    <url>https://oss.sonatype.org/content/repositories/snapshots/</url>

    <releases>

      <enabled>false</enabled>

    </releases>

    <snapshots>

      <enabled>true</enabled>

    </snapshots>

  </pluginRepository>

</pluginRepositories>

使用maven中央仓库作为主要插件库,并添加了外部插件库

需要注意的是,同样地,不必在每个pom.xml文件中都需要重新定义插件库。你可以在Maven settings.xml文件中定义多个公共库(central、jcenter等), 项目会继承这些已定义的库。

构建配置

元素名称 描述
build 定义项目的构建过程,包括插件和生命周期
- build

build元素用于配置一个项目的构建选项,主要包括了项目所依赖的插件、资源文件等构建相关信息。可以包含多个子元素,如plugins、resources等。

元素 描述 默认值
sourceDirectory 指定 Java 源代码的目录。 src/main/java
scriptSourceDirectory 指定脚本文件(如 Groovy)源代码的目录。  
testSourceDirectory 指定测试源代码的目录。 src/test/java
outputDirectory 指定编译后的 .class 文件的输出目录。 target/classes
testOutputDirectory 指定测试编译后的 .class 文件的输出目录。 target/test-classes
finalName 指定最终构建文件的名称(不带扩展名)。 ${project.artifactId}-${project.version}
resources 指定资源文件目录,资源文件会被复制到构建输出目录。  
plugins 配置构建插件,用于处理具体的构建任务。  
pluginManagement 集中管理插件的版本和配置。插件配置在此元素下不会直接生效,需在 plugins 元素中引用。  
extensions 指定 Maven 构建过程中的扩展(如插件扩展)。  
pluginRepositories 指定插件仓库的位置。  
directory 为 Maven 指定其他目录,如编译文件夹、测试文件夹等。  

示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<build>

    <plugins>

      <plugin>

        <groupId>org.apache.maven.plugins</groupId>

        <artifactId>maven-compiler-plugin</artifactId>

        <version>3.8.1</version>

        <configuration>

          <source>1.8</source>

          <target>1.8</target>

        </configuration>

      </plugin>

      <plugin>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-maven-plugin</artifactId>

      </plugin>

    </plugins>

    <resources>

      <resource>

        <directory>src/main/resources</directory>

        <includes>

          <include>**/*.properties</include>

          <include>**/*.xml</include>

        </includes>

      </resource>

    </resources>

  </build>

版本控制信息

元素名称 描述
scm 配置源代码管理系统(如Git、SVN)的信息
- scm

scm元素用于定义一个项目的源代码管理(SCM)信息,以便Maven可以从这个仓库中检索和构建代码。

一个完整的scm元素至少应该包括两个必需的子元素:connection和developerConnection,它们分别表示开发者与版本控制库之间的连接方式。另外,还可以使用url、tag、branch等其他子元素进一步指定SCM信息。

scm子元素:

SCM的用途:

示例:

1

2

3

4

5

6

<scm>

  <connection>scm:git:git://github.com/user/repo.git</connection>

  <developerConnection>scm:git:ssh://github.com/user/repo.git</developerConnection>

  <url>https://github.com/user/repo/tree/master</url>

  <tag>1.0.0</tag>

</scm>

上述代码中,定义了一个基于Git的源代码管理信息。

其中,connection元素通过https协议指定了与代码库的连接方式,而developerConnection元素则通过ssh协议进行连接。除此之外,还指定了代码库的URL(即主页地址)以及打标签时使用的默认tag。

分发信息

元素名称 描述
distributionManagement 配置项目的分发方式,如发布到Maven仓库或其他服务
- distributionManagement

示例:

1

2

3

4

5

6

7

<distributionManagement>

  <repository>

    <id>internal.repo</id>

    <name>Internal Repository</name>

    <url>file:///usr/local/repo</url>

  </repository>

</distributionManagement>

在上面的示例中,我们声明了一个名为"Internal Repository"的仓库,其地址为本地文件系统上的/usr/local/repo目录。

一旦定义了这个仓库之后,可以使用命令 mvn deploy 将此存储库作为项目的部署目标,在构建过程中上传并部署项目至该存储库。

报告配置

元素名称 描述
reporting 配置如何生成项目报告,如代码质量报告、测试报告等
- reporting

reporting元素用于为项目生成一些报告,例如代码覆盖率、静态代码分析结果等。该元素可以包含各种子元素,来配置需要生成哪些报告,以及如何生成这些报告。

reporting元素只是用于配置Maven生成报告的相关信息,它不影响项目的编译和构建过程,并且生成的报告通常是基于已经构建好的代码来进行分析处理的。

示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<reporting>

  <plugins>

    <plugin>

      <groupId>org.jacoco</groupId>

      <artifactId>jacoco-maven-plugin</artifactId>

      <version>0.8.6</version>

    </plugin>

    <plugin>

      <groupId>org.sonarsource.scanner.maven</groupId>

      <artifactId>sonar-maven-plugin</artifactId>

      <version>3.9.0.2155</version>

    </plugin>

    <!-- ... -->

  </plugins>

</reporting>

在上面的示例中,我们定义了两个插件,分别是Jacoco和SonarQube。通过使用这些插件,Maven可以生成有关代码覆盖率、静态代码分析的报告。其他可供选择的报告插件包括FindBugs、Checkstyle、Javadoc等。

环境配置

元素名称 描述
profiles 定义不同构建环境下的配置文件,可根据需求启用不同的构建配置
- profiles

profiles元素用于定义一个或多个构建“配置”(profile),这些配置与通常的构建选项不同,能够根据不同的环境、需求等情况进行灵活地管理不同构建环境下的项目配置和依赖项。

profile

一个profile元素可以包含多个子元素,如id、activation、properties、dependencies等,每个子元素又可以包含具体的配置信息。

在POM文件中定义了Profile元素之后,可以根据所需的构建环境激活或禁用它们。

要激活Profile元素,可以使用命令行选项、环境变量或其他Maven插件来指定所需的Profile。例如,使用“-P production”命令可以激活包含“production”Profile的POM文件。

示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<profiles>

    <profile>

      <id>development</id>

      <activation>

        <activeByDefault>true</activeByDefault>

      </activation>

      <properties>

        <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>

      </properties>

      <dependencies>

        <dependency>

          <groupId>mysql</groupId>

          <artifactId>mysql-connector-java</artifactId>

          <version>8.0.23</version>

        </dependency>

      </dependencies>

    </profile>

  </profiles>

上述代码中,定义了一个名为development的构建配置,启动该配置的条件为默认激活(activeByDefault)。该配置使用MySQL驱动程序作为依赖项,并设置了jdbc.driverClassName属性值,以便在开发环境中使用正确的数据库连接驱动。

原文链接:
相关文章
最新更新