pom.xml详解

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

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

什么是pom.xml文件

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

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

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

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

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

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

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

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

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!-- Maven 项目对象模型(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">

    <!-- POM文件的模型版本 -->
    <modelVersion>4.0.0</modelVersion>
    
    <!-- 项目坐标,包括组织ID,项目ID和版本 -->
    <groupId>com.example</groupId> <!-- 项目的组织或公司ID -->
    <artifactId>my-java-app</artifactId> <!-- 项目的唯一ID -->
    <version>1.0.0</version> <!-- 项目的版本号 -->
    <packaging>jar</packaging> <!-- 项目打包类型 -->
    <name>My Maven Project</name>       <!-- 项目的名称,可选 -->
    <!-- 项目的描述 -->
    <description>This is a sample Maven project.</description>
    <!-- 项目的URL,可选 -->
    <url>http://example.com/my-maven-project</url>
    <!-- 项目依赖声明部分 -->
    <dependencies>
        <!-- 对Spring框架核心模块的依赖 -->
        <dependency>
            <groupId>org.springframework</groupId> <!-- 依赖的组织或公司ID -->
            <artifactId>spring-core</artifactId> <!-- 依赖的唯一ID -->
            <version>5.2.6.RELEASE</version> <!-- 依赖的版本号 -->
        </dependency>
        <!-- 其他依赖可以在这里添加 -->
    </dependencies>
    
    <!-- 构建配置部分 -->
    <build>
        <plugins>
            <!-- Maven编译插件的配置 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId> <!-- 插件的组织或公司ID -->
                <artifactId>maven-compiler-plugin</artifactId> <!-- 插件的唯一ID -->
                <version>3.8.1</version> <!-- 插件的版本号 -->
                <configuration>
                    <source>1.8</source> <!-- Java源代码的兼容版本 -->
                    <target>1.8</target> <!-- Java目标代码的兼容版本 -->
                </configuration>
            </plugin>
            <!-- 其他构建插件可以在这里添加 -->
        </plugins>
    </build>
<!-- 构建配置 -->
    <build>
        <plugins>
            <!-- Maven插件配置示例 -->
            <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>
            <!-- 其他构建插件,如maven-surefire-plugin等 -->
        </plugins>

        <!-- 资源配置 -->
        <resources>
            <!-- 描述存放资源的目录,该路径相对POM路径 -->
            <resource>
                <directory>src/main/java</directory>
                <!-- 包含的模式列表,例如**/*.xml -->
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <!-- 是否使用参数值代替参数名 -->
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.*</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
    
    <!-- 仓库配置部分 -->
    <repositories>
        <!-- Maven中央仓库的配置 -->
        <repository>
            <id>central</id> <!-- 仓库的唯一ID -->
            <url>https://repo.maven.apache.org/maven2</url> <!-- 仓库的URL地址 -->
        </repository>
        <!-- 其他仓库可以在这里添加 -->
    </repositories>
</project>

接下来我会进行讲解

1.项目坐标

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

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

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

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

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

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

XML 复制代码
    <!-- 锁定SpringCloud和SpringCloud-alibaba的版本 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.7.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR12</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

父类对于子类会加上模版

XML 复制代码
    <modules>
        <module>cloud-模版1</module>
        <module>cloud-模版2</module>
        <module>cloud-模版3</module>
    </modules>

2.属性配置

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

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

XML 复制代码
     <hutool.version>5.0.6</hutool.version>
     <!--在hutool包版本加上${hutool.version}使用-->

3.依赖管理

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

排除依赖

依赖传递

依赖项的适用范围

XML 复制代码
<scope>test</scope>
XML 复制代码
<dependencies>
    <!-- 1. 默认范围是 compile -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.2.8.RELEASE</version>
    </dependency>

    <!-- 2. 通过 scope 指定 provided 范围 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>

    <!-- 3. runtime 范围 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>5.2.8.RELEASE</version>
        <scope>runtime</scope>
    </dependency>

    <!-- 4. test 范围,仅用于测试 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

解释如下

bash 复制代码
compile(默认值):

这是默认的范围。依赖项在编译、测试和运行阶段都可用
例如:<scope>compile</scope>

provided:
这个范围表明依赖项在编译和测试阶段可用,但在运行时由目标环境(例如 servlet 容器)提供
例如:<scope>provided</scope>

runtime:
依赖项在运行时是可用的,但在编译和测试阶段不是
例如:<scope>runtime</scope>

test:
这个范围表示依赖项仅在测试代码编译和执行测试时可用,不会包含在最终构建的产品中
例如:<scope>test</scope>

system:
这个范围类似于 provided,但需要显式提供 jar 文件的路径
例如:<scope>system</scope>

import:
这个范围仅适用于 <dependencyManagement> 部分的依赖项;它表示依赖项是由 dependencyManagement 部分的导入语句所引入的
例如:<scope>import</scope>

4.构建配置

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

5.插件配置

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

6.仓库配置

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

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

7.项目描述

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

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

相关推荐
JavaGuide37 分钟前
JDK 25(长期支持版) 发布,新特性解读!
java·后端
用户37215742613538 分钟前
Java 轻松批量替换 Word 文档文字内容
java
白鲸开源39 分钟前
教你数分钟内创建并运行一个 DolphinScheduler Workflow!
java
Java中文社群1 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心2 小时前
从零开始学Flink:数据源
java·大数据·后端·flink
间彧2 小时前
Spring Boot项目中如何自定义线程池
java
间彧2 小时前
Java线程池详解与实战指南
java
用户298698530142 小时前
Java 使用 Spire.PDF 将PDF文档转换为Word格式
java·后端
后端小张2 小时前
基于飞算AI的图书管理系统设计与实现
spring boot
zjjuejin2 小时前
Maven依赖管理艺术
后端·maven