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

相关文章

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

IDEA Maven提示:未解析的依赖项的问题及解决

《IDEAMaven提示:未解析的依赖项的问题及解决》:本文主要介绍IDEAMaven提示:未解析的依赖项的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录IDEA Maven提示:未解析的依编程赖项例如总结IDEA Maven提示:未解析的依赖项例如

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

Maven中的profiles使用及说明

《Maven中的profiles使用及说明》:本文主要介绍Maven中的profiles使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录主要用途定义 Profiles示例:多环境配置激活 Profiles示例:资源过滤示例:依赖管理总结Maven 中的

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

maven私服配置全过程

《maven私服配置全过程》:本文主要介绍maven私服配置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录使用Nexus作为 公司maven私服maven 私服setttings配置maven项目 pom配置测试效果总结使用Nexus作为 公司maven私