当前位置:   article > 正文

pom.xml详解

pom.xml

我们在开发Java应用程序时,pom.xml文件是项目中的核心配置文件之一,它结合Maven实现对项目依赖的拉取,今天就详细了解一下pom.xml文件的配置

Maven是一种构建工具,它用于构建、管理和发布Java项目pom.xml文件包含了项目的所有重要信息,包括项目的依赖、构建插件、版本信息等

什么是pom.xml文件

pom.xml文件是Maven项目的核心配置文件,它以XML格式编写。该文件的主要作用是定义项目的结构、依赖关系和构建过程。它包含了以下信息

  1. 项目坐标:pom.xml文件包含了项目的坐标信息,如groupId(组织或团队的标识符)、artifactId(项目的唯一标识符)和version(项目的版本号)
  2. 依赖管理:你可以在pom.xml中定义项目所依赖的外部库和组件;Maven会根据这些依赖关系自动下载所需的JAR文件,并将它们包括在项目的构建中
  3. 构建配置:pom.xml文件包含了构建插件的配置信息,这些插件用于编译、测试、打包和部署项目;你可以定义构建生命周期阶段和目标,以定制项目的构建过程
  4. 插件配置:除了构建插件,pom.xml还可以包含其他插件的配置信息,例如静态代码分析、代码生成和文档生成插件
  5. 仓库配置:你可以指定Maven仓库的位置,以便Maven能够从仓库中下载依赖项
  6. 项目描述:pom.xml文件通常包含有关项目的描述信息,以便其他开发人员了解项目的用途和功能

