赞
踩
Maven是一个跨平台的项目管理工具,主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。通过其项目对象模型(POM),可以自动下载和管理项目所需的库和插件。
以上的pom.xml 包含了在开发中常用的标签与功能。
- <?xml version="1.0" encoding="UTF-8"?>
- <!---->
- <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>
-
- <!--被继承的父项目,注意,如果没有显示标注父项目,那么其默认会继承Maven内置的一个POM(称为Super POM)-->
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>3.2.4</version>
- </parent>
-
- <!--项目信息:组织ID、构建ID、版本号、项目名称-->
- <groupId>com.huangmingfu</groupId>
- <artifactId>mvn_4</artifactId>
- <version>0.1-SNAPSHOT</version>
- <name>mvn_4</name>
-
- <!--项目的打包方式,决定了项目构建的输出类型。常见的有:jar、war、pom、rar、maven-plugin、bundle等-->
- <packaging>jar</packaging>
-
- <!--定义属性,可以在pom中使用,也可以在pom包含的资源文件中使用-->
- <properties>
- <pom.directory>project-resources</pom.directory>
- <pom.info>pom中的描述</pom.info>
- </properties>
-
- <!--构建项目需要的信息-->
- <build>
- <!--被编译过的应用输出目录(不是生成的jar文件所在的目录,该目录由对应的插件配置来指定)-->
- <outputDirectory>./customTarget</outputDirectory>
- <!--构建产生的所有文件存放的目录 -->
- <directory>./customTarget</directory>
- <!--产生的构件的文件名,默认值是${artifactId}-${version}。 -->
- <finalName>生成文件</finalName>
-
- <!--定义构建生命周期中的扩展点。可以定义多个extension-->
- <extensions></extensions>
-
- <!--项目相关的所有资源路径,例如属性文件。这些资源被包含在最终的打包文件里-->
- <resources>
- <!--项目相关的资源路径-->
- <resource>
- <!--资源存放路径,相对于pom路径-->
- <directory>${pom.directory}</directory>
- <!--资源的目标(输出)路径,相对于outputDirectory指定的目录-->
- <targetPath>./</targetPath>
- <!--是否使用参数值来代替参数名。 参数值取自properties元素或文件里配置的属性,文件在filters元素里列出-->
- <filtering>true</filtering>
- <!--包含的文件列表模式-->
- <includes>
- <include>*.txt</include>
- <include>*.properties</include>
- </includes>
- <!--不包含的文件列表模式-->
- <excludes>
- <exclude>val*.properties</exclude>
- </excludes>
- </resource>
- </resources>
-
- <!--测试相关的所有资源路径-->
- <testResources></testResources>
-
- <!--当resource中的<filtering> 为true时生效。属性文件列表-->
- <filters>
- <!--路径相对于pom-->
- <filter>${pom.directory}/val.properties</filter>
- <filter>${pom.directory}/val2.properties</filter>
- </filters>
-
- <!--插件-->
- <plugins>
- <!--配置读取文件的编码-->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-resources-plugin</artifactId>
- <version>3.2.0</version>
- <configuration>
- <encoding>UTF-8</encoding>
- </configuration>
- </plugin>
- </plugins>
-
- <!--与dependencyManagement元素类似,用于管理插件。 可以在其中声明插件及配置,但不会出发调用,只有当配置了plugin元素,-->
- <!--并且其groupId和artifactId与其匹配时,才会影响实际的插件行为。常用于父项目确保所有子项目使用的插件版本保持一致-->
- <pluginManagement></pluginManagement>
- </build>
-
- <!--配置文件,可以在构建中被激活,以改变项目的默认构建行为。通常用于处理跨环境差异(开发环境、生成环境等),在命令行中使用参数-P激活:mvn package -Pdev-->
- <profiles>
- <profile>
- <!--该配置文件的唯一标识-->
- <id>dev</id>
- <!--定义什么情况下应该激活profile,可以基于系统属性、环境变量、文件存在性、操作系统、JDK版本等条件-->
- <activation></activation>
- <!--还可以包含properties、dependencies、build、modules、reporting等元素-->
- </profile>
- </profiles>
-
- <!--子模块,被构成项目的一部分。模块元素值是指向该模块的相对路径-->
- <modules></modules>
-
- <!--项目相关的依赖-->
- <dependencies></dependencies>
-
- <!--依赖管理,常用于父项目确保所有的子项目使用的依赖版本保持一致-->
- <dependencyManagement></dependencyManagement>
- </project>

