• Maven—POM简介


    一、什么是POM?

    项目对象模型(POM)是Maven中的基本工作单元。它是一个XML文件,包含有关项目的信息以及Maven用于构建项目的配置详细信息。它包含大多数项目的默认值。例如构建目录,它是目标;源目录,它是src/main/java;测试源目录,为src/test/java;等等。当执行任务或目标时,Maven会在当前目录中查找POM。它读取POM,获得所需的配置信息,然后执行目标。
    POM中可以指定的一些配置包括项目依赖项、可以执行的插件或目标、构建配置文件等。还可以指定其他信息,如项目版本、描述、开发人员、邮件列表等。

    二、超级POM

    超级POM是Maven的默认POM。除非明确设置,否则所有POM都会扩展超级POM,这意味着超级POM中指定的配置将由您为项目创建的POM继承。

    三、最小POM

    POM的最低要求如下:

    • project root
    • modelVersion-应设置为4.0.0
    • groupId-项目组的id。
    • artifactId-工件(项目)的id
    • version-指定组下工件的版本

    示例:

    1. <project>
    2. <modelVersion>4.0.0</modelVersion>
    3. <groupId>com.mycompany.app</groupId>
    4. <artifactId>my-app</artifactId>
    5. <version>1</version>
    6. </project>

     POM要求配置其groupId、artifactId和版本。这三个值构成了项目的完全限定工件名称。其形式为:<版本>。对于上面的例子,其完全限定的工件名称是“com.mycompany.app:myApp:1”。
    此外,正如第一节中提到的,如果没有指定配置细节,Maven将使用它们的默认值。其中一个默认值是打包类型。每个Maven项目都有一种打包类型。如果在POM中没有指定,那么将使用默认值“jar”。
    此外,您可以看到在最小POM中没有指定存储库。如果您使用最小POM构建项目,它将继承Super POM中的存储库配置。因此,当Maven在最小POM中看到依赖项时,它就会知道这些依赖项将从https://repo.maven.apache.org/maven2其在Super POM中规定。

    四、项目继承

    合并的POM中的元素如下:

    • dependencies
    • developers and contributors
    • plugin lists (including reports)
    • plugin executions with matching ids
    • plugin configuration
    • resources

    Super POM是项目继承的一个示例,但是您也可以通过在POM中指定父元素来引入自己的父POM,如以下示例所示。 

    1、Example 1

    场景

    举个例子,让我们重用我们以前的工件com.mycompany.app:myApp:1。让我们介绍另一个工件,com.mycompany.app:my-module:1.

    1. <project>
    2. <modelVersion>4.0.0</modelVersion>
    3. <groupId>com.mycompany.app</groupId>
    4. <artifactId>my-module</artifactId>
    5. <version>1</version>
    6. </project>

    让我们指定它们的目录结构如下:

    1. .
    2. |-- my-module
    3. | `-- pom.xml
    4. `-- pom.xml

    注:my-module/pom.xml是com.mycompany.app:my-module:1的pom,pom.xml是com.mycompany.app:my-app:1的pom

    解决方案

    现在,如果我们要将com.mycompany.app:myApp:1变成com.mycompany.app:my-module:1的父工件,我们必须将com.mycompany.app:my-moduler:1的POM修改为以下配置:

    com.mycompany.app:my-module:1's POM

    1. <project>
    2. <modelVersion>4.0.0</modelVersion>
    3. <parent>
    4. <groupId>com.mycompany.app</groupId>
    5. <artifactId>my-app</artifactId>
    6. <version>1</version>
    7. </parent>
    8. <groupId>com.mycompany.app</groupId>
    9. <artifactId>my-module</artifactId>
    10. <version>1</version>
    11. </project>

    请注意,我们现在添加了一个部分,即父部分。本节允许我们指定哪个工件是POM的父工件。我们通过指定父POM的完全限定工件名称来实现这一点。有了这个设置,我们的模块现在可以继承父POM的一些属性。
    或者,如果您希望模块的groupId或版本与其父模块相同,则可以在其POM中删除模块的groupId或版本标识。

    1. <project>
    2. <modelVersion>4.0.0</modelVersion>
    3. <parent>
    4. <groupId>com.mycompany.app</groupId>
    5. <artifactId>my-app</artifactId>
    6. <version>1</version>
    7. </parent>
    8. <artifactId>my-module</artifactId>
    9. </project>

     2、Example 2

    场景

    然而,如果父项目已经安装在我们的本地存储库中,或者位于特定的目录结构中(父pom.xml比模块的pom.xml高一个目录),那么这将起作用。
    但是,如果父目录尚未安装,并且目录结构如以下示例所示,该怎么办?

    1. .
    2. |-- my-module
    3. | `-- pom.xml
    4. `-- parent
    5. `-- pom.xml

    解决方案 

    为了解决这个目录结构(或任何其他目录结构),我们必须将元素添加到父节中。

    1. <project>
    2. <modelVersion>4.0.0</modelVersion>
    3. <parent>
    4. <groupId>com.mycompany.app</groupId>
    5. <artifactId>my-app</artifactId>
    6. <version>1</version>
    7. <relativePath>../parent/pom.xml</relativePath>
    8. </parent>
    9. <artifactId>my-module</artifactId>
    10. </project>

    顾名思义,它是从模块的pom.xml到父级pom.xml的相对路径。

    五、项目聚合

    项目聚合类似于项目继承。但是,它不是从模块中指定父POM,而是从父POM中指定模块。通过这样做,父项目现在知道了它的模块,如果对父项目调用Maven命令,那么该Maven命令也将对父项目的模块执行。要进行项目聚合,必须执行以下操作: 

    1. 将父pom包装更改为值“pom”。
    2. 在父POM中指定其模块(子POM)的目录。

     Example 3

    场景

    给定先前的原始工件POM和目录结构:

    com.mycompany.app:my-app:1's POM

    1. <project>
    2. <modelVersion>4.0.0</modelVersion>
    3. <groupId>com.mycompany.app</groupId>
    4. <artifactId>my-app</artifactId>
    5. <version>1</version>
    6. </project>

    com.mycompany.app:my-module:1's POM

    1. <project>
    2. <modelVersion>4.0.0</modelVersion>
    3. <groupId>com.mycompany.app</groupId>
    4. <artifactId>my-module</artifactId>
    5. <version>1</version>
    6. </project>

     directory structure

    1. .
    2. |-- my-module
    3. | `-- pom.xml
    4. `-- pom.xml

    解决方案 

    如果我们要将我的模块聚合到我的应用程序中,我们只需要修改我的应用。

    1. <project>
    2. <modelVersion>4.0.0</modelVersion>
    3. <groupId>com.mycompany.app</groupId>
    4. <artifactId>my-app</artifactId>
    5. <version>1</version>
    6. <packaging>pom</packaging>
    7. <modules>
    8. <module>my-module</module>
    9. </modules>
    10. </project>

    在修订后的com.mycompany.app:myApp:1中,添加了包装部分和模块部分。对于包装,它的值被设置为“pom”,对于模块部分,我们有元素my-module。<module>的值是从com.mycompany.app:myApp:1到com.mycompany.app:my-module:1的POM的相对路径(在实践中,我们使用模块的artifactId作为模块目录的名称)。
    现在,每当Maven命令处理com.mycompany.app:myApp:1时,同样的Maven命令也会针对com.mycompany.app:my-module:1运行。此外,有些命令(特别是目标)处理项目聚合的方式不同。 

    六、项目插值和变量

    Maven鼓励的实践之一是不要重复自己。然而,在某些情况下,您需要在几个不同的位置使用相同的值。为了帮助确保值只指定一次,Maven允许您在POM中使用自己的变量和预定义的变量。
    例如,要访问project.version变量,您可以这样引用它:

    1. <properties>
    2. <project.version>2.7.0</dubbo.version>
    3. </properties>
    4. <dependencies>
    5. <dependency>
    6. <groupId>org.apache.dubbo</groupId>
    7. <artifactId>dubbo</artifactId>
    8. <version>${project.version}</version>
    9. </dependency>
    10. </dependencies>

    需要注意的一个因素是,这些变量是在继承之后处理的,如上所述。这意味着如果父项目使用变量,那么它在子项目中的定义(而不是父项目)将是最终使用的定义。

  • 相关阅读:
    SpringBoot 使用JDBC
    Oracel增加IP白名单限制
    矢量绘图软件 Sketch mac中文版介绍
    API安全防护解决方案
    swift指针&内存管理-指针类型使用
    创建文件~~~
    浅谈APP弱网优化
    虚拟化简介
    MySQL数据库 主从复制与读写分离
    C++怎么读取XML文件?
  • 原文地址:https://blog.csdn.net/leesinbad/article/details/133861664