maven构建过程解析

SpringBoot项目,会看到一个pom.xml文件,表示这是一个Maven工程,因为SpringBoot项目通常使用Maven作为构建工具。

Maven是什么?

Maven是一个自动化构建工具,专门服务于Java平台的项目构建和依赖管理。使得开发者可以专注于编写代码,管理项目的各种细节交给Maven。

项目构建

  1. 一般来说,项目构建的各个阶段包括 清理, 编译, 测试,打包,安装,部署。
  2. 构建项目时按照生命周期顺序一步构建,每一个阶段都有特定的插件来完成。
  3. 构建项目时需要手动执行maven命令。执行命令实际是交给对应的插件完成的。

阶段

命令

(pom目录下执行)

描述

默认插件

清理

mvn clean

删除原来编译和测试的目录,即target目录,但是已经install到仓库里的包不会删除

maven-clean-plugin

编译

mvn compile

编译主程序,会在与src统计目录下生产target目录,并把src/main/目录下的所有java代码编译成class文件并将其放在target/classes目录下

maven-compiler-plugin

测试

mvn test-compile

编译src/test目录中的源文件,把生成的class拷贝到target/test-classes目录。同时把src/test/resources目录中的文件拷贝到 test-clasess目录

maven-compiler-plugin

mvn test

测试src/main/java目录中的主程序代码是否符合要求,执行的是target/test-compile/下的类文件.会生成一个目录surefire-reports,保存测试结果

maven-surefire-plugin

打包

mvn package

打包,作用是把项目中的资源class文件和配置文件都放到一个压缩文件中, 默认压缩文件是jar类型的。web应用是war类型。放在target目录下

maven-jar-plugin

安装

mvn install

把生成的打包的文件(放在target目录下) ,并安装到maven仓库。安装目录为当前maven仓库下该项目groupID/artifactId/version/目录下

maven-install-plugin

部署

mvn deploy

将程序安装在服务器上

maven-deploy-plugin

Maven编译阶段的理解

pom.xml解析

首先要清楚pom.xml在项目构建中起到什么作用。

pom.xml 是 Maven 项目的基础配置文件,定义了项目的依赖关系、自定义插件、属性等信息。下面给出的是pom.xml的基础配置信息:


  
    
    4.0.0  
    
    
    com.example  
    my-project  
    1.0-SNAPSHOT  
  
    
      
        UTF-8  
      
    
    
    
          
          
            junit  
            junit  
            4.12  
            test  
          
      
  
    
      
        
              
              
                org.apache.maven.plugins  
                maven-compiler-plugin  
                3.8.1  
                  
                    1.8  
                    1.8  
                  
              
          
      

Maven通过执行mvn compile命令开始编译,它首先会检查pom.xml文件中的配置,确定项目的依赖项、自定义插件、属性等配置信息。然后,Maven会调用编译插件,如maven-compiler-plugin插件,该插件会进一步调用Java编译器(如javac)来编译项目中的Java源文件,pom.xml定义的依赖项在编译时会被考虑到。

为什么是插件编译?(maven-compiler-plugin)

这就是Maven的优势所在,举个例子:

假如现在有个java类:

hello.java

使用javac直接编译:

javac hello.java

这时hello.java引入其他jar,使用javac编译就要用 -classpath 或 -cp 选项指定类路径:

javac -cp .;path/to/other.jar hello.java

即你需要手动管理项目的依赖项和类路径。

而maven调用maven-compiler-plugin插件,只需要执行mvn compile命令,它会自动下载和管理项目所需的依赖项,并将它们添加到类路径中。这意味着你不需要手动管理依赖项和类路径。

传递性依赖

当Maven构建项目时,项目A依赖于项目B,而项目B又依赖于项目C时,那Maven在构建项目A的时候,Maven会自动将项目C的jar包添加到编译器的类路径中。这样,编译器就可以找到并使用项目C中的类和方法了。

依赖调解

依赖调解Maven对于引用重复依赖的一种选择机制。

  1. 路径最近者优先:Maven会优先选择路径最近的依赖。也就是说,如果两条依赖路径长度不同,那么路径较短的那条会被优先选择。
  2. 第一声明者优先:如果两条依赖路径的长度相同,那么Maven会根据依赖在pom.xml文件中的声明顺序来决定。先声明的依赖会被优先选择。
  3. 除了上述两个原则,Maven还提供了其他高级特性,如标签,允许开发者在pom.xml文件中显式地排除某些依赖,以确保最终使用的依赖版本符合项目需求。
  
  org.example  
  example-library  
  1.0.0  
    
      
      org.example.module  
      module-to-exclude  
      
    
可选依赖

一个项目可以使用其他项目中的资源,但不会将其作为依赖项传递给其他项目。

项目A依赖于项目B,项目B依赖于项目C,项目B用标签来声明可选依赖,表示该依赖是可选的。这样,当项目A引用项目B时,不会自动继承该可选依赖。

  
  com.example  
  example-library  
  1.0.0  
  true  

拓展(多模块Maven)

多模块Maven项目,你有一个父POM文件,模块1的POM文件中声明对模块2的依赖,Maven会确保在构建模块1之前先构建模块2,并且模块2的输出(通常是JAR文件)会被正确地用于构建模块1。

在大多数情况下,不需要手动将模块2打包成JAR文件,因为Maven会自动处理这些步骤。

也有例外情况,如果模块2不是一个Maven项目,那么Maven就不能直接将其作为依赖项添加到模块1中。在这种情况下,需要手动将模块2打包成JAR文件,并在模块1的构建过程中引用该JAR文件。

你可能感兴趣的:(Maven,maven,java,spring,boot)