Spring Boot(一)— Maven

Maven是一个跨平台的项目管理工具,主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。通过其项目对象模型(POM),可以自动下载和管理项目所需的库和插件。

1 Maven

以上的pom.xml 包含了在开发中常用的标签与功能。

<?xml version="1.0" encoding="UTF-8"?>
<!---->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <!--POM模型版本-->
  <modelVersion>4.0.0</modelVersion>
  
  <!--被继承的父项目,注意,如果没有显示标注父项目,那么其默认会继承Maven内置的一个POM(称为Super POM)-->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.4</version>
   </parent>
  
  <!--项目信息:组织ID、构建ID、版本号、项目名称-->    
  <groupId>com.huangmingfu</groupId>
  <artifactId>mvn_4</artifactId>	
  <version>0.1-SNAPSHOT</version>
  <name>mvn_4</name>
  
  <!--项目的打包方式,决定了项目构建的输出类型。常见的有:jar、war、pom、rar、maven-plugin、bundle等-->
  <packaging>jar</packaging>
  
  <!--定义属性,可以在pom中使用,也可以在pom包含的资源文件中使用-->
  <properties>
     <pom.directory>project-resources</pom.directory>
     <pom.info>pom中的描述</pom.info>
  </properties>
  
  <!--构建项目需要的信息-->
  <build>
    <!--被编译过的应用输出目录(不是生成的jar文件所在的目录,该目录由对应的插件配置来指定)-->
    <outputDirectory>./customTarget</outputDirectory>
    <!--构建产生的所有文件存放的目录 -->
    <directory>./customTarget</directory>
    <!--产生的构件的文件名,默认值是${artifactId}-${version}。 -->
    <finalName>生成文件</finalName>
    
     <!--定义构建生命周期中的扩展点。可以定义多个extension-->
    <extensions></extensions>
        
    <!--项目相关的所有资源路径,例如属性文件。这些资源被包含在最终的打包文件里-->
    <resources>
      <!--项目相关的资源路径-->
      <resource>
        <!--资源存放路径,相对于pom路径-->
        <directory>${pom.directory}</directory>
        <!--资源的目标(输出)路径,相对于outputDirectory指定的目录-->
        <targetPath>./</targetPath>
        <!--是否使用参数值来代替参数名。 参数值取自properties元素或文件里配置的属性,文件在filters元素里列出-->
        <filtering>true</filtering>
        <!--包含的文件列表模式-->
        <includes>
          <include>*.txt</include>
          <include>*.properties</include>
        </includes>
        <!--不包含的文件列表模式-->
        <excludes>
          <exclude>val*.properties</exclude>
        </excludes>
      </resource>
    </resources>
    
    <!--测试相关的所有资源路径-->
    <testResources></testResources>
    
    <!--当resource中的<filtering> 为true时生效。属性文件列表-->
    <filters>
      <!--路径相对于pom-->
      <filter>${pom.directory}/val.properties</filter>
      <filter>${pom.directory}/val2.properties</filter>
    </filters>
    
    <!--插件-->
    <plugins>
      <!--配置读取文件的编码-->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>  
        <artifactId>maven-resources-plugin</artifactId>  
        <version>3.2.0</version>  
        <configuration>  
            <encoding>UTF-8</encoding>  
        </configuration> 
      </plugin>
    </plugins>
    
    <!--与dependencyManagement元素类似,用于管理插件。 可以在其中声明插件及配置,但不会出发调用,只有当配置了plugin元素,-->
    <!--并且其groupId和artifactId与其匹配时,才会影响实际的插件行为。常用于父项目确保所有子项目使用的插件版本保持一致-->
    <pluginManagement></pluginManagement>
  </build>  
  
  <!--配置文件,可以在构建中被激活,以改变项目的默认构建行为。通常用于处理跨环境差异(开发环境、生成环境等),在命令行中使用参数-P激活:mvn package -Pdev-->
  <profiles>
      <profile>
          <!--该配置文件的唯一标识-->
          <id>dev</id>
          <!--定义什么情况下应该激活profile,可以基于系统属性、环境变量、文件存在性、操作系统、JDK版本等条件-->
          <activation></activation>        
          <!--还可以包含properties、dependencies、build、modules、reporting等元素--> 
      </profile>
  </profiles>
  
  <!--子模块,被构成项目的一部分。模块元素值是指向该模块的相对路径-->
  <modules></modules>
  
  <!--项目相关的依赖-->
  <dependencies></dependencies>
  
  <!--依赖管理,常用于父项目确保所有的子项目使用的依赖版本保持一致-->
  <dependencyManagement></dependencyManagement>
