Maven之POM介绍

news2025/1/17 23:11:58

POM介绍

  • 前言
    • POM基础
      • 为什么要学习POM
      • 什么是POM
      • Super POM
      • Minimal POM(POM的最低配置)
    • POM特点
      • Project Inheritance(项目继承性)
      • Project Aggregation(项目聚合)
      • Project Inheritance VS Project Aggregation
      • Project Interpolation and Variables(项目插值和变量)
      • Available Variables(可用变量)
      • Properties

前言

本篇博客介绍Maven的基本工作单元POM(Project Object Model)项目对象模型。通过本篇博客可以学习到POM的特性以及在项目开发中如何配置继承和聚合的Maven项目,提高Maven项目的整洁性和开发效率。

POM基础

为什么要学习POM

因为POM(Project Object Model)是maven中的基本工作单元,POM包含了关于项目的所有重要信息,基本上是一站式的,可以找到与项目相关的任何东西。理解POM对于学习maven至关重要。

什么是POM

项目对象模型(POM)是Maven中的基本工作单元。它是一个XML文件,包含有关项目的信息和Maven用于构建项目的配置细节。它包含大多数项目的默认值。当执行任务或目标时,Maven在当前目录中查找POM。它读取POM,获取所需的配置信息,然后执行目标。

Super POM

Super POM是Maven的默认POM。除非显式设置,否则所有POM都会继承Super POM,这意味着Super POM中指定的配置将由为项目创建的POM继承。
Super POM 位于Maven的安装目录的lib目录下。解压jar包可以看到
在这里插入图片描述
Super POM详情

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
 
  <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>
 
  <build>
    <directory>${project.basedir}/target</directory>
    <outputDirectory>${project.build.directory}/classes</outputDirectory>
    <finalName>${project.artifactId}-${project.version}</finalName>
    <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
    <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
    <scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
    <resources>
      <resource>
        <directory>${project.basedir}/src/main/resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>${project.basedir}/src/test/resources</directory>
      </testResource>
    </testResources>
    <pluginManagement>
      <!-- NOTE: These plugins will be removed from future versions of the super POM -->
      <!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.3</version>
        </plugin>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.2-beta-5</version>
        </plugin>
        <plugin>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>2.8</version>
        </plugin>
        <plugin>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.5.3</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
 
  <reporting>
    <outputDirectory>${project.build.directory}/site</outputDirectory>
  </reporting>
 
  <profiles>
    <!-- NOTE: The release profile will be removed from future versions of the super POM -->
    <profile>
      <id>release-profile</id>
 
      <activation>
        <property>
          <name>performRelease</name>
          <value>true</value>
        </property>
      </activation>
 
      <build>
        <plugins>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-sources</id>
                <goals>
                  <goal>jar-no-fork</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-javadoc-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-javadocs</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-deploy-plugin</artifactId>
            <configuration>
              <updateReleaseInfo>true</updateReleaseInfo>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
 
</project>

Minimal POM(POM的最低配置)

POM的最低配置只需要配置,project root,modelVersion,groupId,artifactId,version。

  • project root
  • modelVersion - should be set to 4.0.0
  • groupId - the id of the project’s group.
  • artifactId - the id of the artifact (project)
  • version - the version of the artifact under the specified group

示例1:

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>

一个pom需要配置groupId、artifactId和version。这三个值构成了项目完整的合格的构件名称。com.mycompany.app:my-app:1

注意:如果没有指定配置细节,Maven将使用它们的默认值。其中一个默认值是包装类型。每个Maven项目都有一个打包类型。如果没有在POM中指定,那么将使用默认值“jar”
你可以看到在最小的POM中没有指定存储库。如果您使用最小的POM构建项目,那么它将继承Super POM中的存储库配置。因此,当Maven看到最小POM中的依赖项时,它将知道这些依赖项将从Super POM中指定的https://repo.maven.apache.org/maven2下载。

POM特点

Project Inheritance(项目继承性)

Super POM就是一个项目继承的例子,我们也可以通过显示/指定POM中的父元素来引入我们自己的父POM。
引入父POM之后,默认继承Super POM就被新引入的父POM替换掉了。
示例2:
新建一个pom.xml

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-module</artifactId>
  <version>1</version>
</project>

当前的目录结构:

.
 |-- my-module
 |   `-- pom.xml
 `-- pom.xml

