🙋大家好!我是毛毛张!
🌈个人首页: 神马都会亿点点的毛毛张 👏今天毛毛张分享的内容主要是Maven 中 pom 文件🆕,涵盖基本概念、标签属性、配置等内容
文章目录
- 1.前言🥭
- 2.项目基本信息🍒
-
- [2.1 标签说明](#2.1 标签说明)
- [2.2 案例演示](#2.2 案例演示)
- 3.依赖管理`<dependencies>`🍎
-
- [3.1 依赖的基本概念](#3.1 依赖的基本概念)
- [3.2 依赖属性:`groupId`、`artifactId`、`version`](#3.2 依赖属性:
groupId
、artifactId
、version
) - [3.3 依赖声明`<dependencies>`和`<dependency>`](#3.3 依赖声明
<dependencies>
和<dependency>
) - [3.4 依赖版本管理`<dependencyManagement>`](#3.4 依赖版本管理
<dependencyManagement>
) - [3.5 依赖范围`<scope>`和`<systemPath>`](#3.5 依赖范围
<scope>
和<systemPath>
) - [3.6 总结](#3.6 总结)
-
- [3.6.1 **依赖管理原则**](#3.6.1 依赖管理原则)
- [3.6.2 `<exclusions>`与依赖冲突](#3.6.2
<exclusions>
与依赖冲突) - [3.6.3 Maven依赖调节原则](#3.6.3 Maven依赖调节原则)
- 4.项目属性`<properties>`🍇
-
- [4.1 标签说明](#4.1 标签说明)
- [4.2 示例](#4.2 示例)
- 5.插件管理🥝
-
- [5.1 插件管理`<pluginManagement>`](#5.1 插件管理
<pluginManagement>
) - [5.2 插件标签`<plugins>`和`<plugin>`](#5.2 插件标签
<plugins>
和<plugin>
) - [5.3 插件执行配置标签`<executions>`和`<execution>`](#5.3 插件执行配置标签
<executions>
和<execution>
) - [5.4 配置属性说明](#5.4 配置属性说明)
-
- [5.4.1 `<configuration>` 标签](#5.4.1
<configuration>
标签) - [5.4.2 `source` 和 `target` 的含义](#5.4.2
source
和target
的含义) - [5.4.3 其他常见插件配置](#5.4.3 其他常见插件配置)
- [5.4.1 `<configuration>` 标签](#5.4.1
- [5.5 插件的典型应用](#5.5 插件的典型应用)
-
- [5.5.1 指定jdk版本](#5.5.1 指定jdk版本)
- [5.5.2 打完整Maven的jar包(Maven默认方法)](#5.5.2 打完整Maven的jar包(Maven默认方法))
- [5.5.3 Spring Boot定制化打包](#5.5.3 Spring Boot定制化打包)
- [5.1 插件管理`<pluginManagement>`](#5.1 插件管理
- 6.仓库配置🥥
-
- [6.1 配置依赖仓库`<repositories>`](#6.1 配置依赖仓库
<repositories>
) - [6.2 配置插件仓库`<pluginRepositories>`](#6.2 配置插件仓库
<pluginRepositories>
)
- [6.1 配置依赖仓库`<repositories>`](#6.1 配置依赖仓库
- 7.构建配置🍉
-
- [7.1 整体构建配置`<build>`](#7.1 整体构建配置
<build>
) - [7.2 多环境配置`<profiles>`和`<profile>`](#7.2 多环境配置
<profiles>
和<profile>
)
- [7.1 整体构建配置`<build>`](#7.1 整体构建配置
- [8. 继承和聚合🍏](#8. 继承和聚合🍏)
-
- [8.1 聚合标签`<modules>`与`<module>`](#8.1 聚合标签
<modules>
与<module>
) - [8.2 继承标签`<parent>`](#8.2 继承标签
<parent>
)
- [8.1 聚合标签`<modules>`与`<module>`](#8.1 聚合标签
- 9.POM标签大全详解🫐
- 参考文献
1.前言🥭
-
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。
-
POM 中可以指定以下配置:项目依赖、插件、执行目标、项目构建、项目版本等等
-
今天毛毛张分享的是一篇关于
pom.xml
文件中标签以及属性的介绍文章,里面介绍的很多标签,但是毛毛张的目的并不是为了教大家怎么写,而是分类介绍一下这些标签及属性的含义,帮助大家理解,在做项目的时候我们很少直接去凭借自己的记忆去写,都是去复制粘贴自己之前的pom.xml
文件,久而久之就熟悉了。更多的信息可以参考POM文件官网:POM文件官网详细介绍 -
毛毛张今天围绕着沉默王二的技术派这个项目里面的
pom.xml
文件的案例来向大家介绍一下pom.xml
中一些常见的标签以及属性
2.项目基本信息🍒
2.1 标签说明
- project: 工程的根标签。
- modelVersion : 模型版本需要设置为
4.0
。 - groupId : 组织或公司标识,例如
com.company.project
。它在一个组织或者项目中通常是唯一的。例如,一个银行组织com.companyname.project-group
拥有所有与银行相关的项目。- 格式规则:
com.{公司/BU}.业务线.[子业务线]
,最多 4 级。- 说明 :
{公司/BU}
例如:alibaba
、taobao
、tmall
、aliexpress
等 BU 一级;子业务线可选。 - 正例:
com.taobao.tddl
、com.alibaba.sourcing.multilang
、com.atguigu.java
- 格式规则:
- artifactId : 项目名称,例如
my-app
。这是工程的标识,通常是工程的名称。groupId
和artifactId
一起定义了 artifact 在仓库中的位置。- 格式规则:
产品线名-模块名
。语义不重复不遗漏,先到仓库中心去查证一下。- 正例:
tc-client
、uic-api
、tair-tool
、bookstore
- 格式规则:
- **version: 项目版本,例如
1.0.0
。这是工程的版本号,在 artifact 的仓库中,用来区分不同的版本。例如:com.company.bank:consumer-banking:1.0
**和com.company.bank:consumer-banking:1.1
。- 版本号格式推荐:
主版本号.次版本号.修订号
(例如1.0.0
)- 主版本号:当进行了不兼容的 API 修改,或者增加了能改变产品方向的新功能时增加。
- 次版本号:当进行了向下兼容的功能性新增(新增类、接口等)时增加。
- 修订号:修复 bug,没有修改方法签名的功能加强,保持 API 兼容性时增加。
- 示例:
- 初始版本 →
1.0.0
- 修改 bug →
1.0.1
- 功能调整 →
1.1.0
- 初始版本 →
- 版本号格式推荐:
- packaging: 项目打包类型,主要有以下三种类型
jar
(默认值):代表普通的 Java 工程,打包后是.jar
文件。war
:代表 Java 的 Web 工程,打包后是.war
文件。pom
:代表不会打包,用于继承的父工程。
- properties: 定义项目属性,便于统一管理和复用(在下面详细介绍)
- name: 项目名称,用于展示,可不选
- description: 项目描述,可不选
- url: 项目主页或相关网址,可不选
- developers 和 contributors: 列出项目的开发者和贡献者信息,可不选
- Maven 的 GAVP 属性:
- GAVP 是指 groupId 、artifactId 、version 、packaging 四个属性的缩写,其中前三个是必要的,packaging 为可选项。这四个属性主要为每个项目在 Maven 仓库中做一个标识,类似于人的"姓-名"。有了具体标识,方便 Maven 软件对项目进行管理和互相引用!
- 规则总结:
- groupID :
com.{公司/BU}.业务线.[子业务线]
,最多 4 级。 - artifactID :
产品线名-模块名
,语义不重复不遗漏。 - version :
主版本号.次版本号.修订号
,如1.0.0
。 - packaging :
jar
(默认)、war
、pom
等,根据项目类型选择。
- groupID :
- 所有 POM 文件都需要包含
project
元素和这三个必需字段:groupId
、artifactId
、version
。
2.2 案例演示
xml
<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>
<!-- 项目基础信息 -->
<groupId>com.zzx</groupId> <!-- 组织标识 -->
<artifactId>springboot-mybatis-demo</artifactId> <!-- 项目名称 -->
<version>0.0.1-SNAPSHOT</version> <!-- 项目版本 -->
<!-- 以上标签必要 -->
<packaging>jar</packaging> <!-- 打包方式 -->
<name>springboot-mybatis-demo</name> <!-- 项目名称 -->
<description>springboot-mybatis-demo</description> <!-- 项目描述 -->
<!--- 以下标签非必要 -->
<name>神马都会亿点点的毛毛张</name>
<description>这是一个示例 Maven 项目</description>
<url>http://www.company.com/my-app</url>
<developers>
<developer>
<id>mmzhang</id>
<name>毛毛张</name>
<email>1849975199@qq.com</email>
<roles>
<role>Developer</role>
</roles>
</developer>
</developers>
<contributors>
<contributor>
<name>zzx</name>
<email>1849975199@qq.com</email>
<roles>
<role>Contributor</role>
</roles>
</contributor>
</contributors>
</project>
3.依赖管理<dependencies>
🍎
3.1 依赖的基本概念
Maven 中的依赖管理包括依赖的声明、范围、版本等。依赖描述了项目所需要的外部库或模块,Maven 会根据这些信息自动下载并管理这些依赖。
3.2 依赖属性:groupId
、artifactId
、version
-
每个 Maven 依赖都包含三个核心属性,Maven 会根据这些属性定位依赖,并从本地或远程仓库中下载
groupId
:表示依赖所属的组。artifactId
:表示依赖的具体名称。version
:表示依赖的版本号。
-
示例:
xml<!-- 唯一定位到依赖插件 --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.10</version>
3.3 依赖声明<dependencies>
和<dependency>
-
在 Maven 项目中,
<dependencies>
标签用于声明所有外部库和模块的依赖。每个依赖由一个<dependency>
标签表示。每个<dependency>
标签包含以下几个重要部分:groupId
:库的组织 ID。artifactId
:库的名称。version
:库的版本。scope
(可选):指定依赖的作用范围(将在下面详细讲解)<optional>
(可选):通过在<dependency>
中添加<optional>true</optional>
,可以标记该依赖为可选依赖。可选依赖不会被传递给其他项目,且不会强制要求在子项目中存在。<exclusions>
:排除依赖。有时,一个依赖会引入不需要的间接依赖,可以通过<exclusions>
排除它们。
-
示例:
xml<dependencies> <!-- 依赖示例:Spring Core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.9</version> <optional>true</optional> </dependency> <!-- 依赖示例:JUnit 测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
3.4 依赖版本管理<dependencyManagement>
-
在父 POM 中使用
dependencyManagement
标签统一管理版本,子项目通过引用时可以自动继承父项目的版本,而不需要重复指定。 -
示例:
xml<dependencyManagement> <dependencies> <!-- 管理 Spring 版本 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.9</version> </dependency> <!-- 管理 Jackson 版本 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- 使用父 POM 中管理的依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> </dependencies>
3.5 依赖范围<scope>
和<systemPath>
-
Maven 支持不同的依赖范围,影响依赖的生命周期和是否包含在构建中,
<scope>
标签用于管理依赖的部署和使用范围,帮助确定依赖项在不同环境中的有效性,可以直观地管理依赖。scope
有五种常见属性值:- compile(默认值):在所有范围内都生效,表示依赖项在编译、测试和运行时都需要存在。
- test:只在测试阶段有效,例如JUnit。不会影响编译阶段,仅在测试时使用。
- runtime:只在运行和测试时有效,例如JDBC驱动。编译时不需要此依赖,只有在运行或测试时才会用到。
- provided :在编译和测试时有效,例如
servlet-api
和jsp-api
。编译时需要这些依赖,但在运行时由容器提供(如Tomcat)。不能使用compile
,避免与容器提供的版本冲突。 system
:由系统 CLASSPATH 指定,编译时依赖,但不会打包,需要配合<systemPath>
使用。system
依赖可以引入系统中的非 Maven 管理的第三方 JAR 文件,通常是将 JAR 放在项目的lib
目录下并通过相对路径引用。
-
示例:
xml<!-- 使用 system 引入系统 JAR --> <dependency> <groupId>com.sun</groupId> <artifactId>tools</artifactId> <version>${java.version}</version> <scope>system</scope> <optional>true</optional> <systemPath>${java.home}/../lib/tools.jar</systemPath> </dependency> <!-- 引入项目内 JAR --> <dependency> <groupId>jsr</groupId> <artifactId>jsr</artifactId> <version>3.5</version> <scope>system</scope> <optional>true</optional> <systemPath>${basedir}/lib/jsr305.jar</systemPath> </dependency> <!-- 配置插件将 system JAR 打包 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.10</version> <executions> <execution> <id>copy-dependencies</id> <phase>compile</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/lib</outputDirectory> <includeScope>system</includeScope> <excludeGroupIds>com.sun</excludeGroupIds> </configuration> </execution> </executions> </plugin>
3.6 总结
3.6.1 依赖管理原则
- 显式依赖:如果项目中的Java源码直接引用了某个依赖库中的类,该依赖必须在编译阶段生效,否则编译时会报错。
- 运行时依赖:有些依赖可能没有在编译阶段直接引用,但在运行时被间接使用(例如项目的某个模块依赖)。这种依赖只能在运行阶段发现,因此需要确保其在运行时有效。
- 测试依赖 :像JUnit、Tomcat、
servlet-api
等依赖,仅在本地开发和测试时需要,但在打包时不需要。因此,可以在打包时忽略这些依赖。
3.6.2 <exclusions>
与依赖冲突
<exclusions>
用于排除传递依赖中的冲突,解决jar
包版本冲突的问题。传递依赖意味着项目A依赖B,B依赖C等,A项目会引入B的所有依赖,包括B的依赖(C、D、E等)。例如:项目A依赖B(版本1.1),项目C也依赖B(版本1.2)。如果项目同时依赖A和B,就会引入两个版本的B,可能导致冲突。为了解决这种冲突,使用<exclusions>
可以显式排除某个传递依赖,避免加载多个版本。
3.6.3 Maven依赖调节原则
-
路径近者优先:如果依赖的类有多个版本,Maven会选择路径较近的版本。例如,路径A→B→C→X(版本1.1)和路径D→E→X(版本1.2),Maven会选择版本1.2,因为路径D→E更近。
-
第一声明者优先:如果路径相等,Maven会选择先声明的版本。例如,路径A→B→X(版本1.1)和路径C→D→X(版本1.2),Maven会选择版本1.1,因为它是第一个声明的。
-
通过合理使用
scope
和exclusions
,可以有效地管理和避免依赖冲突,提高项目构建的稳定性与可靠性。
4.项目属性<properties>
🍇
4.1 标签说明
- 在前面介绍过依赖的管理,接下来就介绍一个和依赖管理相关的标签
<properties>
- 在 Maven 项目中,
<properties>
标签用于配置全局属性,可以通过这种方式简化配置,特别是在多个地方需要重复使用相同的属性时。通过在<properties>
标签中定义属性,可以避免在多个依赖或配置中硬编码这些值,便于集中管理和修改。 - 通过
<properties>
配置的属性是全局可用的,且可以被子模块的pom.xml
继承和使用。这种方式使得项目中相同的配置可以在一个地方集中管理,提高了维护性。 - 引用配置的属性:在
<dependencies>
中,可以通过${}
引用在<properties>
中定义的属性值
4.2 示例
xml
<properties>
<!-- 版本号作为属性配置 -->
<java.version>1.8</java.version>
<spring.version>5.0.2.RELEASE</spring.version> <!-- RELEASE 表示最新的发布版本 -->
</properties>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- 项目编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<!-- 使用 ${} 引用 properties 中定义的属性 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<!-- 使用配置的属性引用版本号 -->
<version>${spring.version}</version>
</dependency>
</dependencies>
5.插件管理🥝
- Maven 插件是 Maven 构建生命周期的一部分,用于在不同阶段执行特定的任务,如编译代码、打包、测试等。插件的配置通过
POM
文件中的<plugins>
部分进行管理。插件配置包括插件的标识、版本、执行阶段和具体的参数配置。
5.1 插件管理<pluginManagement>
-
pluginManagement :在父 POM 文件中统一管理插件的版本和配置,子项目可以继承这些设置。子项目仅需在
<build><plugins>
部分引用插件,而无需再次指定插件版本或其他配置。 -
示例:
xml<pluginManagement> <plugins> <!-- 统一管理插件版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>${maven.compiler.source}</source> <target>${maven.compiler.target}</target> </configuration> </plugin> </plugins> </pluginManagement> <build> <plugins> <!-- 使用 pluginManagement 中定义的编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> </plugin> </plugins> </build>
5.2 插件标签<plugins>
和<plugin>
-
Maven 插件通常包含以下标签和属性:
<plugins>
:定义插件的容器,所有插件的配置都在此标签内。<plugin>
:用于定义一个插件的配置,包括插件标识、版本、执行阶段等。每个<plugin>
标签代表一个插件的配置。包含以下属性:<groupId>
:插件的组织标识符,通常是 Maven 组织或相关开源项目的标识。<artifactId>
:插件的唯一标识符,表示插件的名字。<version>
:插件的版本号,指明该插件的具体版本。<configuration>
:插件的配置,通常用于传递插件需要的参数。<executions>
:插件执行的配置,标签定义了插件的执行规则,决定插件在构建过程中何时执行。可以包含多个<execution>
标签。每个<execution>
标签指定插件在哪个阶段执行、执行的目标以及需要的配置。<dependencies>
:插件依赖的其他插件。
-
<configuration>
:用于配置插件的具体执行内容,包含插件执行时需要的参数。每个插件有自己独特的配置选项,这些配置项由插件开发者定义。 -
示例:毛毛张在这里通过一个常见的插件Lombok依赖和插件的配置来作为演示的示例
xml<!-- Java 版本配置 --> <properties> <java.version>17</java.version> <!-- 项目使用的 Java 版本 --> </properties> <!-- 依赖项配置 --> <dependencies> <!-- Lombok 依赖 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.36</version> <scope>provided</scope> <!-- 可选:标记为 provided --> </dependency> </dependencies> <!-- 构建配置 --> <build> <plugins> <!-- Maven 编译插件,用于处理注解处理器(如 Lombok) --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <!-- 指定插件版本 --> <configuration> <source>${java.version}</source> <!-- Java 源代码版本 --> <target>${java.version}</target> <!-- Java 字节码版本 --> <annotationProcessorPaths> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.36</version> <!-- 确保版本匹配 --> </path> </annotationProcessorPaths> </configuration> </plugin> <!-- 依赖插件配置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.1.1</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <!-- 指定执行阶段 --> <goals> <goal>copy-dependencies</goal> <!-- 目标任务 --> </goals> <configuration> <outputDirectory>${project.build.directory}/libs</outputDirectory> <!-- 配置输出目录 --> </configuration> </execution> </executions> </plugin> </plugins> </build>
-
示例解释:
- Java 版本 :通过
<properties>
设置 Java 版本为 17,确保项目在编译时使用这个版本。 - Lombok 依赖 :引入了 Lombok 作为编译时依赖,使用
provided
作用域,意味着它仅在编译时使用,不会包含在最终的 JAR 文件中。 - Maven 编译插件 :配置了
maven-compiler-plugin
插件,确保使用指定的 Java 版本(17)进行编译,并支持 Lombok 注解处理器。 - 依赖插件 :使用
maven-dependency-plugin
插件在package
阶段将所有依赖复制到libs
目录,方便后续使用或发布。
- Java 版本 :通过
5.3 插件执行配置标签<executions>
和<execution>
<execution>
标签:该 标签包含插件执行时的具体信息,通常有以下子标签:<id>
:执行标识符,指定该执行的唯一标识。<phase>
:插件执行的生命周期阶段,例如compile
、test
、package
等。<goals>
:指定插件执行的目标,通常是插件所提供的功能。<configuration>
:该执行的具体配置,定义该目标任务在执行时的参数。
- 插件的执行阶段通过
<phase>
属性指定,Maven构建生命周期的常见阶段包括:validate
:验证项目是否正确,所有需要的参数和文件是否存在。compile
:编译源代码。test
:运行测试。package
:打包应用程序。install
:将打包好的应用程序安装到本地仓库。deploy
:将应用程序发布到远程仓库。
- 插件目标通过
goals
标签配置,每个插件可以有多个目标任务,每个目标定义插件的具体功能,goals相当于该插件中的一个功能,该功能将在phase绑定的生命周期阶段执行。有些插件可能包含多个目标,goals 标签中可以配置多个 goal 标签,表示一个生命周期环节可以对应当前插件的多个目标。
5.4 配置属性说明
5.4.1 <configuration>
标签
<configuration>
标签用于传递给插件的具体参数,这些参数控制插件的行为。例如,maven-compiler-plugin
插件的配置包含了source
和target
属性,用来指定源代码和字节码的兼容版本
5.4.2 source
和 target
的含义
source
:指定源码兼容性版本,表示源码需要遵循的 JDK 版本。例如,source
设置为1.8
表示代码将使用 Java 1.8 编写target
:指定编译后的.class
字节码版本,表示编译生成的.class
文件能够在指定版本的 JVM 上运行。例如,target
设置为1.8
表示编译后的字节码将兼容 JDK 1.8
5.4.3 其他常见插件配置
- 输出目录 :如
outputDirectory
,定义插件输出文件的路径。 - 依赖项 :如
dependencies
,指定插件所依赖的其他插件或库。
5.5 插件的典型应用
5.5.1 指定jdk版本
-
提出问题 Maven使用的默认Java编译器版本是Java 1.5。为了使Maven使用Java编译器的较新版本编译Java代码,需要在项目的POM文件(pom.xml)中显式指定Java编译器。 从Java 8 和更早版本开始,有两种方法可以在Maven POM文件中设置Java编译器版本:
-
通过Maven Java编译器属性:
xml<properties> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.source>1.8</maven.compiler.source> </properties>
-
通过Maven Java编译器插件:
xml<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
5.5.2 打完整Maven的jar包(Maven默认方法)
-
需求 :在进行 Maven 打包时,项目需要满足以下要求:
- 打一个压缩包,其中包含应用程序的 JAR 包、依赖的 JAR 包以及说明文档。
- 打包的 JAR 包能够执行不同类中的
main
函数。 - 源码 JAR 包与依赖的第三方 JAR 包分开。
- 项目中的执行脚本也一起打包并进行分类。
document
目录下的readme.txt
放在压缩包的根目录下,其他文档仍然放在document
目录下。- 打包时排除不必要的目录和文件。
-
解决方案 :可以使用 Maven 的
maven-jar-plugin
插件来打可执行的 JAR 包,并对打包过程进行定制。 -
示例:
xml<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <!-- 对 JAR 包进行配置 --> <configuration> <!-- 配置归档器 --> <archive> <!-- 不包含 pom.xml 和 pom.properties --> <addMavenDescriptor>false</addMavenDescriptor> <!-- Manifest 特定配置 --> <manifest> <!-- 是否将第三方 JAR 包放入 Manifest 的 classpath 中 --> <addClasspath>true</addClasspath> <!-- classpath 前缀,放置第三方 JAR 到 lib 目录 --> <classpathPrefix>lib/</classpathPrefix> </manifest> </archive> <!-- 过滤不需要包含在 JAR 中的文件 --> <excludes> <!-- 排除不需要的文件夹 --> <exclude>**/assembly/</exclude> </excludes> </configuration> </plugin>
-
运行方式:打包后,可以使用以下命令执行 JAR 包中的
main
方法:cmdjava -classpath dong.jar [main类的完全路径]
5.5.3 Spring Boot定制化打包
-
默认情况下,Maven 使用
maven-jar-plugin
插件来打包 JAR 包,但普通的 JAR 包无法通过java -jar
命令直接运行。为了解决这一问题,Spring Boot 提供了专门的 Maven 插件spring-boot-maven-plugin
,用于定制 Spring Boot 应用的打包行为,使得打包后的 JAR 包可以直接使用java -jar
命令启动运行。 -
使用
spring-boot-maven-plugin
打包 Spring Boot 项目xml<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.5.5</version> </plugin> </plugins> </build>
-
默认打包与 Spring Boot 打包的区别
- 默认打包:只生成普通的 JAR 包,不包含项目依赖的 JAR 包,无法直接执行。
- Spring Boot 打包 :生成的 JAR 包包含所有依赖的 JAR 文件,所有依赖包都打包到
BOOT-INF/lib
目录下。可以通过java -jar
命令直接执行,无需手动指定main
类。
6.仓库配置🥥
- 在 Maven 项目中,仓库配置用于定义项目的依赖库和插件的存储位置。主要分为两种类型:
<repositories>
和<pluginRepositories>
。<repositories>
用于配置项目的依赖仓库,支持对发布版本(<releases>
)和快照版本(<snapshots>
)的独立控制。<pluginRepositories>
用于配置插件的仓库,通常用于存放公司内部或自定义的 Maven 插件。
- 配置仓库时,可以指定是否启用发布版本(
<releases>
)或快照版本(<snapshots>
)的下载,灵活管理项目依赖和插件的来源。
6.1 配置依赖仓库<repositories>
-
<repositories>
标签用于定义项目依赖的仓库位置,可以包含多个<repository>
子标签 -
每个
<repository>
定义一个具体的仓库,项目会从这些仓库中获取依赖。每个仓库包含以下属性:<id>
: 仓库的唯一标识符<url>
: 仓库的地址<releases>
和<snapshots>
: 配置是否启用发布版本和快照版本的下载
-
示例:这是沉默王二的技术派的项目的依赖仓库配置
xml<repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>aliyun-maven</id> <name>aliyun-maven</name> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
-
示例解释:
- Spring Milestones 仓库
- 仓库内容:由 Spring 团队维护,存放 Spring 框架及相关项目的里程碑版本和开发版本。主要包含接近发布但尚不完全稳定的版本,如 Spring Boot、Spring Cloud 等的里程碑版本。
- 配置作用:访问 Spring 项目的最新特性和修复,提前体验尚未发布的版本,适用于开发和测试。
- Aliyun Maven 仓库
- 仓库内容:阿里云提供的公共 Maven 仓库,作为 Maven 中央仓库的国内镜像,包含常用的 Java 库和工具,如 Spring、MySQL Connector、Apache Commons 等。
- 配置作用:加速国内开发者对常见 Java 库的访问,解决访问 Maven 中央仓库时的网络速度问题。
- Spring Milestones 仓库
6.2 配置插件仓库<pluginRepositories>
-
<pluginRepositories>
标签用于定义存储 Maven 插件的仓库位置,通常用于存放自定义或公司内部的 Maven 插件 -
与
<repositories>
类似,<pluginRepositories>
可以包含多个<pluginRepository>
子标签。每个仓库包含以下属性:<id>
: 插件仓库的唯一标识符<url>
: 插件仓库的地址
-
示例:
xml<pluginRepositories> <!-- Maven 官方中央插件仓库 --> <pluginRepository> <id>central</id> <url>https://repo.maven.apache.org/maven2</url> </pluginRepository> <!-- 公司内部插件仓库 --> <pluginRepository> <id>company-plugin-repo</id> <url>http://plugins.company.com/maven2</url> </pluginRepository> </pluginRepositories>
-
示例解释:
central
:- URL :
https://repo.maven.apache.org/maven2
这是 Maven 官方的中央仓库 URL,包含了大量常用的构建插件,例如maven-compiler-plugin
和maven-jar-plugin
等。 - 用途: 配置中央仓库,确保 Maven 在构建过程中能够从官方仓库获取常见的构建插件。
- URL :
company-plugin-repo
:- URL :
http://plugins.company.com/maven2
这是公司自定义的插件仓库 URL,假设公司开发了自己特定的 Maven 插件(如特定的构建或发布插件)。 - 用途: 如果项目需要使用公司开发的私有插件,Maven 会尝试从这个自定义仓库获取插件。如果插件在中央仓库中没有找到,Maven 将尝试访问此私有仓库。
- URL :
7.构建配置🍉
7.1 整体构建配置<build>
-
示例:
xml<build> <sourceDirectory>src/main/java</sourceDirectory> <outputDirectory>target/classes</outputDirectory> <finalName>my-app</finalName> <plugins> <!-- 编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>${maven.compiler.source}</source> <target>${maven.compiler.target}</target> </configuration> </plugin> <!-- 打包插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>com.company.project.MainApp</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </resource> </resources> <testResources> <testResource> <directory>src/test/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </testResource> </testResources> </build>
-
基本目录设定:
- sourceDirectory :明确了源代码所在的目录,默认值为
src/main/java
,这是项目中 Java 源代码存放的基础位置,编译器会从这里读取代码进行编译操作。 - outputDirectory :定义了编译后输出的目录,默认是
target/classes
,编译生成的字节码文件等会存放在此目录下,后续打包等操作会基于这个目录里的内容进行。 - finalName :指定了最终打包的名称(不包含扩展名),比如示例中设置为
my-app
,它决定了生成的可执行文件或者包最终呈现的主名称。
- sourceDirectory :明确了源代码所在的目录,默认值为
-
插件配置(plugins):
- 编译插件(maven-compiler-plugin):
- 其
groupId
、artifactId
和version
确定了具体使用的编译插件版本为3.8.1
。 - 通过
<configuration>
标签内的<source>
和<target>
配置项,可指定编译时使用的 Java 版本等编译相关的参数,并且这里使用了${maven.compiler.source}
和${maven.compiler.target}
这样的变量形式,方便在外部进行灵活配置。
- 其
- 打包插件(maven-jar-plugin):
- 同样通过
groupId
、artifactId
和version
明确了使用的打包插件版本是3.2.0
。 - 在
<configuration>
里的<archive>
及<manifest>
相关配置,如设置<addClasspath>true</addClasspath>
表示将类路径添加到清单文件中,<mainClass>
指定了项目的主类(如com.company.project.MainApp
),这样在打包后的可执行文件运行时能准确找到入口类启动项目。
- 同样通过
- 编译插件(maven-compiler-plugin):
-
资源文件配置(resources 和 testResources):
- resources :针对项目的主资源文件,
<directory>
指定资源文件所在目录为src/main/resources
,而<includes>
标签里通过<include>
定义了具体包含哪些类型的资源文件(示例中包含.properties
和.xml
文件),用于在项目构建、打包等过程中对这些资源文件进行正确处理。 - testResources :与
resources
类似,不过它是针对测试相关资源文件的配置,其目录设定为src/test/resources
,包含规则同样是指定了.properties
和.xml
文件,确保测试时对应的资源能被正确加载。
- resources :针对项目的主资源文件,
7.2 多环境配置<profiles>
和<profile>
-
基本概念与作用:
- profiles:用于应对 spring boot 项目在不同部署环境(开发、测试、线上等)的需求,因为不同环境往往需要加载不同的配置文件,通过它可以方便地进行构建配置的切换。
- profile:是每个具体构建配置文件的定义,里面涵盖了如属性(properties)、依赖(dependencies)、插件(plugins)等多方面的配置内容,使得每个环境可以有各自独立且合适的项目配置。
- activation :定义激活条件,可以通过命令行参数
-P
激活某个配置文件,或者通过条件自动激活。
-
示例1:这是沉默王二的技术派中的多环境配置
xml<profiles> <!-- 本地开发 --> <profile> <id>dev</id> <properties> <env>dev</env> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <!-- 测试 --> <profile> <id>test</id> <properties> <env>test</env> </properties> </profile> <!-- 预发 --> <profile> <id>pre</id> <properties> <env>pre</env> </properties> </profile> <!-- 生产 --> <profile> <id>prod</id> <properties> <env>prod</env> </properties> </profile> </profiles> <build> <resources> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>src/main/resources-env/${env}</directory> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build>
-
示例2:
xml<profiles> <!-- 本地环境 --> <profile> <id>local</id> <activation> <!-- 默认激活此配置 --> <activeByDefault>true</activeByDefault> </activation> <properties> <!-- 环境配置 --> <environment>local</environment> <env>dev</env> </properties> <dependencies> <!-- 使用常见的数据库连接池 HikariCP --> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.0.0</version> <scope>runtime</scope> </dependency> </dependencies> </profile> <!-- 开发环境 --> <profile> <id>dev</id> <activation> <!-- 不默认激活,需要显式选择 --> <activeByDefault>false</activeByDefault> </activation> <properties> <environment>dev</environment> <env>dev</env> </properties> <dependencies> <!-- 使用常见的 MySQL 数据库连接器 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.23</version> <scope>runtime</scope> </dependency> </dependencies> </profile> <!-- 生产环境 --> <profile> <id>prod</id> <activation> <!-- 不默认激活,需要显式选择 --> <activeByDefault>false</activeByDefault> </activation> <properties> <environment>prod</environment> <env>prod</env> </properties> <dependencies> <!-- 使用常见的 MySQL 数据库连接器 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.23</version> <scope>runtime</scope> </dependency> </dependencies> </profile> </profiles>
8. 继承和聚合🍏
8.1 聚合标签<modules>
与<module>
-
聚合标签用于将多个子模块整合在一起,进行统一构建,避免逐一构建。为了使用聚合,必须有一个父工程,并在父工程的 POM 文件中使用
<modules>
标签来配置包含的子模块的路径。<modules>
: 列出当前聚合项目包含的所有子模块。<module>
: 用于指定子模块的相对路径或目录名。
-
在继承的父 POM 文件中,
<modules>
用来定义聚合项目的子模块。确保子模块目录存在,并且每个子模块都有自己的 POM 文件。 -
下面是技术派项目中父工程的配置文件:
xml<modules> <module>paicoding-ui</module> <module>paicoding-web</module> <module>paicoding-core</module> <module>paicoding-service</module> <module>paicoding-api</module> </modules>
8.2 继承标签<parent>
-
继承标签用于指定当前项目的父 POM。通过继承父 POM,可以共享父项目的配置,避免重复配置。
<parent>
: 指定当前项目的父 POM 文件。<relativePath>
: 父 POM 文件的相对路径,默认是../pom.xml
。
-
示例:
xml<parent> <groupId>com.company.project</groupId> <artifactId>parent-pom</artifactId> <version>1.0.0</version> <relativePath>../parent-pom/pom.xml</relativePath> </parent>
<relativePath>../parent-pom/pom.xml</relativePath>
是相对于当前 POM 文件的父 POM 文件的相对路径。../parent-pom/pom.xml
表示父 POM 文件位于当前 POM 文件所在目录的上一级目录下的parent-pom
文件夹中,且该文件名为pom.xml
。..
表示当前目录的上级目录。parent-pom/pom.xml
表示父 POM 文件所在的相对路径。
都看到这了,不妨一键三连再走吧!
🌈欢迎和毛毛张一起探讨和交流!
联系方式点击下方个人名片
9.POM标签大全详解🫐
xml
<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.0http://maven.apache.org/maven-v4_0_0.xsd">
<!--父项目的坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。 坐标包括group ID,artifact ID和
version。 -->
<parent>
<!--被继承的父项目的构件标识符 -->
<artifactId />
<!--被继承的父项目的全球唯一标识符 -->
<groupId />
<!--被继承的父项目的版本 -->
<version />
<!-- 父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项
目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。 -->
<relativePath />
</parent>
<!--声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。 -->
<modelVersion>4.0.0</modelVersion>
<!--项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目。并且构建时生成的路径也是由此生成, 如com.mycompany.app生成的相对路径为:/com/mycompany/app -->
<groupId>asia.banseon</groupId>
<!-- 构件的标识符,它和group ID一起唯一标识一个构件。换句话说,你不能有两个不同的项目拥有同样的artifact ID和groupID;在某个
特定的group ID下,artifact ID也必须是唯一的。构件是项目产生的或使用的一个东西,Maven为项目产生的构件包括:JARs,源 码,二进制发布和WARs等。 -->
<artifactId>banseon-maven2</artifactId>
<!--项目产生的构件类型,例如jar、war、ear、pom。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型 -->
<packaging>jar</packaging>
<!--项目当前版本,格式为:主版本.次版本.增量版本-限定版本号 -->
<version>1.0-SNAPSHOT</version>
<!--项目的名称, Maven产生的文档用 -->
<name>banseon-maven</name>
<!--项目主页的URL, Maven产生的文档用 -->
<url>http://www.baidu.com/banseon</url>
<!-- 项目的详细描述, Maven 产生的文档用。 当这个元素能够用HTML格式描述时(例如,CDATA中的文本会被解析器忽略,就可以包含HTML标
签), 不鼓励使用纯文本描述。如果你需要修改产生的web站点的索引页面,你应该修改你自己的索引页文件,而不是调整这里的文档。 -->
<description>A maven project to study maven.</description>
<!--描述了这个项目构建环境中的前提条件。 -->
<prerequisites>
<!--构建该项目或使用该插件所需要的Maven的最低版本 -->
<maven />
</prerequisites>
<!--项目的问题管理系统(Bugzilla, Jira, Scarab,或任何你喜欢的问题管理系统)的名称和URL,本例为 jira -->
<issueManagement>
<!--问题管理系统(例如jira)的名字, -->
<system>jira</system>
<!--该项目使用的问题管理系统的URL -->
<url>http://jira.baidu.com/banseon</url>
</issueManagement>
<!--项目持续集成信息 -->
<ciManagement>
<!--持续集成系统的名字,例如continuum -->
<system />
<!--该项目使用的持续集成系统的URL(如果持续集成系统有web接口的话)。 -->
<url />
<!--构建完成时,需要通知的开发者/用户的配置项。包括被通知者信息和通知条件(错误,失败,成功,警告) -->
<notifiers>
<!--配置一种方式,当构建中断时,以该方式通知用户/开发者 -->
<notifier>
<!--传送通知的途径 -->
<type />
<!--发生错误时是否通知 -->
<sendOnError />
<!--构建失败时是否通知 -->
<sendOnFailure />
<!--构建成功时是否通知 -->
<sendOnSuccess />
<!--发生警告时是否通知 -->
<sendOnWarning />
<!--不赞成使用。通知发送到哪里 -->
<address />
<!--扩展配置项 -->
<configuration />
</notifier>
</notifiers>
</ciManagement>
<!--项目创建年份,4位数字。当产生版权信息时需要使用这个值。 -->
<inceptionYear />
<!--项目相关邮件列表信息 -->
<mailingLists>
<!--该元素描述了项目相关的所有邮件列表。自动产生的网站引用这些信息。 -->
<mailingList>
<!--邮件的名称 -->
<name>Demo</name>
<!--发送邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->
<post>banseon@126.com</post>
<!--订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->
<subscribe>banseon@126.com</subscribe>
<!--取消订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->
<unsubscribe>banseon@126.com</unsubscribe>
<!--你可以浏览邮件信息的URL -->
<archive>http:/hi.baidu.com/banseon/demo/dev/</archive>
</mailingList>
</mailingLists>
<!--项目开发者列表 -->
<developers>
<!--某个项目开发者的信息 -->
<developer>
<!--SCM里项目开发者的唯一标识符 -->
<id>HELLO WORLD</id>
<!--项目开发者的全名 -->
<name>banseon</name>
<!--项目开发者的email -->
<email>banseon@126.com</email>
<!--项目开发者的主页的URL -->
<url />
<!--项目开发者在项目中扮演的角色,角色元素描述了各种角色 -->
<roles>
<role>Project Manager</role>
<role>Architect</role>
</roles>
<!--项目开发者所属组织 -->
<organization>demo</organization>
<!--项目开发者所属组织的URL -->
<organizationUrl>http://hi.baidu.com/banseon</organizationUrl>
<!--项目开发者属性,如即时消息如何处理等 -->
<properties>
<dept>No</dept>
</properties>
<!--项目开发者所在时区, -11到12范围内的整数。 -->
<timezone>-5</timezone>
</developer>
</developers>
<!--项目的其他贡献者列表 -->
<contributors>
<!--项目的其他贡献者。参见developers/developer元素 -->
<contributor>
<name />
<email />
<url />
<organization />
<organizationUrl />
<roles />
<timezone />
<properties />
</contributor>
</contributors>
<!--该元素描述了项目所有License列表。 应该只列出该项目的license列表,不要列出依赖项目的 license列表。如果列出多个license,用户可以选择它们中的一个而不是接受所有license。 -->
<licenses>
<!--描述了项目的license,用于生成项目的web站点的license页面,其他一些报表和validation也会用到该元素。 -->
<license>
<!--license用于法律上的名称 -->
<name>Apache 2</name>
<!--官方的license正文页面的URL -->
<url>http://www.baidu.com/banseon/LICENSE-2.0.txt</url>
<!--项目分发的主要方式: repo,可以从Maven库下载 manual, 用户必须手动下载和安装依赖 -->
<distribution>repo</distribution>
<!--关于license的补充信息 -->
<comments>A business-friendly OSS license</comments>
</license>
</licenses>
<!--SCM(Source Control Management)标签允许你配置你的代码库,供Maven web站点和其它插件使用。 -->
<scm>
<!--SCM的URL,该URL描述了版本库和如何连接到版本库。欲知详情,请看SCMs提供的URL格式和列表。该连接只读。 -->
<connection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
</connection>
<!--给开发者使用的,类似connection元素。即该连接不仅仅只读 -->
<developerConnection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
</developerConnection>
<!--当前代码的标签,在开发阶段默认为HEAD -->
<tag />
<!--指向项目的可浏览SCM库(例如ViewVC或者Fisheye)的URL。 -->
<url>http://svn.baidu.com/banseon</url>
</scm>
<!--描述项目所属组织的各种属性。Maven产生的文档用 -->
<organization>
<!--组织的全名 -->
<name>demo</name>
<!--组织主页的URL -->
<url>http://www.baidu.com/banseon</url>
</organization>
<!--构建项目需要的信息 -->
<build>
<!--该元素设置了项目源码目录,当构建项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 -->
<sourceDirectory />
<!--该元素设置了项目脚本源码目录,该目录和源码目录不同:绝大多数情况下,该目录下的内容 会被拷贝到输出目录(因为脚本是被解释的,而不是被编译的)。 -->
<scriptSourceDirectory />
<!--该元素设置了项目单元测试使用的源码目录,当测试项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 -->
<testSourceDirectory />
<!--被编译过的应用程序class文件存放的目录。 -->
<outputDirectory />
<!--被编译过的测试class文件存放的目录。 -->
<testOutputDirectory />
<!--使用来自该项目的一系列构建扩展 -->
<extensions>
<!--描述使用到的构建扩展。 -->
<extension>
<!--构建扩展的groupId -->
<groupId />
<!--构建扩展的artifactId -->
<artifactId />
<!--构建扩展的版本 -->
<version />
</extension>
</extensions>
<!--当项目没有规定目标(Maven2 叫做阶段)时的默认值 -->
<defaultGoal />
<!--这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。 -->
<resources>
<!--这个元素描述了项目相关或测试相关的所有资源路径 -->
<resource>
<!-- 描述了资源的目标路径。该路径相对target/classes目录(例如${project.build.outputDirectory})。举个例
子,如果你想资源在特定的包里(org.apache.maven.messages),你就必须该元素设置为org/apache/maven /messages。然而,如果你只是想把资源放到源码目录结构里,就不需要该配置。 -->
<targetPath />
<!--是否使用参数值代替参数名。参数值取自properties元素或者文件里配置的属性,文件在filters元素里列出。 -->
<filtering />
<!--描述存放资源的目录,该路径相对POM路径 -->
<directory />
<!--包含的模式列表,例如**/*.xml. -->
<includes />
<!--排除的模式列表,例如**/*.xml -->
<excludes />
</resource>
</resources>
<!--这个元素描述了单元测试相关的所有资源路径,例如和单元测试相关的属性文件。 -->
<testResources>
<!--这个元素描述了测试相关的所有资源路径,参见build/resources/resource元素的说明 -->
<testResource>
<targetPath />
<filtering />
<directory />
<includes />
<excludes />
</testResource>
</testResources>
<!--构建产生的所有文件存放的目录 -->
<directory />
<!--产生的构件的文件名,默认值是${artifactId}-${version}。 -->
<finalName />
<!--当filtering开关打开时,使用到的过滤器属性文件列表 -->
<filters />
<!--子项目可以引用的默认插件信息。该插件配置项直到被引用时才会被解析或绑定到生命周期。给定插件的任何本地配置都会覆盖这里的配置 -->
<pluginManagement>
<!--使用的插件列表 。 -->
<plugins>
<!--plugin元素包含描述插件所需要的信息。 -->
<plugin>
<!--插件在仓库里的group ID -->
<groupId />
<!--插件在仓库里的artifact ID -->
<artifactId />
<!--被使用的插件的版本(或版本范围) -->
<version />
<!--是否从该插件下载Maven扩展(例如打包和类型处理器),由于性能原因,只有在真需要下载时,该元素才被设置成enabled。 -->
<extensions />
<!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。 -->
<executions>
<!--execution元素包含了插件执行需要的信息 -->
<execution>
<!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标 -->
<id />
<!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段 -->
<phase />
<!--配置的执行目标 -->
<goals />
<!--配置是否被传播到子POM -->
<inherited />
<!--作为DOM对象的配置 -->
<configuration />
</execution>
</executions>
<!--项目引入插件所需要的额外依赖 -->
<dependencies>
<!--参见dependencies/dependency元素 -->
<dependency>
......
</dependency>
</dependencies>
<!--任何配置是否被传播到子项目 -->
<inherited />
<!--作为DOM对象的配置 -->
<configuration />
</plugin>
</plugins>
</pluginManagement>
<!--使用的插件列表 -->
<plugins>
<!--参见build/pluginManagement/plugins/plugin元素 -->
<plugin>
<groupId />
<artifactId />
<version />
<extensions />
<executions>
<execution>
<id />
<phase />
<goals />
<inherited />
<configuration />
</execution>
</executions>
<dependencies>
<!--参见dependencies/dependency元素 -->
<dependency>
......
</dependency>
</dependencies>
<goals />
<inherited />
<configuration />
</plugin>
</plugins>
</build>
<!--在列的项目构建profile,如果被激活,会修改构建处理 -->
<profiles>
<!--根据环境参数或命令行参数激活某个构建处理 -->
<profile>
<!--构建配置的唯一标识符。即用于命令行激活,也用于在继承时合并具有相同标识符的profile。 -->
<id />
<!--自动触发profile的条件逻辑。Activation是profile的开启钥匙。profile的力量来自于它 能够在某些特定的环境中自动使用某些特定的值;这些环境通过activation元素指定。activation元素并不是激活profile的唯一方式。 -->
<activation>
<!--profile默认是否激活的标志 -->
<activeByDefault />
<!--当匹配的jdk被检测到,profile被激活。例如,1.4激活JDK1.4,1.4.0_2,而!1.4激活所有版本不是以1.4开头的JDK。 -->
<jdk />
<!--当匹配的操作系统属性被检测到,profile被激活。os元素可以定义一些操作系统相关的属性。 -->
<os>
<!--激活profile的操作系统的名字 -->
<name>Windows XP</name>
<!--激活profile的操作系统所属家族(如 'windows') -->
<family>Windows</family>
<!--激活profile的操作系统体系结构 -->
<arch>x86</arch>
<!--激活profile的操作系统版本 -->
<version>5.1.2600</version>
</os>
<!--如果Maven检测到某一个属性(其值可以在POM中通过${名称}引用),其拥有对应的名称和值,Profile就会被激活。如果值 字段是空的,那么存在属性名称字段就会激活profile,否则按区分大小写方式匹配属性值字段 -->
<property>
<!--激活profile的属性的名称 -->
<name>mavenVersion</name>
<!--激活profile的属性的值 -->
<value>2.0.3</value>
</property>
<!--提供一个文件名,通过检测该文件的存在或不存在来激活profile。missing检查文件是否存在,如果不存在则激活 profile。另一方面,exists则会检查文件是否存在,如果存在则激活profile。 -->
<file>
<!--如果指定的文件存在,则激活profile。 -->
<exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
</exists>
<!--如果指定的文件不存在,则激活profile。 -->
<missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
</missing>
</file>
</activation>
<!--构建项目所需要的信息。参见build元素 -->
<build>
<defaultGoal />
<resources>
<resource>
<targetPath />
<filtering />
<directory />
<includes />
<excludes />
</resource>
</resources>
<testResources>
<testResource>
<targetPath />
<filtering />
<directory />
<includes />
<excludes />
</testResource>
</testResources>
<directory />
<finalName />
<filters />
<pluginManagement>
<plugins>
<!--参见build/pluginManagement/plugins/plugin元素 -->
<plugin>
<groupId />
<artifactId />
<version />
<extensions />
<executions>
<execution>
<id />
<phase />
<goals />
<inherited />
<configuration />
</execution>
</executions>
<dependencies>
<!--参见dependencies/dependency元素 -->
<dependency>
......
</dependency>
</dependencies>
<goals />
<inherited />
<configuration />
</plugin>
</plugins>
</pluginManagement>
<plugins>
<!--参见build/pluginManagement/plugins/plugin元素 -->
<plugin>
<groupId />
<artifactId />
<version />
<extensions />
<executions>
<execution>
<id />
<phase />
<goals />
<inherited />
<configuration />
</execution>
</executions>
<dependencies>
<!--参见dependencies/dependency元素 -->
<dependency>
......
</dependency>
</dependencies>
<goals />
<inherited />
<configuration />
</plugin>
</plugins>
</build>
<!--模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径 -->
<modules />
<!--发现依赖和扩展的远程仓库列表。 -->
<repositories>
<!--参见repositories/repository元素 -->
<repository>
<releases>
<enabled />
<updatePolicy />
<checksumPolicy />
</releases>
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
</snapshots>
<id />
<name />
<url />
<layout />
</repository>
</repositories>
<!--发现插件的远程仓库列表,这些插件用于构建和报表 -->
<pluginRepositories>
<!--包含需要连接到远程插件仓库的信息.参见repositories/repository元素 -->
<pluginRepository>
<releases>
<enabled />
<updatePolicy />
<checksumPolicy />
</releases>
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
</snapshots>
<id />
<name />
<url />
<layout />
</pluginRepository>
</pluginRepositories>
<!--该元素描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。要获取更多信息,请看项目依赖机制。 -->
<dependencies>
<!--参见dependencies/dependency元素 -->
<dependency>
......
</dependency>
</dependencies>
<!--不赞成使用. 现在Maven忽略该元素. -->
<reports />
<!--该元素包括使用报表插件产生报表的规范。当用户执行"mvn site",这些报表就会运行。 在页面导航栏能看到所有报表的链接。参见reporting元素 -->
<reporting>
......
</reporting>
<!--参见dependencyManagement元素 -->
<dependencyManagement>
<dependencies>
<!--参见dependencies/dependency元素 -->
<dependency>
......
</dependency>
</dependencies>
</dependencyManagement>
<!--参见distributionManagement元素 -->
<distributionManagement>
......
</distributionManagement>
<!--参见properties元素 -->
<properties />
</profile>
</profiles>
<!--模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径 -->
<modules />
<!--发现依赖和扩展的远程仓库列表。 -->
<repositories>
<!--包含需要连接到远程仓库的信息 -->
<repository>
<!--如何处理远程仓库里发布版本的下载 -->
<releases>
<!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 -->
<enabled />
<!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 -->
<updatePolicy />
<!--当Maven验证构件校验文件失败时该怎么做:ignore(忽略),fail(失败),或者warn(警告)。 -->
<checksumPolicy />
</releases>
<!-- 如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的
策略。例如,可能有人会决定只为开发目的开启对快照版本下载的支持。参见repositories/repository/releases元素 -->
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
</snapshots>
<!--远程仓库唯一标识符。可以用来匹配在settings.xml文件里配置的远程仓库 -->
<id>banseon-repository-proxy</id>
<!--远程仓库名称 -->
<name>banseon-repository-proxy</name>
<!--远程仓库URL,按protocol://hostname/path形式 -->
<url>http://192.168.1.169:9999/repository/</url>
<!-- 用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven 2为其仓库提供了一个默认的布局;然
而,Maven 1.x有一种不同的布局。我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。 -->
<layout>default</layout>
</repository>
</repositories>
<!--发现插件的远程仓库列表,这些插件用于构建和报表 -->
<pluginRepositories>
<!--包含需要连接到远程插件仓库的信息.参见repositories/repository元素 -->
<pluginRepository>
......
</pluginRepository>
</pluginRepositories>
<!--该元素描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。要获取更多信息,请看项目依赖机制。 -->
<dependencies>
<dependency>
<!--依赖的group ID -->
<groupId>org.apache.maven</groupId>
<!--依赖的artifact ID -->
<artifactId>maven-artifact</artifactId>
<!--依赖的版本号。 在Maven 2里, 也可以配置成版本号的范围。 -->
<version>3.8.1</version>
<!-- 依赖类型,默认类型是jar。它通常表示依赖的文件的扩展名,但也有例外。一个类型可以被映射成另外一个扩展名或分类器。类型经常和使用的打包方式对应,
尽管这也有例外。一些类型的例子:jar,war,ejb-client和test-jar。如果设置extensions为 true,就可以在 plugin里定义新的类型。所以前面的类型的例子不完整。 -->
<type>jar</type>
<!-- 依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面。例如,如果你想要构建两个单独的构件成
JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,你就可以使用分类器来生成两个单独的JAR构件。 -->
<classifier></classifier>
<!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。 - compile :默认范围,用于编译 - provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
- runtime: 在执行时需要使用 - test: 用于test任务时使用 - system: 需要外在提供相应的元素。通过systemPath来取得
- systemPath: 仅用于范围为system。提供相应的路径 - optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用 -->
<scope>test</scope>
<!--仅供system范围使用。注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件系统上的路径。需要绝对路径而不是相对路径。推荐使用属性匹配绝对路径,例如${java.home}。 -->
<systemPath></systemPath>
<!--当计算传递依赖时, 从依赖构件列表里,列出被排除的依赖构件集。即告诉maven你只依赖指定的项目,不依赖项目的依赖。此元素主要用于解决版本冲突问题 -->
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
<!--可选依赖,如果你在项目B中把C依赖声明为可选,你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。可选依赖阻断依赖的传递性。 -->
<optional>true</optional>
</dependency>
</dependencies>
<!--不赞成使用. 现在Maven忽略该元素. -->
<reports></reports>
<!--该元素描述使用报表插件产生报表的规范。当用户执行"mvn site",这些报表就会运行。 在页面导航栏能看到所有报表的链接。 -->
<reporting>
<!--true,则,网站不包括默认的报表。这包括"项目信息"菜单中的报表。 -->
<excludeDefaults />
<!--所有产生的报表存放到哪里。默认值是${project.build.directory}/site。 -->
<outputDirectory />
<!--使用的报表插件和他们的配置。 -->
<plugins>
<!--plugin元素包含描述报表插件需要的信息 -->
<plugin>
<!--报表插件在仓库里的group ID -->
<groupId />
<!--报表插件在仓库里的artifact ID -->
<artifactId />
<!--被使用的报表插件的版本(或版本范围) -->
<version />
<!--任何配置是否被传播到子项目 -->
<inherited />
<!--报表插件的配置 -->
<configuration />
<!--一组报表的多重规范,每个规范可能有不同的配置。一个规范(报表集)对应一个执行目标 。例如,有1,2,3,4,5,6,7,8,9个报表。1,2,5构成A报表集,对应一个执行目标。2,5,8构成B报表集,对应另一个执行目标 -->
<reportSets>
<!--表示报表的一个集合,以及产生该集合的配置 -->
<reportSet>
<!--报表集合的唯一标识符,POM继承时用到 -->
<id />
<!--产生报表集合时,被使用的报表的配置 -->
<configuration />
<!--配置是否被继承到子POMs -->
<inherited />
<!--这个集合里使用到哪些报表 -->
<reports />
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
<!-- 继承自该项目的所有子项目的默认依赖信息。这部分的依赖信息不会被立即解析,而是当子项目声明一个依赖(必须描述group ID和 artifact
ID信息),如果group ID和artifact ID以外的一些信息没有描述,则通过group ID和artifact ID 匹配到这里的依赖,并使用这里的依赖信息。 -->
<dependencyManagement>
<dependencies>
<!--参见dependencies/dependency元素 -->
<dependency>
......
</dependency>
</dependencies>
</dependencyManagement>
<!--项目分发信息,在执行mvn deploy后表示要发布的位置。有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库。 -->
<distributionManagement>
<!--部署项目产生的构件到远程仓库需要的信息 -->
<repository>
<!--是分配给快照一个唯一的版本号(由时间戳和构建流水号)?还是每次都使用相同的版本号?参见repositories/repository元素 -->
<uniqueVersion />
<id>banseon-maven2</id>
<name>banseon maven2</name>
<url>file://${basedir}/target/deploy</url>
<layout />
</repository>
<!--构件的快照部署到哪里?如果没有配置该元素,默认部署到repository元素配置的仓库,参见distributionManagement/repository元素 -->
<snapshotRepository>
<uniqueVersion />
<id>banseon-maven2</id>
<name>Banseon-maven2 Snapshot Repository</name>
<url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshot</url>
<layout />
</snapshotRepository>
<!--部署项目的网站需要的信息 -->
<site>
<!--部署位置的唯一标识符,用来匹配站点和settings.xml文件里的配置 -->
<id>banseon-site</id>
<!--部署位置的名称 -->
<name>business api website</name>
<!--部署位置的URL,按protocol://hostname/path形式 -->
<url>
scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web
</url>
</site>
<!--项目下载页面的URL。如果没有该元素,用户应该参考主页。使用该元素的原因是:帮助定位那些不在仓库里的构件(由于license限制)。 -->
<downloadUrl />
<!--如果构件有了新的group ID和artifact ID(构件移到了新的位置),这里列出构件的重定位信息。 -->
<relocation>
<!--构件新的group ID -->
<groupId />
<!--构件新的artifact ID -->
<artifactId />
<!--构件新的版本号 -->
<version />
<!--显示给用户的,关于移动的额外信息,例如原因。 -->
<message />
</relocation>
<!-- 给出该构件在远程仓库的状态。不得在本地项目中设置该元素,因为这是工具自动更新的。有效的值有:none(默认),converted(仓库管理员从
Maven 1 POM转换过来),partner(直接从伙伴Maven 2仓库同步过来),deployed(从Maven 2实例部 署),verified(被核实时正确的和最终的)。 -->
<status />
</distributionManagement>
<!--以值替代名称,Properties可以在整个POM中使用,也可以作为触发条件(见settings.xml配置文件里activation元素的说明)。格式是<name>value</name>。 -->
<properties />
</project>