网上商城取名,郑州网站优化培训,成都市建设相关网站,线上做图的网站Maven是每个Java程序都会遇到的包管理工具#xff0c;今天整理一下Maven的相关知识#xff0c;从青铜到王者#xff0c;一文全了解#xff0c;我们开始吧#xff01;
1、maven是什么#xff0c;为什么存在#xff1f;项目结构是什么样子#xff0c;怎么定位jar
官方网…Maven是每个Java程序都会遇到的包管理工具今天整理一下Maven的相关知识从青铜到王者一文全了解我们开始吧
1、maven是什么为什么存在项目结构是什么样子怎么定位jar
官方网站说了好多整得多复杂一样简单说maven是一个管理包的工具。
Maven 存在的必要性是什么呐想想开源的jar包如此之多版本又如此之多在没有Maven之前我们管理jar包全部都是下载之后创建一个lib的文件夹然后项目进行引用在其他的项目成员需要修改一个jar的时候需要到处拷贝在部署的时候也很麻烦问题存在就要解决因此出现了Maven统一管理统一的仓库只需要配置是要哪个版本的包直接下载就够了不用拷贝是不是很方便。
现在大的问题解决了怎么定位一个jar包呐 2、Idea 的操作
1.新建maven项目
File -新建-project 勾选从原型模板创建选择maven-archetype-qiuckstart 填入项目的名字和groupId 公司域名反过来如com.alibaba 选择本地仓库的位置和自定义的setting配置 一路finish然后等待idea 创建模板项目就好了。
2.配置仓库
Maven 仓库有三种类型
本地local
中央central
远程remote
当我们执行 Maven 构建命令时Maven 开始按照以下顺序查找依赖的库
步骤 1 在本地仓库中搜索如果找不到执行步骤 2如果找到了则执行其他操作。
步骤 2 在中央仓库中搜索如果找不到并且有一个或多个远程仓库已经设置则执行步骤 4如果找到了则下载到本地仓库中以备将来引用。
步骤 3 如果远程仓库没有被设置Maven 将简单的停滞处理并抛出错误无法找到依赖的文件。
步骤 4 在一个或多个远程仓库中搜索依赖的文件如果找到则下载到本地仓库以备将来引用否则 Maven 将停止处理并抛出错误无法找到依赖的文件。
阿里云仓库配置nbsp;repositoriesnbsp; nbsp; nbsp; nbsp;repositorynbsp; nbsp; nbsp; nbsp; nbsp; nbsp;idcentral/idnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;namealiyun maven/namenbsp; nbsp; nbsp; nbsp; nbsp; nbsp;urlhttps://maven.aliyun.com/repository/public//urlnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;layoutdefault/layoutnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;!-- 是否开启发布版构件下载 --nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;releasesnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;enabledtrue/enablednbsp; nbsp; nbsp; nbsp; nbsp; nbsp;/releasesnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;!-- 是否开启快照版构件下载 --nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;snapshotsnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;enabledfalse/enablednbsp; nbsp; nbsp; nbsp; nbsp; nbsp;/snapshotsnbsp; nbsp; nbsp; nbsp;/repositorynbsp; nbsp;/repositories
3.添加依赖添加fastjson的依赖 举个例子 nbsp;dependencynbsp; nbsp; nbsp; nbsp; nbsp; nbsp;groupIdcom.alibaba/groupIdnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;artifactIdfastjson/artifactIdnbsp; nbsp; nbsp; nbsp;/dependency
4.打包项目 4、Maven坐标主要组成
groupId组织标识包名一般常用公司域名的反序比如com.alibaba
artifactId项目名称项目的具体名称
version项目的当前版本 一般版本号为 大版本.小版本.小版本序号
packaging项目的打包方式最为常见的jar和war两种
5、maven生命周期
5.1 名词解释
lifecycle生命周期这是maven最高级别的的控制单元它是一系列的phase组成也就是说一个生命周期就是一个大任务的总称不管它里面分成多少个子任务反正就是运行一个lifecycle就是交待了一个任务运行完后就得到了一个结果中间的过程是phase完成的自己可以定义自己的lifecycle包含自己想要的phase
phase可以理解为任务单元lifecycle是总任务phase就是总任务分出来的一个个子任务但是这些子任务是被规格化的它可以同时被多个lifecycle所包含一个lifecycle可以包含任意个phasephase的执行是按顺序的一个phase可以绑定很多个goal至少为一个没有goal的phase是没有意义的
goal: 这是执行任务的最小单元它可以绑定到任意个phase中一个phase有一个或多个goalgoal也是按顺序执行的一个phase被执行时绑定到phase里的goal会按绑定的时间被顺序执行不管phase已经绑定了多少个goal你自己定义的goal都可以继续绑到phase中
mojo: lifecycle与phase与goal都是概念上的东西mojo才是做具体事情的可以简单理解mojo为goal的实现类它继承于AbstractMojo有一个execute方法goal等的定义都是通过在mojo里定义一些注释的anotation来实现的maven会在打包时自动根据这些anotation生成一些xml文件放在plugin的jar包里
可以通俗理解为lifecyle 是一个公司phrase 是具体的部门goal 是一个项目Mojo 是项目内部的人其他的都是管理层级具体的执行还是人。
5.2 生命周期 5.3 goal 的概念
一个goal是独立的它可以被绑定到多个phase中去也可以一个phase都没有。如果一个goal没有被绑定到任何一个lifecycle它仍然可以直接被调用而不是被lifecycle调用。
因此可以这样理解phase与goal的关系
phase其实就是goal的容器。实际被执行的都是goal。phase被执行时实际执行的都是被绑定到该phase的goal。goal与goal之间是独立的。因此单独执行一个goal不会导致其他goal被执行。
goal可以通俗理解为一个项目。
5.4 生命周期和phase的关系 clean生命周期每套生命周期都由一组阶段(Phase)组成我们平时在命令行输入的命令总会对应于一个特定的阶段。比如运行mvn clean 这个的clean是Clean生命周期的一个阶段。有Clean生命周期也有clean阶段。Clean生命周期一共包含了三个阶段
pre-clean 执行一些需要在clean之前完成的工作clean 移除所有上一次构建生成的文件post-clean 执行一些需要在clean之后立刻完成的工作 mvn clean 中的clean就是上面的clean在一个生命周期中运行某个阶段的时候它之前的所有阶段都会被运行也就是说mvn clean等同于 mvn pre-clean clean 如果我们运行 mvn post-clean 那么 pre-cleanclean 都会被运行。这是Maven很重要的一个规则可以大大简化命令行的输入
执行phase实际执行的是goal。如果一个phase没有绑定goal那这个phase就不会被执行。pluginnbsp;nbsp;groupIdcom.mycompany.example/groupIdnbsp;nbsp;artifactIddisplay-maven-plugin/artifactIdnbsp;nbsp;version1.0/versionnbsp;nbsp;executionsnbsp; nbsp;nbsp;executionnbsp; nbsp; nbsp;nbsp;phaseprocess-test-resources/phasenbsp; nbsp; nbsp;nbsp;goalsnbsp; nbsp; nbsp; nbsp;nbsp;goaltime/goalnbsp; nbsp; nbsp;nbsp;/goalsnbsp; nbsp;nbsp;/executionnbsp;nbsp;/executions/plugin
一个生命周期包含一些列的步骤当执行生命周期的时候会把所有的步骤执行一次
官方文档
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
http://maven.apache.org/ref/3.3.9/maven-core/lifecycles.html
6、idea maven的配置
POM 中可以指定以下配置
项目依赖 dependencies
插件 plugins
执行目标
项目构建 profile
项目版本
项目开发者列表
相关邮件列表信息
具体的配置可以参考fastjson 的配置
https://github.com/alibaba/fastjson/blob/master/pom.xml
7、POM有2个很重要的关系聚合、继承
一、聚合 如果我们想一次构建多个项目模块那我们就需要对多个项目模块进行聚合
1.聚合配置代码modulesnbsp; nbsp; nbsp;nbsp;module模块一/modulenbsp; nbsp; nbsp;nbsp;module模块二/modulenbsp; nbsp; nbsp;nbsp;module模块三/module/modules
例如对项目的Hello、HelloFriend、MakeFriends这三个模块进行聚合modulesnbsp; nbsp; nbsp;nbsp;module../Hello/modulenbsp;nbsp;nbsp; nbsp; nbsp;nbsp;module../HelloFriend/modulenbsp;nbsp; nbsp; nbsp; nbsp;nbsp; nbsp; nbsp;nbsp;module../MakeFriends/module/modules 其中module的路径为相对路径。
二、继承 继承为了消除重复的配置我们把很多相同的配置提取出来例如grouptIdversion相同的依赖包等。
继承配置代码parentnbsp;nbsp;nbsp; nbsp; nbsp; nbsp; nbsp;groupIdme.gacl.maven/groupIdnbsp; nbsp; nbsp; nbsp; nbsp;artifactIdParentProject/artifactIdnbsp; nbsp; nbsp; nbsp; nbsp;version0.0.1-SNAPSHOT/versionnbsp; nbsp; nbsp; nbsp; nbsp;relativePath../ParentProject/pom.xml/relativePathnbsp;nbsp;/parent
Idea 中可以新建一个maven项目然后删光文件夹只留一个pom.xml然后添加模块选择继承。 8、Maven 中的 profile
Maven 中有一个概念叫做profile它主要是为了解决不同环境所需的不同变量、配置等问题。比如我们内网开发的数据库配置端口配置等是和生产环境不同的这个时候就需要区分。
有了 profile可以根据激活的条件启动不同条件下的配置信息。
profile 是可以有多个的也可以同时激活多个 profile方便自由组合。profilesnbsp; nbsp; nbsp; nbsp;profilenbsp; nbsp; nbsp; nbsp; nbsp; nbsp;!--不同环境Profile的唯一id--nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;!--开发环境--nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;iddev/idnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;propertiesnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;!--profiles.active是自定义的字段名字随便起自定义字段可以有多个--nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;profiles.activedev/profiles.activenbsp; nbsp; nbsp; nbsp; nbsp; nbsp;/propertiesnbsp; nbsp; nbsp; nbsp;/profilenbsp; nbsp; nbsp; nbsp;profilenbsp; nbsp; nbsp; nbsp; nbsp; nbsp;!--线上环境--nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;idprod/idnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;propertiesnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;profiles.activeprod/profiles.activenbsp; nbsp; nbsp; nbsp; nbsp; nbsp;/propertiesnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;activationnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;activeByDefaulttrue/activeByDefaultnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;/activationnbsp; nbsp; nbsp; nbsp;/profilenbsp; nbsp;/profiles Idea 中会显示配置的两个profile 可以选择激活 pom文件里的配置为buildnbsp; nbsp; nbsp; nbsp;resourcesnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;resourcenbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;directorysrc/main/resources//directorynbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;!--先排除掉两个文件夹--nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;excludesnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;excludedev/*/excludenbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;excludeprod/*/excludenbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;/excludesnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;includesnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;!--如果有其他定义通用文件需要包含进来--nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;!--includemessages/*/include--nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;/includesnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;/resourcenbsp; nbsp; nbsp; nbsp; nbsp; nbsp;resourcenbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;!--这里是关键根据不同的环境把对应文件夹里的配置文件打包--nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;directorysrc/main/resources/${profiles.active}/directorynbsp; nbsp; nbsp; nbsp; nbsp; nbsp;/resourcenbsp; nbsp; nbsp; nbsp;/resourcesnbsp; nbsp;/build nbsp;nbsp;profilesnbsp; nbsp; nbsp; nbsp;profilenbsp; nbsp; nbsp; nbsp; nbsp; nbsp;!--不同环境Profile的唯一id--nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;!--开发环境--nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;iddev/idnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;propertiesnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;!--profiles.active是自定义的字段名字随便起自定义字段可以有多个--nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;profiles.activedev/profiles.activenbsp; nbsp; nbsp; nbsp; nbsp; nbsp;/propertiesnbsp; nbsp; nbsp; nbsp;/profilenbsp; nbsp; nbsp; nbsp;profilenbsp; nbsp; nbsp; nbsp; nbsp; nbsp;!--线上环境--nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;idprod/idnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;propertiesnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;profiles.activeprod/profiles.activenbsp; nbsp; nbsp; nbsp; nbsp; nbsp;/propertiesnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;activationnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;activeByDefaulttrue/activeByDefaultnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;/activationnbsp; nbsp; nbsp; nbsp;/profilenbsp; nbsp;/profiles
9、maven 插件
Maven的核心仅仅定义了抽象的生命周期具体的任务都是交由插件完成的。
每个插件都能实现多个功能每个功能就是一个插件目标goal。
Maven的生命周期与插件目标相互绑定以完成某个具体的构建任务例如compile就是插件maven-compiler-plugin的一个插件目标。
常用插件maven-antrun-plugin maven-archetype-plugin maven-assembly-plugin maven-dependency-plugin maven-enforcer-plugin maven-help-plugin maven-release-plugin maven-resources-plugin maven-surefire-plugin build-helper-maven-plugin exec-maven-plugin jetty-maven-plugin versions-maven-plugin
10、环境变量
${basedir}表示项目根目录,即包含pom.xml文件的目录;
${version}表示项目版本;
${project.basedir}同${basedir};
${project.baseUri}表示项目文件地址;
${maven.build.timestamp}表示项目构件开始时间;
${maven.build.timestamp.format}表示属性${maven.build.timestamp}的展示格式,默认值为yyyyMMdd-HHmm,可自定义其格式,其类型可参考java.text.SimpleDateFormat。
${project.build.directory}表示主源码路径;
${project.build.sourceEncoding}表示主源码的编码格式;
${project.build.sourceDirectory}表示主源码路径;
${project.build.finalName}表示输出文件名称;
${project.version}表示项目版本,与${version}相同;
${project.xxx} 当前pom文件的任意节点的内容
${env.xxx} 获取系统环境变量。
${settings.xxx} 指代了settings.xml中对应元素的值。 11、Maven 依赖冲突的2个方法
1.统一版本
使用dependencyManagement 进行版本锁定dependencyManagement可以统一管理项目的版本号确保应用的各个项目的依赖和版本一致。
如果我们项目中只想使用spring core 5.2.0的包pom.xml可以改为如下dependencyManagementnbsp; nbsp; nbsp; nbsp;dependenciesnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;dependencynbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;groupIdorg.springframework/groupIdnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;artifactIdspring-core/artifactIdnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;version5.2.0.RELEASE/versionnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;/dependencynbsp; nbsp; nbsp; nbsp;/dependenciesnbsp; nbsp;/dependencyManagement nbsp; nbsp;dependenciesnbsp; nbsp; nbsp; nbsp;dependencynbsp; nbsp; nbsp; nbsp; nbsp; nbsp;groupIdorg.springframework/groupIdnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;artifactIdspring-context/artifactIdnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;version5.2.7.RELEASE/versionnbsp; nbsp; nbsp; nbsp;/dependency nbsp; nbsp; nbsp; nbsp;dependencynbsp; nbsp; nbsp; nbsp; nbsp; nbsp;groupIdorg.springframework/groupIdnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;artifactIdspring-aop/artifactIdnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;version5.2.0.RELEASE/versionnbsp; nbsp; nbsp; nbsp;/dependency nbsp; nbsp;/dependencies
2.排除依赖
依赖查找的两个原则
使用路径近者优先原则直接依赖级别高于传递依赖。
使用第一声明者优先原则谁先定义的就用谁的传递依赖即在pom.xml文件自上而下先声明的jar坐标就先引用该jar的传递依赖。
Idea 可以安装maven helper插件解决冲突。
maven helper插件安装成功点开pom.xml会发现多了一个Dependency Analyzer视图如下上面按钮的图标含义如下
Conflicts查看冲突
All Dependencies as List列表形式查看所有依赖
All Dependencies as Tree树形式查看所有依赖
上图说明有3个jar存在冲突点击冲突的jar可以查看和哪个jar产生冲突如下图 点开pom.xml切换到Dependency Analyzer视图选择All Dependencies as Tree点击要排除的jar右键会出现Execlude选项如下 总结 Maven是开发中常用的工具很重要所以尽可能地掌握。
你还知道Maven的哪些知识欢迎留言交流