【学习笔记】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

相关文章

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

MySQL数据类型与表操作全指南( 从基础到高级实践)

《MySQL数据类型与表操作全指南(从基础到高级实践)》本文详解MySQL数据类型分类(数值、日期/时间、字符串)及表操作(创建、修改、维护),涵盖优化技巧如数据类型选择、备份、分区,强调规范设计与... 目录mysql数据类型详解数值类型日期时间类型字符串类型表操作全解析创建表修改表结构添加列修改列删除列

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不