注意:my-module/ pam .xml是com.mycompanyapp:my-module:1的POM而pom .xml是com.mycompany.app:my-app:1的POM

在my-module/pom.xml中添加一个parent artifact

com.mycompany.app:my-module:1的POM

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <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>

注意,我们现在增加了一个部分,父部分。这个部分允许我们指定哪个构件是POM的父构件。我们通过指定父POM的完全限定工件名来做到这一点。通过这个设置,我们的模块现在可以继承父POM的一些属性。

另外,如果您希望模块的groupId或版本与其父模块相同,则可以在其POM中删除模块的groupId或版本标识。
如:

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>1</version>
  </parent>
 
  <artifactId>my-module</artifactId>
</project>

这允许模块继承groupId或其父POM的版本。

Project Aggregation(项目聚合)

项目聚合与项目继承很类似,通过指定来自父POM的模块(在标签中添加子项目的artifactId),通过这样做父项目知道了它的模块,如果对父项目调用Maven命令,该Maven命令也将执行到父项目中的模块中。

进行项目聚合需要进行的操作:

  1. 更改父POM的打包方式
  2. 在父POM中明确指定模块(子POM)的路径

示例3:
com.mycompany.app:my-app:1的POM

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>

com.mycompany.app:my-module:1的POM

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-module</artifactId>
  <version>1</version>
</project>

目录结构

.
 |-- my-module
 |   `-- pom.xml
 `-- pom.xml

如果我们要将my-module聚合到my-app中,我们只需要修改my-app的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>

将packaging的值设置为“pom”,将module的值设置为com.mycompany.app:my-app:1到com.mycompany.app:my-module:1的pom的相对路劲,
这里是是将moudule的artifactId作为module目录名称。

设置完成之后每当Maven命令处理com.mycompany。app:my-app:1,同样的Maven命令将在com.mycompany上运行。

示例4:
但是,如果我们将目录结构改为如下:

.
 |-- my-module
 |   `-- pom.xml
 `-- parent
     `-- pom.xml

父POM如何指定它的模块?
与例3的方法相同,通过指定模块的路径。

<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>

Project Inheritance VS Project Aggregation

如果我们有几个Maven项目,并且它们都具有类似的配置,那么我们可以通过提取那些类似的配置并创建父项目来重构您的项目。因此,您所要做的就是让Maven项目继承父项目,然后将这些配置应用于所有父项目。

如果我们有一组一起构建或处理的项目,我们可以创建一个父项目,并让父项目将这些项目声明为其模块。通过这样做,您只需要构建父进程,其余的就会随之而来。

当然,您可以同时拥有项目继承和项目聚合。这意味着,您可以让您的模块指定一个父项目,同时让父项目指定那些Maven项目作为它的模块。我们只需要应用这三条规则:

  1. Specify in every child POM who their parent POM is.
  2. Change the parent POMs packaging to the value “pom” .
  3. Specify in the parent POM the directories of its modules (children POMs)

示例5:
com.mycompany.app:my-app:1的 POM

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>

om.mycompany.app:my-module:1的POM

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-module</artifactId>
  <version>1</version>
</project>

当前目录结构

.
 |-- my-module
 |   `-- pom.xml
 `-- parent
     `-- pom.xml

同时进行项目继承和项目聚合
com.mycompany.app:my-app:1的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的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>

Project Interpolation and Variables(项目插值和变量)

Maven鼓励的一个实践是不要重复自己。但是,在某些情况下,您需要在几个不同的位置使用相同的值。为了帮助确保该值只指定一次,Maven允许您在POM中使用您自己的变量和预定义的变量。

例如访问project.version你可以这样引用他:
${project.version}
需要注意的一个因素是,这些变量是在继承之后处理的,如上所述。这意味着,如果父项目使用了一个变量,那么最终使用的将是它在子项目(而不是父项目)中的定义。

Available Variables(可用变量)

model中的任何单一值元素字段都可以作为变量引用

${project.groupId}, 
${project.version}, 
${project.build.sourceDirectory}

这些变量都是由前缀“project.”引用的。我们可能还会看到与pom有关的引用。作为前缀,或前缀完全省略-这些形式现在已被弃用,不应使用。

Properties

我们还可以将项目中定义的任何属性引用为变量。考虑下面的例子:

<project>
  ...
  <properties>
    <mavenVersion>3.0</mavenVersion>
  </properties>
 
  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-artifact</artifactId>
      <version>${mavenVersion}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-core</artifactId>
      <version>${mavenVersion}</version>
    </dependency>
  </dependencies>
  ...
</project>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《FFmpeg Basics》中文版-00-简介

欢迎 亲爱的读者们&#xff0c; 欢迎来到这本书&#xff0c;它将使您熟悉FFmpeg项目的许多有趣的特性。下面的几个大公司都是FFmpeg使用者: Facebook&#xff0c;最大的社交网络&#xff0c;用FFmpeg技术处理用户的视频。Google Chrome&#xff0c;流行的web浏览器&#xff0…

EDI通信中常用的网络排查方法

在知行之桥EDI系统运维工作中不可避免会碰到各种网络问题&#xff0c;本文将分享一些我们运维同事常用的一些网络问题排查定位方法&#xff0c;帮助大家快速的定位原因&#xff0c;解决通信问题。 1.Ping&#xff1a; 作用&#xff1a;ping用于确定本地主机是否能与另一台主机…

shell脚本下用plot给iostat和CPU的采样画图的写法

目前大多的互联网客户,在导入SSD之前&#xff0c;基本会要求OEM或者SSD厂商提供一些性能数据图&#xff0c;所以 作图也基本成了测试人员的必备技能&#xff0c;单盘的性能可以用Excel表格导入&#xff0c;但是复杂的可能会比较麻烦。就需要我们借助工具来作图了。 本篇文章简单…

第9章 Apache-Dbutils实现CRUD操作

1. Apache-DBUtils简介 *commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库&#xff0c;它是对JDBC的简单封装&#xff0c;学习成本极低&#xff0c;并且使用dbutils能极大简化jdbc编码的工作量&#xff0c;同时也不会影响程序的性能。 *API介绍&#xff1a; org.…

java和vue的大学生奖学金助学金系统奖学金系统助学金系统

简介 大学生奖学金助学金系统。学生申请自己需要的奖助学金&#xff0c;上传证明材料。该学院的辅导员可以下载学生的证明材料以及根据学生的综合成绩来审核是否通过&#xff0c;若不通过请输入不通过原因。管理员可以导入学生excel和辅导员excel以及学生综合成绩excel、分布公…

鲲鹏代码迁移工具介绍

鲲鹏代码迁移工具介绍 代码迁移工具介绍 代码迁移工具是什么&#xff1f; ✨我们为什么会需要用到代码迁移工具&#xff1f; ✨处理器所支持的指令集不同&#xff0c;意味着开发者可能需要对代码进行跨平台的迁移。 这里我们常见到便是x86平台的代码往arm平台进行迁移 通常…

主流组件库学习

主流组件库差异性对比 NutUI - 京东研发的移动端 UI 组件库&#xff0c;支持 Vue3、Taro 多端适配&#xff0c;面向电商业务场景Vant - 有赞研发的移动端 UI 组件库&#xff0c;支持 Vue3、微信小程序、支付宝小程序TDesign Mobile - 腾讯研发的移动端组件库&#xff0c;适合在…

Redis第二章_实战篇_短信登录+缓存策略+秒杀+分布式锁>>

Redis第二章_实战篇_短信登录缓存策略秒杀分布式锁>> 文章目录Redis第二章_实战篇_短信登录缓存策略秒杀分布式锁>>开篇导读1、短信登录1.1、导入黑马点评项目1.1.1 、导入SQL1.1.2、有关当前模型1.1.3、导入后端项目1.1.4、导入前端工程1.1.5 运行前端项目1.2 、基…

Spring(十一)- Spring Bean的依赖注入注解

文章目录一、Spring Bean的依赖注入注解1. 通过Value直接注入普通属性2. 通过Value注入properties文件中的属性3. Autowired注解&#xff0c;用于根据类型进行注入4. Qualifier配合Autowired可以完成根据名称注入Bean实例&#xff0c;使用Qualifier指定名称5. Resource注解既可…

三款Zookeeper可视化工具、ZooInspector、prettyZoo、ZooKeeperAssistant

三款Zookeeper可视化工具、ZooInspector、prettyZoo、ZooKeeperAssistant①Zookeeper图形化工具&#xff1a;ZooInspector1.下载完后&#xff0c;解压压缩包&#xff0c;进入zookeeper-dev-ZooInspector.jar目录后执行run jar包命令2.登录客户端&#xff1a;输入zk服务的ip和端…