<version> 元素来指定项目的版本号。通常版本信息遵循:主版本.次版本.增量版本-里程碑版本。
主版本:项目的重大架构变更。
次版本:较大范围的功能增加或变化,以及bug修复。
增量版本:中大bug的修复。
里程碑版本:一个版本的里程碑,可能并不是一个非常稳定的版本,还需要很多测试。
Final | 正式稳定版。 |
Beta | 测试版。已经在开发团队内部进行了初步测试,但仍可能存在一些小问题,会提供给外部测试人员或团队进行更广泛的测试。 |
Alpha | 内部测试版。通常处于开发阶段。用于内部进行初步功能测试和开发。 |
CR | 候选发布版,会在公开发布之前进行最后的广泛测试。 |
SNAPSHOT | 表示项目在开发中或不稳定的版本。 适用于开发和测试阶段。 |
表 常见的里程碑版本后缀
Maven的生命周期是抽象的,本身不做任何实际的工作,实际工作由插件完成。
clean | 清理项目,主要用于删除之前生成的数据。包含pre-clean、clean和post-clean三个阶段。 |
default | Maven的主要生命周期。包含了编译、测试、打包等一系列构建步骤。主要阶段有validate(验证工程是否正确、所需的资源是否可用)、compile(编译项目的源代码)、test(测试编译后的代码)、package(把已编译的代码打包成可发布的格式)、verify(运行所有检查)、install(将包安装至本地仓库,以供本地其他项目使用) |
site | 建立和发布项目站点。主要阶段有pre-site、site、post-site、site-deploy |
表 Maven 的三套相互独立的生命周期
Maven中,依赖是指项目所依赖的库或框架,通常以jar包的形式存在。通过Maven坐标(groupId、artifactId、version)进行唯一标识。
Mavan支持多种依赖范围,用于控制依赖在项目不同阶段的可用性。
compile | 默认范围,表示该依赖在编译、测试和运行阶段都可用。 |
test | 仅在测试阶段可用。 |
runtime | 在运行时可用,但在编译时不可用。 |
provided | 该依赖在JDK或容器中已提供,无需在项目中打包。 |
system | 与provided类似,但依赖的jar包必须显示地提供系统路径。 |
表 Maven依赖的范围
当项目A依赖与项目B,而项目B依赖项目C,那么A将自动继承项目B对项目C的依赖。
但是可能会导致一些问题,比如依赖冲突:
当项目中存在多个版本的相同依赖时,会根据一定的规则进行冲突解决。通常遵循“第一声明者优先”,即先声明的依赖版本将被使用。还可以使用<excusions>来排除特定的依赖,或者使用<dependencyManagement>来锁定依赖版本。
插件是Maven的核心组成部分,实际上是一组用于执行特定任务的工具。可以自动化项目的构建、测试、打包、部署等过程。本质上是一个包含实现特定功能代码的jar包。
Maven的三大生命周期:clean、default和report,每个都包含了一系列的阶段(phase),而插件的目标(goal)则绑定在这些阶段上。当执行某个Maven命令时,实际上触发了绑定的插件目标。
maven-compiler-plugin | 编译Java项目的源代码,并能确保Java代码与所指定的Java版本兼容,保证顺利地编译和执行。 |
maven-resources-plugin | 处理项目中的资源文件,如复制资源文件到输出目录。可以在构建过程中复制和过滤资源文件。 |
maven-jar-plugin | 将项目打包成JAR文件。 |
maven-war-plugin | 将项目打包成WAR文件。 |
maven-install-plugin | 将项目构建的包安装到本地Maven仓库中。 |
maven-dependency-plugin | 用于分析和管理项目的依赖。可以执行复制依赖项到指定目录、列出项目依赖等任务。 |
表 Maven官方常见插件
将项目打包成JAR或WAR文件时,会生成MANIFEST.MF文件(位于JAR文件等META-INFO目录下),用于描述打包等元数据信息(如程序入口类)。Java程序运行时,JVM读取并根据其中的配置信息执行响应的操作。
可以在maven-jar-plugin插件来配置其内容。
<packaging>标签指定打包方式,决定了文件输出类型(JAR、WAR等)。
常用于插件的配置,用于定义打包过程的文件布局,不同的布局可能会影响如何组织JAR或WAR文件内的类、资源和依赖。
JAR | 包含所有必要的依赖和启动脚本,生成的JAR文件将是可执行的。 |
WAR | 与JAR类型类似,但适用Web应用。 |
ZIP | 创建一个标准的ZIP文件,其内容和布局由用户自定义,不保证生成的ZIP文件是可执行的。 |
NONE | 用于创建一个不包含任何启动脚本或布局的JAR或WAR文件。包含应用的类、资源及依赖。生成的文件不可执行。 |
CUSTOM | 允许用户自定义布局。 |
表 <layout>的布局
用于构建Spring Boot应用程序的父项目,提供了一种标准化的方式来管理和配置Spring Boot应用程序的依赖项、插件和默认设置。
提供了以下功能(3.2.4版本):
1)默认使用Java17来编译项目。
2)UTF编码。
3)使用- parameters编译。
4)依赖管理。
5)repackage目标的执行,以便创建一个可执行的JAR或WAR文件。
6)Native配置文件。
7)filter资源处理。
8)合理的插件配置。包括Git提交ID和Shade插件的合理配置。
9)对应application.properties和application.yml的资源filter。
不想使用spring-boot-starter-parent,但想使用其依赖管理来控制依赖版本时,可以使用spring-boot-dependencies依赖(是spring-boot-starter-parent的父级依赖)。可以设置项目的父pom为这个依赖,或者在依赖管理中引入这个依赖。
- <dependencyManagement>
-
- <dependencies>
-
- <dependency>
-
- <!-- Import dependency management from Spring Boot -->
-
- <groupId>org.springframework.boot</groupId>
-
- <artifactId>spring-boot-dependencies</artifactId>
-
- <version>3.2.4</version>
-
- <type>pom</type>
-
- <scope>import</scope>
-
- </dependency>
-
- </dependencies>
-
- </dependencyManagement>

当想在项目中覆盖某依赖在父POM中指定的版本时,可以在<properties>中覆盖该属性的值。
- <properties>
- <mysql.version>8.1.0</mysql.version>
- </properties>
或者在<dependencyManagement>中覆盖该依赖。
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>com.mysql</groupId>
- <artifactId>mysql-connector-j</artifactId>
- <version>8.0.32</version>
- <exclusions>
- <exclusion>
- <groupId>com.google.protobuf</groupId>
- <artifactId>protobuf-java</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- </dependencies>
- </dependencyManagement>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。