</project>

1.1 基础信息

<version> 元素来指定项目的版本号。通常版本信息遵循:主版本.次版本.增量版本-里程碑版本。

主版本:项目的重大架构变更。

次版本:较大范围的功能增加或变化,以及bug修复。

增量版本:中大bug的修复。

里程碑版本:一个版本的里程碑,可能并不是一个非常稳定的版本,还需要很多测试。

|----------|---------------------------------------------------------|
| Final | 正式稳定版。 |
| Beta | 测试版。已经在开发团队内部进行了初步测试,但仍可能存在一些小问题,会提供给外部测试人员或团队进行更广泛的测试。 |
| Alpha | 内部测试版。通常处于开发阶段。用于内部进行初步功能测试和开发。 |
| CR | 候选发布版,会在公开发布之前进行最后的广泛测试。 |
| SNAPSHOT | 表示项目在开发中或不稳定的版本。 适用于开发和测试阶段。 |

表 常见的里程碑版本后缀

1.1.1 生命周期

Maven的生命周期是抽象的,本身不做任何实际的工作,实际工作由插件完成。

|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| clean | 清理项目,主要用于删除之前生成的数据。包含pre-clean、clean和post-clean三个阶段。 |
| default | Maven的主要生命周期。包含了编译、测试、打包等一系列构建步骤。主要阶段有validate(验证工程是否正确、所需的资源是否可用)、compile(编译项目的源代码)、test(测试编译后的代码)、package(把已编译的代码打包成可发布的格式)、verify(运行所有检查)、install(将包安装至本地仓库,以供本地其他项目使用) |
| site | 建立和发布项目站点。主要阶段有pre-site、site、post-site、site-deploy |

表 Maven 的三套相互独立的生命周期

1.2 依赖

Maven中,依赖是指项目所依赖的库或框架,通常以jar包的形式存在。通过Maven坐标(groupId、artifactId、version)进行唯一标识。

Mavan支持多种依赖范围,用于控制依赖在项目不同阶段的可用性。

|----------|----------------------------------|
| compile | 默认范围,表示该依赖在编译、测试和运行阶段都可用。 |
| test | 仅在测试阶段可用。 |
| runtime | 在运行时可用,但在编译时不可用。 |
| provided | 该依赖在JDK或容器中已提供,无需在项目中打包。 |
| system | 与provided类似,但依赖的jar包必须显示地提供系统路径。 |

表 Maven依赖的范围

1.2.1 依赖的传递性

当项目A依赖与项目B,而项目B依赖项目C,那么A将自动继承项目B对项目C的依赖。

但是可能会导致一些问题,比如依赖冲突:

当项目中存在多个版本的相同依赖时,会根据一定的规则进行冲突解决。通常遵循"第一声明者优先",即先声明的依赖版本将被使用。还可以使用<excusions>来排除特定的依赖,或者使用<dependencyManagement>来锁定依赖版本。

1.3 插件

插件是Maven的核心组成部分,实际上是一组用于执行特定任务的工具。可以自动化项目的构建、测试、打包、部署等过程。本质上是一个包含实现特定功能代码的jar包。

Maven的三大生命周期:clean、default和report,每个都包含了一系列的阶段(phase),而插件的目标(goal)则绑定在这些阶段上。当执行某个Maven命令时,实际上触发了绑定的插件目标。

|-------------------------|--------------------------------------------------|
| maven-compiler-plugin | 编译Java项目的源代码,并能确保Java代码与所指定的Java版本兼容,保证顺利地编译和执行。 |
| maven-resources-plugin | 处理项目中的资源文件,如复制资源文件到输出目录。可以在构建过程中复制和过滤资源文件。 |
| maven-jar-plugin | 将项目打包成JAR文件。 |
| maven-war-plugin | 将项目打包成WAR文件。 |
| maven-install-plugin | 将项目构建的包安装到本地Maven仓库中。 |
| maven-dependency-plugin | 用于分析和管理项目的依赖。可以执行复制依赖项到指定目录、列出项目依赖等任务。 |

