maven
1.maven概述
1.1概念:apache下纯java开发的开源项目,跨平台的项目管理工具,即针对java平台的项目构建和依赖管理
项目构建:工程的创建过程。项目构建过程包括:清理-编译-测试-报告-打包-部署
依赖管理:项目和jar包之间的相互依赖,自动下载项目所需的jar包,统一管理jar包之间的依赖关系
1.2 作用
避免四处寻找jar包、消除jar包之间相互依赖、避免Jar包冲突、项目拆分多个模块、部署和迁移方便(包括分布式部署)
1.3 概念模型
项目对象模型(Project Object Model):POM对象模型,每个maven项目包含一个pom.xml文件,定义本项目依赖的jar包、本项目坐标、打包方式
依赖管理系统(基础核心):maven通过坐标对依赖的jar包进行统一管理
maven管理项目生命周期基于插件完成
1.4 maven仓库
仓库即存放jar包的地方,分为本地仓库、远程仓库、中央仓库三类。远程仓库包含了中央仓库、私服和其他公共库
本地仓库:相当于缓存,工程第一次从互联网寻找jar包下载保存到本地,后续启动先从本地匹配Jar包,匹配不到再去远程仓库寻找
远程仓库:公司内部的私服仓库,对外公开
中央仓库:就是远程仓库,由maven团队统一维护
下载jar包的优先级:本地仓库->远程仓库私服->镜像->中央仓库->抛出异常,坐标不对
1.5 maven坐标
坐标定义:jar包或其他资源的唯一标识,管理项目依赖的基础
坐标元素包含:
groupid:公司或组织域名倒序
artifactId:模块号
version:版本号
2.maven的安装和优化配置
下载地址::https://maven.apache.org/download.cgi
maven依赖于jdk,安装之前必须安装jdk
maven优化:
修改本地仓库位置,通过conf下的setting.xml中的localRepository标签进行修改
修改镜像源:通过conf下的setting.xml中的mirror标签进行修改
修改maven默认jdk版本:
3.maven生命周期和常用命令
3.1 maven生命周期
定义:对所有构建过程进行抽象统一。
maven有三套相互独立的生命周期,不能看作一个整体,但是可以同时运行
clean生命周期:项目清理生命周期,在进行构建前的一些清理工作
default生命周期:默认生命周期,构建的核心部分,编译、测试、打包、安装、部署等
site生命周期:生成站点生命周期,生成项目报告,站点、发布站点
以上生命周期是抽象的,不会做实际工作,实际工作由插件完成
tips:在生命周期中,运行到某个阶段,之前的阶段都会被运行,且不需要额外输入前面的阶段
3.2 常用命令
clean 移除target文件夹
compile 生成target文件夹,包含编译后的文件
test 使用单元测试框架运行test包下的代码,target文件夹下会添加test-classes文件夹
package 对项目打包,放在target目录中,格式为项目名-版本-快照.jar
install 此jar包安装至本地仓库,供其他项目依赖
4.maven插件介绍
maven生命周期依赖各种插件完成
插件所在路径:%本地仓库%\org\apache\maven\plugins
插件目标:每个任务
插件如何与生命周期绑定:将插件的目标绑定到生命周期的具体阶段来完成。例如将maven-plugin-compile的compile目标绑定到default生命周期的compile阶段,完成项目源代码编译
内置绑定:对一些生命周期的阶段默认绑定了插件目标,因为不同项目有不同的打包方式,因此对应不同的绑定关系
自定义绑定:插件元素中,元素是执行目标,元素代表的是绑定生命周期的具体阶段,元素代表的是要绑定的插件的目标
配置插件:maven插件高度易扩展,很方便进行自定义配置
source:源代码编译版本
target:目标平台编译版本
encoding:字符集编码
5.依赖管理
依赖:项目和jar包之间的相互依赖
依赖管理:使用maven管理项目中用到的jar包,maven管理方式是自动下载jar包,统一管理jar包之间的依赖关系
常用添加依赖的查找地址:https://mvnrepository.com/
6.依赖配置
pom.xml中配置所需依赖
pom文件中标签说明:
dependencies:管理依赖总标签,只能有1个
dependency:1个表示1个依赖,数量不限
groupid,artifacid,version:依赖的基本坐标
package:依赖的打包类型,jar或war
type:依赖的类型,大部分情况下无需生命,默认为jar
scope:依赖的范围,默认为compile
optional:标记依赖是否可选
exclusions:排除传递性依赖
7.依赖范围
使用<scope>标签表示
常用依赖范围有:compile、test、provided、runtime、import、system 共计6种,后两种不常用
compile:编译依赖,默认依赖范围。src下的main和test目录可以访问此范围下的依赖,即jar包。部署到tomcat时,要将此依赖放入WEB-INF的lib文件夹下
test:测试依赖,仅测试使用,src下的test目录可访问此范围下的依赖。部署到tomcat时,不会将此依赖放入 WEB-INF/lib 文件夹下
provided:提供依赖,src下的main和test目录可以访问此范围下的依赖。部署到tomcat时,不会将此依赖放入 WEB-INF/lib 文件夹下
runtime:运行依赖,src/main下的文件无法访问此依赖,src/test下的文件可以访问此依赖。部署到tomcat时,会将此依赖放入 WEB-INF/lib 文件夹下
compile对编译、测试、运行环境都有效;test只对测试环境有效;provided对编译和测试环境有效;runtime对测试和运行环境有效
8.依赖传递
定义:项目中引用了一个jar包,该jar包又引入了其他jar包,那么此时项目与其他引入的jar包就是依赖传递。默认情况下,maven会把直接引用和间接引用的jar包都下载到本地
依赖传递可能产生依赖冲突,例如A依赖于B和D,B和D分别依赖于C的1.1版本和1.2版本。
9.依赖冲突
定义:项目中引入多个相同的jar,jar包版本不同会产生依赖冲突。
maven提供了2种避免冲突的策略:短路径优先和声明优先。因此maven在实际使用种是不存在依赖冲突的
短路径优先:如果出现2个相同依赖,那个依赖距离比较近则优先使用
声明优先:那个依赖先声明的,就使用那个
10.依赖排除
定义:排除不需要的依赖
例如:项目依赖于B依赖,B依赖于C,有可能C对项目不兼容,可用关键字exclusion排除C依赖
11.依赖版本锁定和版本常量
maven种对依赖的版本管理有2种方式,版本锁定和版本常量,这2种方式在开发中使用较多
版本锁定:锁定项目中用到的版本,实际用的较多,通过 dependencyManagement 元素来锁定依赖版本,但是只能锁定依赖版本,不具备其他作用。(不能下载依赖)。在 dependencyManagement 中声明了依赖的版本后,dependencies中就不需要再次声明依赖版本了。
版本常量:在pom.xml文件中提取出各自依赖的版本常量,封装至properties中,在依赖的version元素中使用OGNL表达式获取版本号即可
12.继承和聚合
继承:字模块会自动继承父模块的一些依赖、插件、属性等。目的是为了消除重复性,最常用做法是将子模块中常用的pom依赖提取出来,统一锁定在父模块的pom文件中,然后子模块直接继承父模块的依赖版本号,方便项目的依赖统一管理。继承使用parent元素。父模块的packing必须为pom,否则无法被继承。
聚合:做个子模块聚合成1个整体模块,是整体和部分的关系。聚合使用的元素是module,module中的路径是相对路径,
开发中通常会将继承与聚合合二为一,但两者是不同概念,没什么关系。
13.idea搭建maven多模块
https://www.cnblogs.com/tanghaorong/p/13110581.html
14.搭建maven私服
参考资料:https://www.cnblogs.com/tanghaorong/p/13054266.html#_label0
14.1 私服介绍:私服就是私有服务器,搭建在局域网的特殊远程仓库,搭建私服服务器可以访问外网,目的是代理远程仓库及部署第三方构建。有私服后,本地项目下载依赖,会直接请求私服,
私服存在则从私服下载,否则私服请求外部中央仓库,将依赖下载到私服,再提供给本地仓库,同时本地仓库也可也可上传架构到私服供其他人员使用。
目前市面上有3种maven仓库管理软件可搭建私服,分别是
Apache基金会的archiva:http://archiva.apache.org/
JFrog的Artifactory:https://www.jfrogchina.com/
Sonatype的Nexus:https://www.sonatype.com/
以上3软件都是开源,免费和付费版都有,用的最多的是Nexus
14.2 Nexus介绍
强大的maven仓库管理器,极大简化了本地内部仓库的维护和外部仓库的访问
利用Nexus私服在1个服务器中即可完全控制访问和部署所维护仓库的每个Artifact
Nexus私服可在代理远程仓库的同时维护本地仓库,以降低中央仓库的符合,节省外网带宽和事件
Nexus开箱即用,使用文件系统加Lucene来组织数据,不适用数据库
Nexus使用ExtJS开发界面,利用Result 提供完整的REST APIS
Nexus支持WebDAV和LDAP安全身份认证
Nexus提供强大的仓库管理,构建搜索功能,基于REST,UI是ExtJS的REST客户端,占用内存较少,基于简单文件系统而非数据库
14.3 为何使用Nexus
如果项目开发人员很多,团队中每个人都需要从中央仓库下载依赖,重复从仓库下载jar浪费带宽和加大了仓库的负荷
并且为了确保数据安全,限制访问外网,因此本地无法连接maven中央仓库,此时只能搭建maven私服并串联到有外网访问权限的服务器,从而实现从私服下载依赖,既节省了网络带宽,也加速
项目搭建进程,并且私服可以联通中央仓库和其他仓库
14.4 Nexus优点
节省外网带宽、加速Maven构建、部署第三方构建、提高稳定性增强控制、降低中央仓库负荷、控制和审计、建立本地内部共用仓库
14.5 Nexus下载
nexus基于JDK开发,需提前安装JDK并配置环境变量
下载网站:https://www.sonatype.com/nexus-repository-oss,如果访问不了,通过以下百度网盘访问
网盘地址:https://pan.baidu.com/s/1e66PEnIxROPjk3KZcur1sA 提取码:av8h
nexus安装好之后,需登录使用,用户名为admin,密码是第一次启动生成的,位于 /sonatype-work/nexus3/admin.password
停止nexus,在cmd窗口中 CTRL+C 即可停止
14.6 Nexus的仓库类型
proxy:代理仓库,用来代理远程的公共仓库,默认从中央远程仓库寻找数据的仓库。它负责代理包
代理第三方公共的远程仓库,默认从远程仓库中寻找数据的仓库,也可通过代理仓库代理其他的maven仓库,例如阿里的maven仓库等
当本地项目没有构建时,会从私服中查找,如果私服还没有,则通过被代理的仓库中下载构建,然后下载缓存在私服中供使用,只要有一次从仓库中下载后,后续都是从私服仓库中下载,
私服一般部署在内容,可大大节约带宽。
hosted:宿主仓库,部署自己项目打包的构建,供内部人员下载使用。它负责上传包
nexus定义了2个宿主仓库,分别是
maven-releases:存放自己项目发布的构建,通常是release版本,即发布的版本
maven-snapshots:发布snapshots的版本,即不稳定,还需要测试的版本
group:仓库组,用来合并多个hosted/proxy仓库,都加入到maven-public中,下载时按照配置顺序从中依次查找。它负责提供包
maven用户访问仓库组,可以间接访问组内所有仓库,仓库组中仓库有顺序,从仓库组下载构建,仓库组按照顺序依次在组内的仓库中查找组件,查到了立即返回给本地仓库,
所以一般将速度快的在前面。
仓库组内部实际上没有构件内容,只是起到一个请求转发的作用,将maven用户下载构件的请求转发到组内其他仓库处理
14.7 配置maven从nexus下载构建
两种方式:
pom方式:pom.xml文件中添加repositories标签,加入仓库组的地址;在maven的setting.xml中添加nexus的用户名和密码,通过server标签定义。添加之前最好备份原始文件
镜像方式:修改maven的setting.xml文件,通过mirror标签定义仓库组的地址,并通过server标签定义nexus的用户名和密码
14.8 配置本地构建上传至nexus
两种方式:
maven上传:
上传maven-releases时,将version标签中的-SNAPSHOT去掉,表示发布版本
上传maven-snapshots时,在version标签中添加-SNAPSHOT,表示不稳定,会反复修改、发布、测试的版本
上传步骤:pom文件中通过distributionManagement标签定义上传的宿主仓库地址;修改setting.xml文件,通过server标签设置宿主仓库用户名和密码
手动上传:
常用于第三方提供的jar包
14.9 linux中安装nexus
先下载下linux版本的nexus,然后通过xftp上传至linux系统中
解压nexus tar -zxvf nexus-3.24.0-02-unix.tar.gz
配置虚拟机内存 vi /opt/nexus/nexus-3.24.0-02/bin/nexus.vmoptions
启动nexus
nexus常用命令:./nexus {start|stop|run|run-redirect|status|restart|force-reload}
start看不到nexus运行信息,run可以看到运行信息,甚至包含错误信息
开放8081端口
#开放端口
firewall-cmd --zone=public --add-port=8081/tcp --permanent
#重启端口
firewall-cmd --reload
#查看开放端口
firewall-cmd --zone=public --list -ports
访问 http://ip:8181/ 如果有nexus界面即访问成功
登录nexus,密码位于 /opt/sonatype-work/nexus3/admin.password