为什么要使用Maven
在最开始的项目阶段,没有maven对项目进行管理,如果需要什么jar包,需要手工进行替换jar包,然后重启tomcat服务,我第一家工作的公司就是这么干的。
使用maven的好处是,mavn可以帮助我们管理依赖,不用手工去替换jar包,只需要执行maven命令就可以进行管理。
maven的前身
1.make 最原始的构建工具,不能跨平台
2.ant 没有maven的时候流行过一段时间,没用过
3.maven 目前是最流行的,当然也有用gradle的
安装maven,配置
1.去官网下载对应的maven,官网下载地址:https://maven.apache.org/download.cgi
2.配置环境变量,我就直接粘贴我的配置了,我的是Mac,Windows的按照Windows的配置就可以了
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home
PATH=$JAVA_HOME/bin:$PATH:
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
MAVEN_HOME=/Users/mac/apache-maven-3.6.3
PATH=$PATH$MAVEN_HOME/bin
NEXUS_HOME=/Users/mac/nexus/3.20
PATH=$PATH:NEXUS_HOME/bin
3.安装成功后,使用mvn -v命令查看是否安装成功,(没事千万别升级系统,不然一堆坑)
maven的体系架构
最好是使用默认的.m2作为默认配置,如果修改为自定义配置,IDE新的项目读取到的配置实际上还是你老的配置,还需要手工进行修改。
maven坐标
每个maven项目都有一个唯一的坐标,groupid+artifactId+version+packing+classifier这5个坐标可以定位一个依赖包。
一般情况下,后二个维度使用的比较少。
packing:打包的方式,jar包还是war包
classifier:定义某个工程的附属项目,比如hello-world的hello-world-source功能,也就是对应的源码。
项目中引用依赖
使用<dependency>可引用任何依赖
依赖范围<scope>
maven有三套classpath,分别对应着编译源代码的classpath,编译测试代码以及执行测试代码的classpath,运行项目时的classpath。依赖范围就是用来控制依赖包与这三种classpath的关系的。
不同的依赖范围,可能导致有的包在不同的阶段,有的时候可以用,有的时候不可以用。
1.compile:默认的,对编译,运行测试都有效。
2.test:仅仅对运行测试代码的classpath有效。一些测试的依赖,可以设置为这个属性,这样,在打包的时候,会减少包的大小。
3.provider:编译和测试的时候有效,运行无效。因为环境可能已经提供了,比如servlet-api,tomcat就会提供这个包。
4.runtime:测试和运行时有效,但是编译代码时无效,比如jadc的驱动类。写代码的时候是基于标准接口去写代码的,但是在测试和运行时会用到这个包。
传递依赖和依赖冲突解决
什么是传递依赖:会自动递归解析所有的依赖,然后负责下载下来,接着所有层级的依赖,都会成为我们项目的依赖,不需要我们手工干预。
比如依赖了junit,junit依赖了A,A又依赖了B,我们这个时候对A的依赖范围就是 ->test。
比如我们依赖于A是compile,A依赖B是test,那么我们依赖B就是空,也就是说不会去依赖B。传递性依赖对依赖范围是有影响的,传递性依赖会导致多级依赖的依赖范围又交叉在一起,会有影响。
依赖冲突:maven会自动解析所有的依赖,但是可能会导致依赖冲突的问题A->B ,A->C->B。根据就近原则,离得最近的依赖被优先使用。 如果是这样 A->C->B(1.0),A->D->B(2.0)路径等长的情况下就会使用第一生命原则,哪个依赖在pom.xml里面先声明,就使用哪个。所以这个时候,如果要引用的是2.0,就需要手工排除依赖了。
可选依赖:<optional>true<optional>,如果A->B->C(optional为true),A就不会去依赖C
Maven构建
Maven的生命周期
是指对传统软件项目构建工作的抽象,其实对应的就是maven的各种命令,清理初始化,编译,测试打包,集成测试......
maven有三套完全独立的生命周期,clean,default,site。每套生命周期可以独立运行,并且可以包含多个phase(阶段),每个阶段又是由多个goal(功能插件)组成的。
maven生命周期的执行原理是 phrase->goal
默认的phrase,maven实际上会绑定默认的goal到phrase上去
maven的聚合功能
可以将各个模块聚合冲一个大的模块,搞一个父工程出来。现在基本都是这种模式
maven的继承
在父工程中,使用<dependencyManagement>和<pluginManagement>来声明需要被子工程继承的依赖和插件。在父工程声明了之后,如果子工程也用了这个包,只需要声明groupid和artifacted即可。不需要声明version,因为父工程已经强制约束了使用的版本号。如果你自己配置版本号会提示。
可以把通用的东西使用<dependencyManagement>和<pluginManagement>来声明,如果使用<dependencies>和<plugins>则会使所有子工程会全部强制继承了。只有当子工程声明了某个依赖或者插件时,但是只引了groupid和artifacted,没有version,这个时候就会去父工程继承。
资源过滤+profile实现环境适配
大家现在都在用
Nexus
1.下载
去官网下载安装包,但是官网巨慢,直接从网盘下吧
地址 https://pan.baidu.com/s/1saMIHrMybnkTVRKQtDCHQQ 提取码:btf6
2.安装
解压打开,获取到对应的目录,做一些配置,配置在上面有,Mac执行nexus start,在执行nexus status查看状态。
打开地址:http://localhost:8081,默认端口是8081,可以在配置文件修改端口号,改完了重启nexus就行了。默认密码是admin,admin123,但是3.0会给你生成一个随机的密码,第一次登陆的时候会告诉你在哪,去粘贴就行,然后改成自己喜欢的密码。
3.配置远程仓库从阿里云镜像下载
把这个配置变为阿里云镜像带public的路径就可以 http://maven.aliyun.com/nexus/content/groups/public/
4.创建角色
这个页面可以给不同的角色配置不同的权限,一般我们开发的时候对应的就是这个角色,给repository这个权限大部分就够用了,你要是自己本地开发,直接给一个nx-all,或者在contained里面,直接把nx-admin包含进去也行。
5.创建用户
创建用户,给用户赋予对应的角色,然后在把你设置的这个角色的账号和密码配置到maven的settings.xml里面就可以了。
6.从私服下载jar包
从nexus下载jar包时默认都可以进行下载,不校验nexus的用户名和密码,做了一个特殊的配置,可以直接下载。
7.配置定时任务
这有个task,可以给不同的任务配置时间表达式。