XCTF1-web disabled_button weak_auth view_source cookie backup

一个不能按的按钮 题目描述 X老师今天上课讲了前端知识&#xff0c;然后给了大家一个不能按的按钮&#xff0c;小宁惊奇地发现这个按钮按不下去&#xff0c;到底怎么才能按下去呢&#xff1f; 进入场景 题目提示为前端设置的问题&#xff0c;查看网页源码&#xff0c;定位…

Django + Nginx https部署实战(第二辑)

如何使用Nginx把网站升级为Https&#xff1f; Https是Http协议的升级版&#xff0c;由于证书的引入&#xff0c;使得用户与网站之间的通讯变得更加安全。 在使用https之前&#xff0c;我们必须了解的事情 证书颁发机构 证书颁发机构是一家知名且受信任的组织&#xff0c;它对网…

基于MMDetection训练VOC格式数据集

一 环境说明 基于前述安装MMDetection&#xff0c;数据集为VOC格式&#xff0c;主要版本如下&#xff1a; Python&#xff1a;3.7.8 CUDA&#xff1a;11.3 cuDNN&#xff1a;8.4.0 torch&#xff1a;1.12.0 torchvision&#xff1a;0.13.0 mmcv-full&#xff1a;1.6.0 MMDetec…

机器学习极简入门笔记-5-无监督学习-K-means

目录 第17章 KNN算法&#xff08;有监督学习算法&#xff0c;放在此位置是为了与下一章的K-means做对比&#xff09; 17.1 KNN算法原理 17.2 KNN中的K 第18章 K-means——最简单的聚类算法 18.1 K-means算法步骤 18.2 K-means算法具体细节 18.3 启发式算法 18.4 K-mean…

介绍a股level2数据接口委托队列的作用

a股level2数据接口可以实现量化交易的准确性&#xff0c;那用户在交易的过程中会发现在“委托队列”中&#xff0c;如果出现一些有规律性的单子&#xff0c;往往是主力之间的盘口暗语。 例如排在靠前的都是大单&#xff0c;封单相当坚决&#xff0c;如果细心一点还会发现都是拖…

Spring Security 自定义拦截器Filter实现登录认证

前言 需求来源: 微信小程序获取授权码code, 通过授权码code, 获取微信用户信息(比如openid,unionId), 并记录登录状态(比如token信息的获取); 原本打算使用Spring Security中OAuth2.0的机制 实现用小程序登录&#xff0c;发现小程序再已经获取授权码code登录流程和Spring Secu…

Intellij插件之~图形界面Swing UI Designer

资料 Java Swing 介绍 JavaFX快速入门 Java Swing 图形界面开发简介 GUI Designer Basics scrcpy ScrcpyController Services&#xfeff; 创建一个Gui Form文件(类form文件) 创建一个Gui Form 此时生成两个类, 是自动关联的 鼠标可以拖入控件,每拖入一个组件,在TestForm…

领悟《信号与系统》之 信号与系统的描述-下节

信号与系统的描述-下节一、信号的基本运算1. 信号的基本运算1. 加法 、减法2. 乘法、除法3. 微分 、差分4.积分、迭分2. 关于时间&#xff08;自变量&#xff09;的运算1. 位移2. 反折3. 尺度变换二、阶跃信号与冲激信号1. 单位阶跃信号2. 单位阶跃信号的特性3. 单位冲激信号4.…

Android架构师学习必备学习宝典《Android架构开发手册》

吐槽 我想每个程序员在写代码的时候可能都有这些历程(夸张)&#xff1a; 这坨代码谁写的&#xff0c;怎么要这样写啊&#xff0c;我这个需求该怎么加代码&#xff01;(尝试在shit山上小心地走&#xff0c;并添加新代码)写的好难受&#xff0c;shit越改越chou了…算了&#xf…

协程设计原理

文章目录1、协程的背景1.1、同步与异步1.2、为什么使用协程1.3、协程的适用场景2、协程的原语操作3、协程的切换3.1、汇编实现4、协程的定义4.1、多状态集合设计4.2、调度器的定义4.2、调度策略生产者消费者模式多状态运行5、api 封装5.1、hook 机制5.2、hook 函数原型5.3、hoo…