官网地址: http://maven.apache.org/pom.html
搜索项目需要的依赖: https://mvnrepository.com/
pom.xml介绍
项目对象模型(POM)是Maven中的基本工作单元。它是一个XML文件,包含有关项目的信息和Maven用于构建项目的配置细节。它包含大多数项目的默认值。例如构建目录,它是target源目录,即src/main/java;测试源目录,即src/test/java;等等。在执行任务或目标时,Maven会在当前目录中查找POM。它读取POM,获取所需的配置信息,然后执行目标。
常见的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.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
<pom.xml>elements | Description |
---|---|
project | 所有pom.xml文件的顶级元素 |
modelVersion | 该POM使用的对象模型的版本。 |
groupId | 创建项目的组织或组的唯一标识符。例如org.apache.maven.plugins ,为所有Maven插件指定的groupId。 |
artifactId | 工件名,也是实际项目的名称。项目的主要工件通常是一个JAR文件。由Maven生成的工件将具有-的形式(例如myapp-1.0.jar )。 |
version | 项目生成工件的版本 |
packaging | 此工件使用的包装类型(例如JAR,WAR,EAR等),默认是jar ,大多数项目可以不设置。 |
name | 用于项目的显示名称。 |
url | 指示可以在哪里找到项目的站点 |
description | 项目的基本描述。 |
dependencies | 该项目所需要的依赖 |
<dependency>element | Description |
---|---|
groupId | 同上 |
artifactId | 同上 |
version | 同上 |
scope | 依赖项的范围- compile , runtime , test , system , provided 。用于计算用于编译,测试等的各种类路径。它还有助于确定要在此项目的分发中包括哪些工件。 |
Super POM
http://maven.apache.org/ref/3.6.3/maven-model-builder/super-pom.html
Super POM是Maven的默认POM , 除非显式地设置,否则所有POM都扩展Super POM,这意味着在Super POM中指定的配置由您为项目创建的POM继承。
项目继承
合并的POM中的元素如下:
- 依存关系
- 开发者和贡献者
- 插件列表(包括报告)
- 具有匹配ID的插件执行
- 插件配置
- 资源
Super POM是项目继承的一个示例,但是您也可以通过在POM中指定父元素<parent>
来设置自己的 parent POM
例如: 如果要将com.mycompany.app:my-app:1
转换为com.mycompany.app:my-module:1
的父工件,则必须对com.mycompany.app:my-module: 1
的POM进行以下配置
<!--com.mycompany.app:my-app:1's POM-->
<project>
...
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
...
</project>
<!--com.mycompany.app:my-module:1's POM-->
<project>
...
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1</version>
...
</project>
第一种情况:目录结构如下,父pom.xml比module的pom.xml高一个目录
--my-module
--pom.xml
--pom.xml
现在添加一个父部分。这个部分允许我们指定哪个工件是POM的父组件。我们通过指定父POM的完全限定工件名称来实现这一点。通过这种设置,我们的模块现在可以继承父POM的一些属性。
<!--com.mycompany.app:my-module:1 pom.xml-->
<project>
...
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1</version>
...
</project>
或者,如果我们希望您模块的groupId或版本与它们的父模块相同,您可以在其POM中删除模块的groupId或版本标识 , 这允许模块继承其父POM的groupId和/或版本。
<!--com.mycompany.app:my-module:1 pom.xml-->
<project>
...
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</parent>
<artifactId>my-module</artifactId>
...
</project>
第二种情况:目录结构如下,父pom.xml和module的pom.xml在同一个层次
--my-module
--pom.xml
--parent
--pom.xml
需要将<relativePath>
添加到<parent>
中, 它是从module的pom .xml到父的pomm .xml的相对路径。
<!--com.mycompany.app:my-module:1 pom.xml-->
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<artifactId>my-module</artifactId>
</project>
项目聚合
项目聚合类似于项目继承。但是它不是从模块指定父POM,而是从父POM指定模块。通过这样做,父项目知道它的模块,如果对父项目调用Maven命令,那么该Maven命令也将对父项目的模块执行。
要进行项目汇总,您必须做到以下几点:
将父POM packaging的值更改为"pom"。
在父POM中指定其模块(子POM)的目录。
第一种情况:目录结构如下,父pom.xml比module的pom.xml高一个目录
--my-module
--pom.xml
--pom.xml
在父pom.xml里面增加<modules>
值为子模块的名称,并且要增加<packaging>
值为pom
<!--com.mycompany.app:my-app:1's POM-->
<project>
...
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>my-module</module>
</modules>
...
</project>
第二种情况:目录结构如下,父pom.xml和module的pom.xml在同一个层次
--my-module
--pom.xml
--parent
--pom.xml
在父pom.xml里面增加<modules>
值为父pom到子模块的相对路径,并且要增加<packaging>
值为pom
<!--com.mycompany.app:my-app:1's POM-->
<project>
...
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>../my-module</module>
</modules>
...
</project>
项目继承与聚合
但是,当然,您可以同时具有项目继承和项目聚合。意思是,您可以让您的模块指定一个父项目,同时让该父项目将那些Maven项目指定为其模块。您只需要应用所有三个规则:
1、在每个子POM中指定其父POM谁。
2、将父POM packaging的值更改为值“ pom”。
3、在父POM中指定其模块的目录(子POM)
目录结构
--my-module
--pom.xml
--parent
--pom.xml
<!--com.mycompany.app:my-app:1's POM-->
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>../my-module</module>
</modules>
</project>
<!--com.mycompany.app:my-module:1's POM-->
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<artifactId>my-module</artifactId>
</project>