当前位置: 首页 > news >正文

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


http://www.mrgr.cn/news/48085.html

相关文章:

  • shardingsphere分库分表项目实践4-sql解析sql改写
  • 子Shell及Shell嵌套模式
  • 【蓝桥杯——物联网设计与开发】拓展模块5 - 光敏/热释电模块
  • 基于卷积神经网络融合Inception模块的人脸识别
  • Spring AOP 中记录日志
  • mysql(基础语法)
  • 小白萌新 JSAR 开发者工具之初体验——好用!
  • 《市场营销学》PPT课件.ppt
  • SAP S/4HANA 迁移:IT 高管实用指南
  • 探索未知,惊喜连连 —— 盲盒小程序开发文案
  • 【低代码】前端低代码开发日记2_遇到的问题(2)变量绑定
  • [单master节点k8s部署]34.ingress 反向代理(一)
  • 提升 Python 包下载速度的利器:cnpip
  • Datawhale 组队学习 文生图 Prompt攻防 task01
  • 解释Flask框架中的session和request对象
  • 模型预测控制工具包——ACADO:通过Cmake构建自己的优化问题
  • lnmp - RBAC方案设计与实现
  • 使用阿里云盘将服务器上的文件上传/下载到云盘/服务器
  • MySQL数据库详细学习要点
  • 纯干货!详解Java并发之线程中断机制
  • Docker理念
  • Android Studio 安装和认识
  • SpringBoot集成Redis
  • 牛上脑和各类牛排的叫法,不要土老帽了~
  • v-html里面的标签设置样式没有用怎么办?
  • 【Linux调试工具】gdb/cgdb