表 Maven官方常见插件

1.4 打包

将项目打包成JAR或WAR文件时,会生成MANIFEST.MF文件(位于JAR文件等META-INFO目录下),用于描述打包等元数据信息(如程序入口类)。Java程序运行时,JVM读取并根据其中的配置信息执行响应的操作。

可以在maven-jar-plugin插件来配置其内容。

<packaging>标签指定打包方式,决定了文件输出类型(JAR、WAR等)。

1.4.1 <layout>

常用于插件的配置,用于定义打包过程的文件布局,不同的布局可能会影响如何组织JAR或WAR文件内的类、资源和依赖。

|--------|------------------------------------------------------|
| JAR | 包含所有必要的依赖和启动脚本,生成的JAR文件将是可执行的。 |
| WAR | 与JAR类型类似,但适用Web应用。 |
| ZIP | 创建一个标准的ZIP文件,其内容和布局由用户自定义,不保证生成的ZIP文件是可执行的。 |
| NONE | 用于创建一个不包含任何启动脚本或布局的JAR或WAR文件。包含应用的类、资源及依赖。生成的文件不可执行。 |
| CUSTOM | 允许用户自定义布局。 |

表 <layout>的布局

2 spring-boot-starter-parent

用于构建Spring Boot应用程序的父项目,提供了一种标准化的方式来管理和配置Spring Boot应用程序的依赖项、插件和默认设置。

提供了以下功能(3.2.4版本):

1)默认使用Java17来编译项目。

2)UTF编码。

3)使用- parameters编译。

4)依赖管理。

5)repackage目标的执行,以便创建一个可执行的JAR或WAR文件。

6)Native配置文件。

7)filter资源处理。

8)合理的插件配置。包括Git提交ID和Shade插件的合理配置。

9)对应application.properties和application.yml的资源filter。

2.1 spring-boot-dependencies

不想使用spring-boot-starter-parent,但想使用其依赖管理来控制依赖版本时,可以使用spring-boot-dependencies依赖(是spring-boot-starter-parent的父级依赖)。可以设置项目的父pom为这个依赖,或者在依赖管理中引入这个依赖。

<dependencyManagement>

    <dependencies>

        <dependency>

            <!-- Import dependency management from Spring Boot -->

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-dependencies</artifactId>

            <version>3.2.4</version>

            <type>pom</type>

            <scope>import</scope>

        </dependency>

    </dependencies>

</dependencyManagement>

2.2 依赖版本覆盖

当想在项目中覆盖某依赖在父POM中指定的版本时,可以在<properties>中覆盖该属性的值。

<properties>
    <mysql.version>8.1.0</mysql.version>
</properties>

或者在<dependencyManagement>中覆盖该依赖。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.0.32</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.protobuf</groupId>
                    <artifactId>protobuf-java</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</dependencyManagement>
相关推荐
Good Note9 分钟前
Golang的静态强类型、编译型、并发型
java·数据库·redis·后端·mysql·面试·golang
m0_7482365825 分钟前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
web1511736022331 分钟前
Spring Boot项目中解决跨域问题(四种方式)
spring boot·后端·dubbo
我就是我3521 小时前
记录一次SpringMVC的406错误
java·后端·springmvc
向哆哆1 小时前
Java应用程序的跨平台性能优化研究
java·开发语言·性能优化
ekkcole1 小时前
windows使用命令解压jar包,替换里面的文件。并重新打包成jar包,解决Failed to get nested archive for entry
java·windows·jar
翱翔-蓝天2 小时前
Spring Boot 3 集成 RabbitMQ 实践指南
spring boot·rabbitmq·java-rabbitmq
luckilyil2 小时前
RabbitMQ学习—day6—springboot整合
spring boot·rabbitmq·java-rabbitmq
handsomestWei2 小时前
java实现多图合成mp4和视频附件下载
java·开发语言·音视频·wutool·图片合成视频·视频附件下载
全栈若城2 小时前
03 Python字符串与基础操作详解
java·开发语言·python