在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>
在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是在某个具体依赖里面配置的。
<?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:
小结:父级项目里packaging打包方式一般配置成pom,pom 表示项目里没有java代码,也不执行任何代码,只是为了聚合工程或传递依赖用的。
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标签中还有很多的元素,这里重点分析下常见的几个配置:
常见代码片段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>