【学习笔记】Maven高级01:POM深入了解

2024-06-21 07:12

本文主要是介绍【学习笔记】Maven高级01:POM深入了解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、POM的四个层次
    • 超级POM
    • 父POM
    • 当前POM
    • 有效POM(effective pom)
  • 二、属性的声明和引用
    • 使用 mvn help:evaluate查看属性
    • 通过Maven访问系统属性
      • 1、访问Java系统属性
      • 2、访问系统属性
      • 4、访问系统环境变量
      • 5、访问project属性
        • 访问一级标签
        • 访问子标签
        • 访问标签列表
      • 6、访问全局配置settings
  • 三、Build标签详解
    • 3.1 如何查看build标签
    • 3.2 标签的组成
      • 3.2.1 各个标签的作用
      • 3.2.2 备用插件管理
      • 3.2.3 生命标签插件
        • 生命标签插件小结
    • 3.3 典型应用
      • 应用1:指定JDK版本
      • 应用2:SpringBoot 定制化打包
      • 应用3:Mybatis的逆向工程


一、POM的四个层次

超级POM

POM确实存在继承关系,如果一个POM没有指定继承的POM,也会默认继承一个超级POM

经过我们前面的学习,我们看到 Maven 在构建过程中有很多默认的设定,例如:源文件存放的目录、测试源文件存放的目录、构建输出的目录.…等等。但是其实这些要素也都是被 Maven 定义过的。定义的位置就是:超级POM.

image-20240617162353211

超级Pom的内容:

  • 指定默认的maven仓库
  • build标签,定义文件构建路径
  • 指定默认插件
  • 等等

父POM

明确指定继承关系

image-20240617162754651

当前POM

最关注,使用最多的一层,配置POM主要配置的就是当前POM

有效POM(effective pom)

当前POM叠加超级POM和父POM,组成最终的有效POM文件。

配置优先级以子级优先

使用mvn help:effective-pom指令即可查看有效pom

二、属性的声明和引用

使用 mvn help:evaluate查看属性

输入指令 mvn help:evaluate,直到出现如下提示后

image-20240617163848509

通过Maven访问系统属性

1、访问Java系统属性

使用java代码获取

public static void main(String[] args) {Properties properties = System.getProperties();properties.list(System.out);
}

内容如下:

-- listing properties --
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=D:\javaapp\jdk1.8\jre\bin
java.vm.version=25.202-b08
java.vm.vendor=Oracle Corporation
java.vendor.url=http://java.oracle.com/
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.script=
user.country=CN
.....

只要是能号展示出来的变量,POM都可以获取,举个例子

image-20240617164322429

2、访问系统属性

比如${java.runtime.name}

image-20240617164453586

4、访问系统环境变量

加上env即可,比如${env.JAVA_HOME}

image-20240617164537628

5、访问project属性

可以使用project.xxx来访问当前POM中的元素值

访问一级标签

${project.标签名}

访问子标签

${project.子标签.标签名}

访问标签列表

${project.子标签.标签名[下标]}

比如声明了一些子模块

image-20240617165212339

image-20240617165224691

6、访问全局配置settings

前缀加${settings.xxx},访问全局配置

image-20240617172113779

三、Build标签详解

3.1 如何查看build标签

在实际使用 Maven 的过程中,我们会发现 build 标签有时候有,有时候没,这是怎么回事呢?其实通过有效POM 我们能够看到,build 标签的相关配置其实一直都在,只是在我们需要定制构建过程的时候才会通过配置build 标签覆盖默认值或补充配置。

这一点我们可以通过打印有效 POM 来看到。mvn help:effective-pom

配置build标签是对超级POM的补充配置,只有在默认的配置无法满足时,才会修改该标签。

3.2 标签的组成

3.2.1 各个标签的作用

image-20240617172521377

3.2.2 备用插件管理

通过 pluginManagement 标签管理起来的插件就像 dependencyManagement 一样,子工程使用时可以省略版本号,起到在父工程中统一管理版本的效果

3.2.3 生命标签插件

执行部分excutions标签里有多个excution标签

  • id 指定唯一标识
  • phase:管理的声明周期阶段
    • clean
    • test
    • compile
    • install
    • 等等
  • goals : 关联指定的声明周期的目标
    • 当配置多个goal标签时,标识一个生命周期环节可以对应当前插件的多个目标

另外,还可以对插件目标的执行过程进行配置*(非常深入的时候)*。举个例子

image-20240617173212425

生命标签插件小结

每个插件能做哪些设置,都是具体插件自己规定的,不能一概而论

3.3 典型应用

应用1:指定JDK版本

常见的通过在父级POM指定jdk版本

image-20240617174156792

  <!--构建相关的配置--><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>${java.version}</source><target>${java.version}</target><encoding>${project.build.sourceEncoding}</encoding></configuration></plugin></plugins></build>

image-20240617174253196

应用2:SpringBoot 定制化打包

很显然spring·boot-maven·plugin并不是 Maven 自带的插件,而是 SpringBoot 提供的,用来改变 Maven 默认的构建行为。具体来说是改变打包的行为。默认情况下 Maven 调用 maven-jar·plugin 插件的jar 目标,生成普通的jar 包。
普通 jar 包没法使用 java -jar xxx.jar 这样的命令来启动、运行,但是 SpringBoot 的设计理念就是每一个『微服务』导出为一个jar 包,这个jar 包可以使用 java -jar xxx.jar 这样的命令直接启动运行。这样一来,打包的方式肯定要进行调整,所以SpringBoot提供了 spring·boot.maven·plugin 这个插件来定制打包行为。

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.5.15</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins><finalName>${project.artifactId}</finalName>
</build>

应用3:Mybatis的逆向工程

逆向工程的操作是以构建过程中插件形式出现的(在导入插件时,还会像插件内导入依赖)

比如在导入mybatis代码生成的时候,还会根据具体的需要导入一些数据库连接池,驱动等插件

image-20240617174940178

这篇关于【学习笔记】Maven高级01:POM深入了解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1080549

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s