pom.xml的大致文件结构如下

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Maven 项目对象模型(POM) 文件的根元素 -->
  3. <project xmlns="http://maven.apache.org/POM/4.0.0"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <!-- POM文件的模型版本 -->
  7. <modelVersion>4.0.0</modelVersion>
  8. <!-- 项目坐标,包括组织ID,项目ID和版本 -->
  9. <groupId>com.example</groupId> <!-- 项目的组织或公司ID -->
  10. <artifactId>my-java-app</artifactId> <!-- 项目的唯一ID -->
  11. <version>1.0.0</version> <!-- 项目的版本号 -->
  12. <packaging>jar</packaging> <!-- 项目打包类型 -->
  13. <name>My Maven Project</name> <!-- 项目的名称,可选 -->
  14. <!-- 项目的描述 -->
  15. <description>This is a sample Maven project.</description>
  16. <!-- 项目的URL,可选 -->
  17. <url>http://example.com/my-maven-project</url>
  18. <!-- 项目依赖声明部分 -->
  19. <dependencies>
  20. <!-- 对Spring框架核心模块的依赖 -->
  21. <dependency>
  22. <groupId>org.springframework</groupId> <!-- 依赖的组织或公司ID -->
  23. <artifactId>spring-core</artifactId> <!-- 依赖的唯一ID -->
  24. <version>5.2.6.RELEASE</version> <!-- 依赖的版本号 -->
  25. </dependency>
  26. <!-- 其他依赖可以在这里添加 -->
  27. </dependencies>
  28. <!-- 构建配置部分 -->
  29. <build>
  30. <plugins>
  31. <!-- Maven编译插件的配置 -->
  32. <plugin>
  33. <groupId>org.apache.maven.plugins</groupId> <!-- 插件的组织或公司ID -->
  34. <artifactId>maven-compiler-plugin</artifactId> <!-- 插件的唯一ID -->
  35. <version>3.8.1</version> <!-- 插件的版本号 -->
  36. <configuration>
  37. <source>1.8</source> <!-- Java源代码的兼容版本 -->
  38. <target>1.8</target> <!-- Java目标代码的兼容版本 -->
  39. </configuration>
  40. </plugin>
  41. <!-- 其他构建插件可以在这里添加 -->
  42. </plugins>
  43. </build>
  44. <!-- 构建配置 -->
  45. <build>
  46. <plugins>
  47. <!-- Maven插件配置示例 -->
  48. <plugin>
  49. <groupId>org.apache.maven.plugins</groupId>
  50. <artifactId>maven-compiler-plugin</artifactId>
  51. <version>3.8.1</version>
  52. <configuration>
  53. <source>1.8</source>
  54. <target>1.8</target>
  55. </configuration>
  56. </plugin>
  57. <!-- 其他构建插件,如maven-surefire-plugin等 -->
  58. </plugins>
  59. <!-- 资源配置 -->
  60. <resources>
  61. <!-- 描述存放资源的目录,该路径相对POM路径 -->
  62. <resource>
  63. <directory>src/main/java</directory>
  64. <!-- 包含的模式列表,例如**/*.xml -->
  65. <includes>
  66. <include>**/*.xml</include>
  67. </includes>
  68. <!-- 是否使用参数值代替参数名 -->
  69. <filtering>false</filtering>
  70. </resource>
  71. <resource>
  72. <directory>src/main/resources</directory>
  73. <includes>
  74. <include>**/*.*</include>
  75. </includes>
  76. <filtering>false</filtering>
  77. </resource>
  78. </resources>
  79. </build>
  80. <!-- 仓库配置部分 -->
  81. <repositories>
  82. <!-- Maven中央仓库的配置 -->
  83. <repository>
  84. <id>central</id> <!-- 仓库的唯一ID -->
  85. <url>https://repo.maven.apache.org/maven2</url> <!-- 仓库的URL地址 -->
  86. </repository>
  87. <!-- 其他仓库可以在这里添加 -->
  88. </repositories>
  89. </project>

接下来我会进行讲解

1.项目坐标

项目坐标:pom.xml文件包含了项目的坐标信息,如groupId(组织或团队的标识符)、artifactId(项目的唯一标识符)和version(项目的版本号)

cf5d890d53854ba8885c6277ca516cbe.png

这是简单的项目坐标,当然有的还有父类和子类继承关系

1e97f2b3123e46fd999ed8f2bc478810.png

如下,这样的话父类所有的数据都会进入子类(比如所有加的第三方依赖)

有父类的话子类在<parent>一般加上<relativePath/> 这个注解

在这个示例中,子类<relativePath/> 元素的值留空,表示Maven将查找父项目的POM文件,而不需要额外的路径,这样可以避免去Maven仓库查找

3d93e9e65037412f968fcefcb2593290.png

有些使用版本也是父类锁定的,比如微服务

  1. <!-- 锁定SpringCloud和SpringCloud-alibaba的版本 -->
  2. <dependencyManagement>
  3. <dependencies>
  4. <dependency>
  5. <groupId>com.alibaba.cloud</groupId>
  6. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  7. <version>2.2.7.RELEASE</version>
  8. <type>pom</type>
  9. <scope>import</scope>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.cloud</groupId>
  13. <artifactId>spring-cloud-dependencies</artifactId>
  14. <version>Hoxton.SR12</version>
  15. <type>pom</type>
  16. <scope>import</scope>
  17. </dependency>
  18. </dependencies>
  19. </dependencyManagement>

父类对于子类会加上模版

  1. <modules>
  2. <module>cloud-模版1</module>
  3. <module>cloud-模版2</module>
  4. <module>cloud-模版3</module>
  5. </modules>

2.属性配置

<properties> 元素是一个容器,其中包含定义的属性;在这个元素内部,你可以定义各种属性,每个属性都有一个名称和一个对应的值

56e10b722bd04bbab53cea0b8444ad9b.png

也可以使用自定义属性赋值

  1. <hutool.version>5.0.6</hutool.version>
  2. <!--在hutool包版本加上${hutool.version}使用-->

3.依赖管理

依赖管理:你可以在pom.xml中定义项目所依赖的外部库和组件;Maven会根据这些依赖关系自动下载所需的JAR文件,并将它们包括在项目的构建中

6cd215319b404461bdd9caf5419ff420.png

排除依赖

7d6152a7af3d4bdda7411c56176efc07.png

依赖传递

aa85eb9069804f19b64fcf359f1bd5e2.png

依赖项的适用范围

<scope>test</scope>
  1. <dependencies>
  2. <!-- 1. 默认范围是 compile -->
  3. <dependency>
  4. <groupId>org.springframework</groupId>
  5. <artifactId>spring-core</artifactId>
  6. <version>5.2.8.RELEASE</version>
  7. </dependency>
  8. <!-- 2. 通过 scope 指定 provided 范围 -->
  9. <dependency>
  10. <groupId>javax.servlet</groupId>
  11. <artifactId>javax.servlet-api</artifactId>
  12. <version>3.1.0</version>
  13. <scope>provided</scope>
  14. </dependency>
  15. <!-- 3. runtime 范围 -->
  16. <dependency>
  17. <groupId>org.springframework</groupId>
  18. <artifactId>spring-web</artifactId>
  19. <version>5.2.8.RELEASE</version>
  20. <scope>runtime</scope>
  21. </dependency>
  22. <!-- 4. test 范围,仅用于测试 -->
  23. <dependency>
  24. <groupId>junit</groupId>
  25. <artifactId>junit</artifactId>
  26. <version>4.12</version>
  27. <scope>test</scope>
  28. </dependency>
  29. </dependencies>

解释如下

  1. compile(默认值):
  2. 这是默认的范围。依赖项在编译、测试和运行阶段都可用
  3. 例如:<scope>compile</scope>
  4. provided:
  5. 这个范围表明依赖项在编译和测试阶段可用,但在运行时由目标环境(例如 servlet 容器)提供
  6. 例如:<scope>provided</scope>
  7. runtime:
  8. 依赖项在运行时是可用的,但在编译和测试阶段不是
  9. 例如:<scope>runtime</scope>
  10. test:
  11. 这个范围表示依赖项仅在测试代码编译和执行测试时可用,不会包含在最终构建的产品中
  12. 例如:<scope>test</scope>
  13. system:
  14. 这个范围类似于 provided,但需要显式提供 jar 文件的路径
  15. 例如:<scope>system</scope>
  16. import:
  17. 这个范围仅适用于 <dependencyManagement> 部分的依赖项;它表示依赖项是由 dependencyManagement 部分的导入语句所引入的
  18. 例如:<scope>import</scope>

4.构建配置

pom.xml文件包含了构建插件的配置信息,这些插件用于编译、测试、打包和部署项目;你可以定义构建生命周期阶段和目标,以定制项目的构建过程

57e2f9a31c174300973b9785b577bcab.png

5.插件配置

除了构建插件,pom.xml还可以包含其他插件的配置信息,例如静态代码分析、代码生成和文档生成插件

cfc58f75e5a74e9eb29c1133dcf15134.png

6.仓库配置

你可以指定Maven仓库的位置,以便Maven能够从仓库中下载依赖项

6a2f8d61a3ff4ff884e16bb9f520318a.png

也可以使用nexus 私服Nexus搭建以及拉取上传依赖_大白猫~的博客-CSDN博客

7.项目描述

pom.xml文件通常包含有关项目的描述信息,以便其他开发人员了解项目的用途和功能

cd72262c9722482fbdb662728aba57ec.png

在 Spring Cloud 项目中,通常会为多个服务定义一个共同的父项目,这个父项目包含了所有子项目共有的依赖和插件配置,这样做的好处是能够统一管理依赖版本和构建配置,确保所有子项目的一致性

  1. 创建一个父项目(例如命名为 spring-cloud-parent),并在其 pom.xml 文件中定义所有子项目共有的依赖和插件配置。
    1. <project>
    2. <groupId>com.example</groupId>
    3. <artifactId>spring-cloud-parent</artifactId>
    4. <version>1.0.0-SNAPSHOT</version>
    5. <packaging>pom</packaging>
    6. <!-- 定义父项目中的依赖,这里仅示例,具体根据项目需求添加 -->
    7. <dependencies>
    8. <dependency>
    9. <groupId>org.springframework.boot</groupId>
    10. <artifactId>spring-boot-starter-parent</artifactId>
    11. <version>2.7.0</version>
    12. <type>pom</type>
    13. <scope>import</scope>
    14. </dependency>
    15. <dependency>
    16. <groupId>org.springframework.cloud</groupId>
    17. <artifactId>spring-cloud-dependencies</artifactId>
    18. <version>2021.0.3</version>
    19. <type>pom</type>
    20. <scope>import</scope>
    21. </dependency>
    22. <!-- 其他共享依赖 -->
    23. </dependencies>
    24. <!-- 定义插件配置,例如 spring-boot-maven-plugin -->
    25. <build>
    26. <plugins>
    27. <plugin>
    28. <groupId>org.springframework.boot</groupId>
    29. <artifactId>spring-boot-maven-plugin</artifactId>
    30. <executions>
    31. <execution>
    32. <goals>
    33. <goal>repackage</goal>
    34. </goals>
    35. </execution>
    36. </executions>
    37. </plugin>
    38. </plugins>
    39. </build>
    40. </project>

    在每个服务(服务1、服务2和服务3)的 pom.xml 文件中,将父项目设置为它们的父 POM

    1. <!-- 服务1的pom.xml -->
    2. <project>
    3. <parent>
    4. <groupId>com.example</groupId>
    5. <artifactId>spring-cloud-parent</artifactId>
    6. <version>1.0.0-SNAPSHOT</version>
    7. </parent>
    8. <modelVersion>4.0.0</modelVersion>
    9. <groupId>com.example</groupId>
    10. <artifactId>service1</artifactId>
    11. <version>1.0.0-SNAPSHOT</version>
    12. <!-- 服务1特有的依赖和配置 -->
    13. </project>
    14. <!-- 服务2和服务3的pom.xml结构类似,只需修改<artifactId> -->

    当你构建每个服务时,Maven 会自动继承父项目的配置。这意味着每个服务打包时会包含父项目中定义的依赖,但不会重复包含相同的依赖。这样,每个服务的打包结果都是一个独立的可执行 jar,包含了它们特有的代码和依赖,以及从父项目中继承的共享依赖

这样子简单的pom.xml结构就讲完了 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/883614
推荐阅读
相关标签
  

闽ICP备14008679号