Maven知识点
maven坐标
groupId:该元素定义了当前Maven项目隶属的实际项目,一般情况下该项元素都与公司域名相对应,比如com.taobao.
artifactId:该元素定义了实际项目中的一个Maven Module
version:该元素表示当前构件的版本,包括稳定(release)版本和测试(snapshot)版本
packaging:该元素定义Maven项目的打包方式,默认为jar,还有war和pom方式
war架包是 用于需要部署的web项目使用
pom的打包方式在父项目中使用,作为父级项目,还有一个重要的属性,那就是modules,通过modules标签将项目的所有子项目引用进来,在build父级项目时,会根据子模块的相互依赖关系整理一个build顺序,然后依次build。
classifer:该元素用来帮助定义构件输出的一些附属构件,例如通过配置插件,可以在打包的同时生成-javadoc.jar和sources.jar 等构件。
<groupId>com.baidu</groupId>
<artifactId>passport-agent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<package>jar</package>
<classifier>jdk15-javadoc</classifier>
maven依赖
Maven有如下6种依赖范围:
compile: 编译依赖范围(Default,大多数情况下我们都是在使用compile编译范围)
test: 测试依赖范围 (编译主代码和运行时无效)
provided: 已提供依赖范围(就是说在运行的时候容器已经给我们提供该依赖了,比如说servlet-api)
runtime: 运行时依赖范围
system: 系统依赖范围(生成的构建一般与本机系统绑定,不具备移植性不建议使用)
import: 导入依赖范围(将其它地方官依赖配置导入,后续讲到依赖管理dependencyManagement详细阐述)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oF0bUSjH-1611543749050)(C:\Users\caomingxing6\AppData\Roaming\Typora\typora-user-images\image-20200518153522469.png)]
<dependency>
<groupId>com.baidu</groupId>
<artifactId>passport-agent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<classifier>jdk15-javadoc</classifier>
</dependency>
传递性依赖
传递性依赖的意思是依赖具有传递性。比如,在A 中添加对B 的依赖,在B 中添加对C 的依赖,如果依赖范围是compile 的,A 不仅会有B 的jar 包,也会有C 的jar 包。如果在C 中添加了某个依赖,那么根据传递性,A 和B 也可以使用C添加的依赖,而不需要自己再重新引入依赖。 我们使用公式来表示依赖的传递性:
A->B并且B->C,那么A->C,也就是C是一个A的传递性依赖
依赖调解
依赖调解是指当存在多个传递性依赖时,出现了当前项目对于同一个依赖有多个版本被引入依赖树中该如何选择的原则。
比如说存在以下情况:
存在:A->-B>-C->X(1.0)和A->D->X(2.0)
原则:路径最近原则(指依赖通过几层传递性依赖引入),X(2.0)将会被解析
存在:A->B->Y(1.0)和A->C->Y(2.0)
原则:第一声明优先原则,哪个现在pom中声明(也就是在pom文件的上边),就以哪个为准(Maven2.0.9开始使用,在此之前是不确定的,导致构建项目具有一定的随机性)
maven按照最短bai依赖来决du定版本的,如果两个依赖路径zhi长度一dao样,那么久随机选择zhuan。
1、当a依赖b1.0 c依赖b2.0,shud同时依赖a和c,这时候d依赖的b的版本不确定,需要排包来确定,否则会有依赖冲突
2、如果d同时依赖b,则以d直接依赖的b的版本为最终版本
可选依赖
A->B,并且B->X(可选),B->Y(可选),那么X,Y将不会对A有任何影响。
可选依赖使用true设置。可选依赖违反了单一职责的原则,一般不建议使用。
排除依赖
我们通过在pom中配置来引入依赖,但是该依赖存在多个传递性依赖,如果某个间接依赖不是我们需要的,影响到了我们项目的正常构建,那么我们可以使用来干掉它。
<dependency>
<groupId>com.xx.miliao</groupId>
<artifactId>xx-serviceapi</artifactId>
<exclusions>
<exclusion>
<artifactId>xx-thrift-micloud-common</artifactId>
<groupId>com.xx</groupId>
</exclusion>
<exclusion>
<artifactId>thrift</artifactId>
<groupId>org.apache.thrift</groupId>
</exclusion>
<exclusion>
<groupId>com.xx</groupId>
<artifactId>ipWrapper</artifactId>
</exclusion>
</exclusions>
</dependency>
归类依赖
归类依赖看着高大上,其实说白了就是为了统一管理依赖,如果某些依赖的version都是一致的或者是存在某些特殊的关系,我们可以在pom中使用配置一些变量,在下边的时候使用$变量名来搞定。
maven插件
https://blog.csdn.net/qq_25827845/article/details/83795622
聚合
我们在一个项目中会存在模块A和模块B,在各自的项目目录下,我们可以分别通过命令 mvn clean package 来构建各个模块,但是如果我们想将这两个模块一起构建呢?
答案是我们需要建立一个模块C做为一个聚合模块。
<?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.baidu</groupId>
<artifactId>company</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>company-agent</module>
<module>company-java-core</module>
<module>company-https</module>
<module>company-http</module>
<module>company-management</module>
<module>company-security</module>
<module>company-login</module>
<module>company-sns</module>
<module>company-mt</module>
<module>company-message-scribe2mysql-storm</module>
<module>company-activator</module>
<module>company-activator-api</module>
<module>company-recard</module>
<module>company-zk-replicator</module>
<module>company-app-auth</module>
<module>company-app-auth-https</module>
<module>company-app-auth-applier</module>
<module>company-user-rights</module>
<module>company-idc</module>
</modules>
</project>
pom
在前面的学习中,我们见过打包方式为jar和war的,但是聚合模块的打包方式必须为pom,否则无法完成构建。
继承
继承和聚合有相似的地方,继承的特性是指建立一个父模块,我们项目中的多个模块都做为该模块的子模块,将各个子模块相同的依赖和插件配置提取出来,从而简化配置文件,父模块的打包方式必须为pom,否则无法构建项目。父模块和聚合模块经常可以做到合二为一。
通过在各个子模块中配置来表明其继承与哪一个父模块
<parent>
<groupId>com.baidu</groupId>
<artifactId>miliao-rootpom</artifactId>
<version>2.0.3</version>
</parent>
虽然聚合模块和父模块经常合二为一,但是聚合和继承是两个不同的概念,其实是没有什么关系的。
聚合模块知道它聚合了哪些模块,但是被聚合的模块不知道聚合模块的存在;
父模块不知道子模块的存在,但是子模块都必须知道自己的父模块是谁。
常用指令
maven clean
在持续集成服务器上使用怎样的 mvn 命令集成项目,这个问题乍一看答案很显然,不就是 mvn clean install
实际使用的时候还有很多细节这里补充下
mvn clean -U -e -B -X
- 不要忘了clean: clean能够保证上一次构建的输出不会影响到本次构建。
- 使用deploy而不是install: 构建的SNAPSHOT输出应当被自动部署到私有Maven仓库供他人使用,这一点在前面已经详细论述。
- 使用-U参数: 该参数能强制让Maven检查所有SNAPSHOT依赖更新,确保集成基于最新的状态,如果没有该参数,Maven默认以天为单位检查更新,而持续集成的频率应该比这高很多。
- 使用-e参数:如果构建出现异常,该参数能让Maven打印完整的stack trace,以方便分析错误原因。
- 使用-Dmaven.repo.local参数:如果持续集成服务器有很多任务,每个任务都会使用本地仓库,下载依赖至本地仓库,为了避免这种多线程使用本地仓库可能会引起的冲突,可以使用-Dmaven.repo.local=/home/juven/ci/foo-repo/这样的参数为每个任务分配本地仓库。
- 使用-B参数:该参数表示让Maven使用批处理模式构建项目,能够避免一些需要人工参与交互而造成的挂起状态。
- 使用-X参数:开启DEBUG模式。
有很多任务,每个任务都会使用本地仓库,下载依赖至本地仓库,为了避免这种多线程使用本地仓库可能会引起的冲突,可以使用-Dmaven.repo.local=/home/juven/ci/foo-repo/这样的参数为每个任务分配本地仓库。
- 使用-B参数:该参数表示让Maven使用批处理模式构建项目,能够避免一些需要人工参与交互而造成的挂起状态。
- 使用-X参数:开启DEBUG模式。