SpringBoot+Maven多模块聚合pom.xml常见配置

文章目录

  • 一、jar的版本判断的两种途径
  • 二、dependencyManagement意义
  • 三、packaging标签配置
  • 四、Maven build标签

一、jar的版本判断的两种途径

在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器,是继承自该项目的所有子项目的默认依赖信息。
pom.xml文件中,jar的版本判断的两种途径:

  • 如果dependencies里的dependency自己没有声明version元素,那么maven就会倒dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,如果有,就继承它,如果没有就会报错,告诉你必须为dependency声明一个version

  • 如果dependencies中的dependency声明了version,那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的version为准。

 pom.xml  
//只是对版本进行管理,不会实际引入jar  
<dependencyManagement>  
      <dependencies>  
            <dependency>  
                <groupId>org.springframework</groupId>  
                <artifactId>spring-core</artifactId>  
                <version>3.2.7</version>  
            </dependency>  
    </dependencies>  
</dependencyManagement>  
  
//会实际下载jar包  
<dependencies>  
       <dependency>  
                <groupId>org.springframework</groupId>  
                <artifactId>spring-core</artifactId>  
       </dependency>  
</dependencies>

二、dependencyManagement意义

maven多模块项目中,为了保持模块间依赖的统一,常规做法是在parent model中,使用dependencyManagement预定义所有模块需要用到的dependency(依赖),然后,子model根据实际需要引入parent中预定义的依赖

好处:

1、依赖统一管理(parent中定义,需要变动dependency版本,只要修改一处即可);

2、代码简洁(子model只需要指定groupId、artifactId即可)

3、dependencyManagement只会影响现有依赖的配置,但不会引入依赖,即子model不会继承parent中dependencyManagement所有预定义的depandency,只引入需要的依赖即可,简单说就是“按需引入依赖”或者“按需继承”;因此,在parent中严禁直接使用depandencys预定义依赖,坏处是子model会自动继承depandencys中所有预定义依赖;

注:
1、maven的继承跟java一样,单继承,也就是说子model中只能出现一个parent标签;
2、maven的依赖(dependencies)有传递性,为了解决兼容性问题,就用exclusions来排除造成兼容性问题的依赖。exclusions是在某个具体依赖里面配置的。

三、packaging标签配置

<?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">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.t.test.center</groupId>
    <artifactId>test-centerr</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--父级项目里packaging一般配置成pom-->
    <packaging>pom</packaging>
    <name>test-center</name>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <!--项目子模块-->
    <modules>
        <module>test-module1</module>
        <module>test-module2</module>
        <module>test-module3</module>
    </modules>

packaging默认类型jar类型,如果不做配置,maven会将该项目打成jar包。常见项目的打包类型:pom、jar、war:

  • pom ---------> 父类型都为pom类型
  • jar ---------> 内部调用或者是作服务使用
  • war ---------> 需要部署的项目(一般web相关)

小结:父级项目里packaging打包方式一般配置成pom,pom 表示项目里没有java代码,也不执行任何代码,只是为了聚合工程或传递依赖用的。

四、Maven build标签

1、在Maven的pom.xml文件中,存在如下两种< build>:

(1)全局配置(project build)

针对整个项目的所有情况都有效,包含了基本的build元素,还包含两个特殊的元素,即各种<…Directory>和< extensions>。

(2)配置(profile build)

针对不同的profile配置,包含了基本的build元素。

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">  
  ...  
  <!-- "Project Build" contains elements of the BaseBuild set and the Build set-->  
  <!--第一种全局配置(project build)-->
  <build>  
   <!-- 执行build任务时,如果没有指定目标,将使用的默认值。-->
	  <defaultGoal>install</defaultGoal>  
	  <!-- build目标文件的存放目录,默认在${basedir}/target目录-->
	  <directory>${basedir}/target</directory>  
	  <!--build目标文件的名称,默认情况为${artifactId}-${version}-->
	  <finalName>${artifactId}-${version}</finalName> 
	  /**定义*.properties文件,包含一个properties列表,该列表会应用到支持filter的resources中。也就是说,定义在filter的文件中的name=value键值对,会在build时代替${name}值应用到resources中。maven的默认filter文件夹为${basedir}/src/main/filters  		**/
       <filters><filter>filters/filter1.properties</filter>   	 </filters>  
       ...
  </build> 


 <!--另一种配置(profile build)-->
  <profiles>  
    <profile>  
      <!-- "Profile Build" contains elements of the BaseBuild set only -->  
      <build>...</build>  
    </profile>  
  </profiles>  
</project>

小结:build标签中还有更多的元素,更多的可参考博文pom.xml文件详解:https://blog.csdn.net/weixin_47061482/article/details/109817802

2、< build>中常用的Resources配置、plugins配置

build标签中还有很多的元素,这里重点分析下常见的几个配置:

  • Resources配置
    用于包含或者排除某些资源文件
  • plugins配置
    用于指定使用的插件
常见代码片段eg:
  <build>
        <!-- 资源文件加载那些-->
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <!-- 针对spring-boot的maven打包,executable表示是否要做成可执行文件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.1.6.RELEASE</version>
                <configuration>
                    <executable>false</executable>
                </configuration>
            </plugin>
            <!-- maven打包成war包,如果是老的web项目理论上讲必须有web.xml,如果没有择报错,但是springboot是没有web.xml,所以就不校验了-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <!-- 类文件编译级别和编码格式-->
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <!-- 配置文件编码格式-->
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

接下来我们分别看下这几个配置
(1)Resources配置:

<build>  
        ...  
       <resources>  
          <resource>  
             <targetPath>META-INF/plexus</targetPath>  
             <filtering>true</filtering>  
            <directory>${basedir}/src/main/plexus</directory>  
            <includes>  
                <include>configuration.xml</include>  
            </includes>  
            <excludes>  
                <exclude>**/*.properties  
              
           
      
      
        ...  
      
    ...  

1)resources
一个resources元素的列表。每一个都描述与项目关联的文件是什么和在哪里
2)targetPath
指定build后的resource存放的文件夹,默认是basedir。
通常被打包在jar中的resources的目标路径是META-INF
3)filtering
true/false,表示为这个resource,filter是否激活
4)directory
定义resource文件所在的文件夹,默认为${basedir}/src/main/resources
5)includes
指定哪些文件将被匹配,以*作为通配符
6)excludes
指定哪些文件将被忽略
7)testResources
定义和resource类似,只不过在test时使用

(2)Plugins、pluginManagement:
pluginManagement一般是用来在父POM中定义,提供给子POM使用,子POM也可以覆盖这个定义,而且你在父POM中定义了版本之后,子模块中直接应用groupId和artifactId,而不用指定版本,同时也方便统一管理;而在父POM中的pluginManagement并不会介入到Maven的生命周期。

plugins就是直接引入一个plugin,而且可以绑定到Maven相关的生命周期上。

pluginManagement主要是为了统一管理插件,确保所有子POM使用的插件版本保持一致,类似dependencies和dependencyManagement。

<!--eg:父pom-->
<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.1</version>
            <configuration>
                <attach>true</attach>
            </configuration>
            <executions>
                <execution>
                    <phase>compile</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</pluginManagement>

<!--eg:子pom-->
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
    </plugin>
</plugins>

你可能感兴趣的:(《git,maven工具日常》系列,maven,springboot)