• Maven之POM文件build标签详解


    文章目录

    1. 重新认识pom文件

    我们都知道,Maven 是一款项目构建管理和依赖管理的工具,但事实上这只是 Maven 的一部分功能,Maven 本身的产品定位是一款项目管理工具。

    下面是 spring-boot-starterPOM 文件,可以看到:除了熟悉的GAV坐标标签、dependencies 标签,还有 descriptionurlorganizationlicensesdevelopersscmissueManagement 等这些描述项目信息的标签。

    
    
    
      4.0.0
      org.springframework.boot
      spring-boot-starter
      2.5.6
      spring-boot-starter
      Core starter, including auto-configuration support, logging and YAML
      https://spring.io/projects/spring-boot
      
        Pivotal Software, Inc.
        https://spring.io
      
      
        
          Apache License, Version 2.0
          https://www.apache.org/licenses/LICENSE-2.0
        
      
      
        
          Pivotal
          info@pivotal.io
          Pivotal Software, Inc.
          https://www.spring.io
        
      
      
        scm:git:git://github.com/spring-projects/spring-boot.git
        scm:git:ssh://git@github.com/spring-projects/spring-boot.git
        https://github.com/spring-projects/spring-boot
      
      
        GitHub
        https://github.com/spring-projects/spring-boot/issues
      
    
      
        
          ……
        
      
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    从项目管理的角度来看,Maven 提供了如下这些功能:

    • 项目对象模型(POM):将整个项目本身抽象、封装为应用程序中的一个对象,以便于管理和操作。
    • 全局性构建逻辑重用:Maven 对整个构建过程进行封装之后,程序员只需要指定配置信息即可完成构建。
    • 构件的标准集合:在 Maven 提供的标准框架体系内,所有的构件都可以按照统一的规范生成和使用。
    • 构件关系定义:Maven 定义了构件之间的三种基本关系,让大型应用系统可以使用 Maven 来进行管理
      • 继承关系:通过从上到下的继承关系,将各个子构件中的重复信息提取到父构件中统一管理
      • 聚合关系:将多个构件聚合为一个整体,便于统一操作
      • 依赖关系:Maven 定义了依赖的范围、依赖的传递、依赖的排除、版本仲裁机制等一系列规范和标准,让大型项目可以有序容纳数百甚至更多依赖
    • 插件目标系统:Maven 核心程序定义抽象的生命周期,然后将插件的目标绑定到生命周期中的特定阶段,实现了标准和具体实现解耦合,让 Maven 程序极具扩展性
    • 项目描述信息的维护:我们不仅可以在 POM 中声明项目描述信息,更可以将整个项目相关信息收集起来生成 HTML 页面组成的一个可以直接访问的站点。这些项目描述信息包括:
      • 公司或组织信息
      • 项目许可证
      • 开发成员信息
      • issue 管理信息
      • SCM 信息

    2. 重要标签详解

    2.1 dependencyManagement标签

    该标签用来在根pom中管理jar包版本,如果后面的jar包没有申明版本,会以这里面的版本为主,使用该标签并不会引入jar包,一般是在父级pom文件申明,方便管理jar包版本

    2.2 build标签

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

    完整 build 标签示例在文章末尾,从中能够看到,build 标签的子标签大致包含三个主体部分:

    2.2.1 约定的目录结构

    参考附录中的如下部分:

    D:ideamaven-testsrcmainjava
    D:ideamaven-testsrcmainscripts
    D:ideamaven-testsrc	estjava
    D:ideamaven-test	argetclasses
    D:ideamaven-test	arget	est-classes
    
        
            D:ideamaven-testsrcmain
    esources
        
    
    
        
            D:ideamaven-testsrc	est
    esources
        
    
    D:ideamaven-test	arget
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    能看到各个目录的作用如下:

    目录名

    作用

    sourceDirectory

    主体源程序存放目录

    scriptSourceDirectory

    脚本源程序存放目录

    testSourceDirectory

    测试源程序存放目录

    outputDirectory

    主体源程序编译结果输出目录

    testOutputDirectory

    测试源程序编译结果输出目录

    resources

    主体资源文件存放目录

    testResources

    测试资源文件存放目录

    directory

    构建结果输出目录

    2.2.2 备用插件管理

    pluginManagement 标签存放着几个极少用到的插件:

    • maven-antrun-plugin
    • maven-assembly-plugin
    • maven-dependency-plugin
    • maven-release-plugin

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

    • spring-boot-dependencies 管理的插件信息:

      org.springframework.boot spring-boot-maven-plugin 2.6.2
    • 子工程使用的插件信息:

      org.springframework.boot spring-boot-maven-plugin

    2.2.3 生命周期插件

    plugins 标签存放的是默认生命周期中实际会用到的插件,这些插件应该都不陌生,所以抛开插件本身不谈,来看看 plugin 标签的结构:

    
        maven-compiler-plugin
        3.1
        
            
                default-compile
                compile
                
                    compile
                
            
            
                default-testCompile
                test-compile
                
                    testCompile
                
            
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2.3.3.1 坐标部分

    artifactIdversion 标签定义了插件的坐标,作为 Maven 的自带插件这里省略了 groupId

    2.3.3.2 执行部分

    executions 标签内可以配置多个 execution 标签,execution 标签内:

    • id:指定唯一标识
    • phase:关联的生命周期阶段
    • goals/goal:关联指定生命周期的目标
      • goals 标签中可以配置多个 goal 标签,表示一个生命周期环节可以对应当前插件的多个目标。

    phase元素代表的是绑定的生命周期的阶段
    goals元素代表插件的目标,插件是前面artifactId中定义好的,goals相当于该插件中的一个功能,该功能将在phase绑定的生命周期阶段执行

    另外,插件目标的执行过程可以进行配置,例如 maven-site-plugin 插件的 site 目标:

    
        default-site
        site
        
            site
        
        
            D:ideamaven-test	argetsite
            
                
                    org.apache.maven.plugins
                    maven-project-info-reports-plugin
                
            
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    configuration 标签内进行配置时使用的标签是插件本身定义的。

    结论:每个插件能够做哪些设置都是各个插件自己规定的。

    3. 典型应用

    3.1 指定 JDK 版本

    3.1.1 提出问题

    可以在Maven的配置文件中 settings.xml 中配置了 JDK 版本,那么将来把 Maven 工程部署都服务器上,脱离了settings.xml配置,如何保证程序正常运行呢?思路就是直接把 JDK 版本信息告诉负责编译操作的 maven-compiler-plugin 插件,让它在构建过程中,按照指定的信息工作

    3.1.2 暂时取消 settings.xml 配置

    为了测试对maven-compiler-plugin插件进行配置的效果,暂时取消配置文件settings.xml中的 profile 配置。

    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.1.3 编写源文件代码

    很明显这里用到了 Lambda 表达式,这是 JDK 1.8 才支持的语法

    package com.scorpios.maven;
    
    public class Hello {
    
        public void hello() {
            new Thread(()->{
                System.out.println("thread ...");
            }).start();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.1.4 配置构建过程

    
    
        
        
            
            
                
                org.apache.maven.plugins
                maven-compiler-plugin
                3.1
                
                
                
                    
                    1.8
                    1.8
                    UTF-8
                
            
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    3.1.5 两种配置方式比较

    • settings.xml 中配置:仅在本地生效,如果脱离当前 settings.xml 能够覆盖的范围,则无法生效
    • 在当前 Maven 工程 pom.xml 中配置:无论在哪个环境执行编译等构建操作都有效

    3.1.6 补充说明

    configuration标签中source 标签含义

    调用 Java 编译器命令时传入的-source参数。那对编译器来说,-source 参数是啥意思呢?

    在这里插入图片描述

    『提供与指定发行版的源兼容性』这句话理解是:

    • 我们写代码是按 JDK 1.8 写的——这就是『源兼容性』里的『源』。
    • 指定发行版就是我们指定的 JDK 1.8。

    这个功能还可以通过在 properties 标签中配置 maven.compiler.source 属性来实现。所以也经常会看到类似这样的配置:

    
        1.8
        1.8
        UTF-8
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    target 标签含义

    调用 Java 编译器命令时传入的-target参数。那对编译器来说,-target 参数是啥意思呢?
    在这里插入图片描述

    『生成特定 VM 版本的类文件』这句话理解是:

    • VMJVM
    • 类文件指 *.class 字节码文件
    • 整体意思就是源文件编译后,生成的 *.class 字节码文件要符合指定的 JVM 版本

    3.2 SpringBoot 定制化打包

    3.2.1 需求

    很显然 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 这个插件来定制打包行为。

    3.2.2 示例代码

    所有的一切已经都被 SpringBoot 封装好了,所以配置非常简单,提供插件坐标即可。

    
    
        
    	
            
    		
    			org.springframework.boot
    			spring-boot-maven-plugin
                2.5.5
    		
    	
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.2.3 插件的七个目标

    在这里插入图片描述

    目标名称

    作用

    spring-boot:build-image

    使用构建包将应用程序打包到OCI映像中

    spring-boot:build-info

    生成Actuator使用的构建信息文件build-info.properties

    spring-boot:help

    配置pom.xml文件

    spring-boot:repackage

    默认goal。在mvn package之后,再次打包可执行的jar/war,同时保留mvn package生成的jar/war为.origin

    spring-boot:run

    运行Spring Boot应用

    spring-boot:start

    在mvn integration-test阶段,进行Spring Boot应用生命周期的管理

    spring-boot:stop

    在mvn integration-test阶段,进行Spring Boot应用生命周期的管理

    3.3 Mybatis 逆向工程

    使用 Mybatis 的逆向工程需要使用如下配置,MBG 插件的特点是需要提供插件所需的依赖:

    
    
    		
    	
    	
    		
    		
    		
    			org.mybatis.generator
    			mybatis-generator-maven-plugin
    			1.3.0
    	
    			
    			
    				
    				
    				
    					org.mybatis.generator
    					mybatis-generator-core
    					1.3.2
    				
    					
    				
    				
    					com.mchange
    					c3p0
    					0.9.2
    				
    					
    				
    				
    					mysql
    					mysql-connector-java
    					5.1.8
    				
    			
    		
    	
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    3.4 小结

    通常需要用到 build 标签的时候底层都会封装好,需要自己配置的地方不多。即使有些地方需要自己配置,也不会真的需要自己去写,把现成的案例复制过来就行。

    附录:完整 build 标签

    
        
        D:ideamaven-testsrcmainjava
        D:ideamaven-testsrcmainscripts
        D:ideamaven-testsrc	estjava
        D:ideamaven-test	argetclasses
        D:ideamaven-test	arget	est-classes
        
            
                D:ideamaven-testsrcmain
    esources
            
        
        
            
                D:ideamaven-testsrc	est
    esources
            
        
        D:ideamaven-test	arget
        maven-test-1.0-SNAPSHOT
        
        
            
                
                    maven-antrun-plugin
                    1.3
                
                
                    maven-assembly-plugin
                    2.2-beta-5
                
                
                    maven-dependency-plugin
                    2.8
                
                
                    maven-release-plugin
                    2.5.3
                
            
        
        
        
            
                maven-clean-plugin
                2.5
                
                    
                        default-clean
                        clean
                        
                            clean
                        
                    
                
            
            
                maven-resources-plugin
                2.6
                
                    
                        default-testResources
                        process-test-resources
                        
                            testResources
                        
                    
                    
                        default-resources
                        process-resources
                        
                            resources
                        
                    
                
            
            
                maven-jar-plugin
                2.4
                
                    
                        default-jar
                        package
                        
                            jar
                        
                    
                
            
            
                maven-compiler-plugin
                3.1
                
                    
                        default-compile
                        compile
                        
                            compile
                        
                    
                    
                        default-testCompile
                        test-compile
                        
                            testCompile
                        
                    
                
            
            
                maven-surefire-plugin
                2.12.4
                
                    
                        default-test
                        test
                        
                            test
                        
                    
                
            
            
                maven-install-plugin
                2.4
                
                    
                        default-install
                        install
                        
                            install
                        
                    
                
            
            
                maven-deploy-plugin
                2.7
                
                    
                        default-deploy
                        deploy
                        
                            deploy
                        
                    
                
            
            
                maven-site-plugin
                3.3
                
                    
                        default-site
                        site
                        
                            site
                        
                        
                            D:ideamaven-test	argetsite
                            
                                
                                    org.apache.maven.plugins
                                    maven-project-info-reports-plugin
                                
                            
                        
                    
                    
                        default-deploy
                        site-deploy
                        
                            deploy
                        
                        
                            D:ideamaven-test	argetsite
                            
                                
                                    org.apache.maven.plugins
                                    maven-project-info-reports-plugin
                                
                            
                        
                    
                
                
                    D:ideamaven-test	argetsite
                    
                        
                            org.apache.maven.plugins
                            maven-project-info-reports-plugin
                        
                    
                
            
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
  • 相关阅读:
    手机的网费
    空域图像增强-图像滤波处理
    iOS打包 rebuild from bitcode对ipa大小的影响
    分布式中灰度方案实践
    shiro的过滤器和权限控制
    统计字符串中不同回文子序列的个数
    如何在确保身份安全的同时改善员工体验
    【软件测试】作为测试人,因工作与开发吵了一架碰撞,该咋办......
    linux内核定时器的使用
    JavaWeb:上传文件
  • 原文地址:https://blog.csdn.net/m0_67401153/article/details/126034854