一、Pom文件
1.定义全局变量
在Maven的pom.xml文件中,
<properties>用于定义全局变量,
在POM中通过${property_name}的形式引用变量的值。
2.POM中的全局变量可以分为如下5种类型:
系统Shell的环境变量env.property_name,如
${env.PATH}
表示引用当前系统的PATH变量值,注意这里的PATH必须都是大写。
Java System Properties,即Java属性文件
${java.home}
project.property_name,直接引用POM中的元素值
${project.version}
表示引用<project><version>1.0</version></project>中的1.0
settings.property_name,直接引用settings.xml中的元素值
${settings.offline}
表示引用<settings<offline>false</offline></settings>中的false
property_name,
直接访问<properties>中已经定义的变量值
${myVar}
表示引用<properties><myVar>myvalue</myVar></properies>中的myvalue
3.dependencyManagement标签
作用:
在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器。
jar版本
1.如果dependencies里的dependency自己没有声明version元素,那么maven就会到dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,如果有,就继承它,如果没有就会报错,告诉你必须为dependency声明一个version
2.如果dependencies中的dependency声明了version,那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的version为准。
用法
//只是对版本进行管理,不会实际引入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>
4.package标签
packaging给出了项目的打包类型,即作为项目的发布形式,其可能的类型。在Maven 3中,其可用的打包类型如下:
jar,默认类型
war
ejb
ear
rar
par
pom
maven-plugin
<packaging>war</packaging>
5.modules标签
Maven 3支持Maven项目的多模块(multi-modules)结构。这样的Maven项目也被称为聚合项目,通常由一个父模块和若干个子模块构成。
其中,父模块必须以pom打包类型,同时以
<modules>
给出所有的子模块。父模块的POM示例如下:
<packaging>pom</packaging>
<modules>
<module>my-frontend-project</module>
<module>my-service-project</module>
<module>my-backend-project</module>
</modules>
二、Maven命令行工具
1.Maven打包过程中跳过测试
mvn install -DskipTests
或者
mvn install -Dmaven.test.skip=true
2.查看依赖树
解决问题:解决依赖冲突问题
控制台
mvn dependency:tree
将结果打印到指定文件
mvn dependency:tree --> tree.txt
三、Maven问题实战
1、依赖冲突
什么是依赖冲突
举例
A依赖于B及C,而B又依赖于X、Y,而C依赖于X、M,则A除引B及C的依赖包下,还会引入X,Y,M的依赖包(一般情况下了,Maven可通过等若干种方式控制传递依赖)。
这里有一个需要特别注意的,即B和C同时依赖于X,假设B依赖于X的1.0版本,而C依赖于X的2.0版本,A究竟依赖于X的1.0还是2.0版本呢?
这就看Classloader的加载顺序了,假设Classloader先加载X_1.0,而它就不会再加载X_2.0了,如果A恰恰希望使用X_2.0呢,血案就这样不期而遇了。
哪个jar冲突了
按照下面这个文档来查找
https://blog.csdn.net/sun_wangdong/article/details/51852113