合肥市建设工程信息价网站,wordpress ajax 文件,房地产市场现象,初中生编程入门先学什么文章目录 Maven1、Maven 坐标2、Maven 仓库3、Maven 依赖依赖配置依赖范围依赖调解原则排除依赖 4、Maven 生命周期5、Maven 聚合与继承 Maven
Maven是一个项目管理工具#xff0c;它包含了项目对象模型#xff08;POM#xff1a;Project Object Model#xff09;#xf… 文章目录 Maven1、Maven 坐标2、Maven 仓库3、Maven 依赖依赖配置依赖范围依赖调解原则排除依赖 4、Maven 生命周期5、Maven 聚合与继承 Maven
Maven是一个项目管理工具它包含了项目对象模型POMProject Object Model项目生命周期Project Lifecycle依赖管理系统Dependency Management System和用来运行定义在生命周期阶段phase的插件plugin以及一组标准集合。
项目对象模型Project Object Model一个maven工程都有一个pom.xml文件通过pom.xml文件定义项目的坐标、项目依赖、项目信息、插件目标等。项目生命周期Project Lifecycle使用maven完成项目的构建项目构建包括清理、编译、测试、部署等过程maven将这些过程规范为一个生命周期。依赖管理系统Dependency Management System通过maven的依赖管理对项目所依赖的jar 包进行统一管理。插件pluginmaven 管理项目生命周期过程都是基于插件完成的。一组标准集合maven将整个项目管理过程定义一组标准比如通过maven构建工程有标准的目录结构有标准的生命周期阶段、依赖管理有标准的坐标定义等。
Maven的两个核心作用
依赖管理Maven把项目所需要得jar包保存在Maven仓库里面通过在pom.xml文件中添加所需jar包的坐标在用到这些jar包时会根据pom.xml中jar包的坐标把jar包引入进来拿去执行项目构建指的是项目从编译、测试、运行、打包、安装 部署整个过程都交给maven进行管理使用maven一个命令可以轻松完成整个工作本质上 Maven 是一个插件执行框架所有的执行过程都是由一个一个插件独立完成的
1、Maven 坐标
gav项目中依赖的第三方库以及插件可统称为构件也可以叫依赖。每一个构件都可以使用 Maven 坐标唯一标识也就是说通过 Maven 坐标我们就可以找到对应的唯一的构件坐标元素包括
groupId该 Maven 项目隶属的公司或组织artifactId当前 Maven 项目的名称项目的唯一标识符version定义了当前 Maven 项目所处的版本packaging可选定义了 Maven 项目的打包方式比如 jarwar…默认使用 jarclassifier(可选)常用于区分从同一 POM 构建的具有不同内容的构件可以是任意的字符串附加在版本号之后
2、Maven 仓库
本地仓库settings.xml 文件中可以看到 Maven 的本地仓库路径配置默认本地仓库路径是在 ${user.home}/.m2/repository。
远程仓库官方或者其他组织维护的 Maven 仓库远程仓库可以分为三种
中央仓库这个仓库是由 Maven 社区来维护的里面存放了绝大多数开源软件的包并且是作为 Maven 的默认配置但是国内访问较慢一般我们会通过配置镜像来加速。私服私服是一种特殊的远程 Maven 仓库它是架设在局域网内的仓库服务私服一般被配置为互联网远程仓库的镜像供局域网内的 Maven 用户使用公司一般都会采用私服作为远程仓库。其他的公共仓库有一些公共仓库是为了加速访问比如阿里云 Maven 镜像仓库或者部分构件不存在于中央仓库中。
Maven 依赖包寻找顺序先本地仓库 - 后远程仓库 - 都没有则报错
3、Maven 依赖
依赖配置
dependencies一个 pom.xml 文件中只能存在一个这样的标签是用来管理依赖的总标签。
dependency包含在 dependencies 标签中可以有多个每一个表示项目的一个依赖。
groupId,artifactId,version(必要)依赖的基本坐标对于任何一个依赖来说基本坐标是最重要的Maven 根据坐标才能找到需要的依赖。
type(可选)依赖的类型对应于项目坐标定义的 packaging。大部分情况下该元素不必声明其默认值是 jar。
scope(可选)依赖的作用范围默认值是 compile。
optional(可选)标记依赖是否可选
exclusions(可选)用来排除传递性依赖例如 jar 包冲突
依赖范围
classpath 用于指定 .class 文件存放的位置类加载器会从该路径中加载所需的 .class 文件到内存中。
Maven 编译、测试、运行有三套不同的 classpath
编译 classpath编译主代码有效测试 classpath编译、运行测试代码有效运行 classpath项目运行时有效
Maven 的依赖范围如下
compile编译依赖范围默认使用此依赖范围对于编译、测试、运行三种都有效即在编译、测试和运行的时候都要使用该依赖 Jar 包。provided此依赖范围对于编译和测试有效而对运行时无效。典型如 lombok。runtime运行时依赖范围对于测试和运行有效但是在编译主代码时无效典型的就是 JDBC 驱动实现。test测试依赖范围从字面意思就可以知道此依赖范围只能用于测试而在编译和运行项目时无法使用此类依赖典型的是 JUnit它只用于编译测试代码和运行测试代码的时候才需要。system系统依赖范围使用 system 范围的依赖时必须通过 systemPath 元素显式地指定依赖文件的路径不依赖 Maven 仓库解析所以可能会造成构件不可移植。import将其他模块定义好的 dependencyManagement 导入当前 Maven 项目 pom 的 dependencyManagement 中不会对三种classpath产生影响。
依赖调解原则
1、对于 Maven 而言同一个 groupId 同一个 artifactId 下只能使用一个 version。若相同类型但版本不同的依赖存在于同一个 pom 文件只会引入后一个声明的依赖。
2、由于 Maven 的依赖传递如果项目的两个依赖同时引入了某个版本不一致的依赖则会产生冲突
两个原则最短路径优先 和 声明顺序优先
假设 A-B-C-X(2.0)A-D-X(1.0)则 X(1.0) 会被引用。
假设 A-B-C-X(1.0)A-D-C-X(2.0)如果 B 声明在 D 之前则X(1.0)被引用反之。
此时可通过依赖分析找到有冲突的依赖比如使用 IDEA插件 Maven Helper 等
排除依赖
如果只依靠 Maven 进行依赖调解很多情况下是不能满足的需要手动排除依赖。
还是 A-B-C-X(2.0)A-D-X(1.0) 这个例子根据最短路径优先原则我们引入了 X(1.0)但是如果 C 用到了某个 X(1.0) 没有的类或者方法就会报找不到类/方法的错误NoSuchMethodError 和 ClassNotFoundException。
此时就需要我们通过 exclusion 标签将 X(1.0) 给排除这样 Maven 就会引用 X(2.0)。
在解决依赖冲突的时候一般会优先保留版本较高的。这是因为大部分 jar 在升级的时候都会做到向下兼容。
4、Maven 生命周期 Maven 标准生命周期作用clean项目清理删除 target目录defaultbuild项目部署site项目站点文档创建
我们平时接触最多的就是 default 生命周期并且七个核心阶段都是顺序执行的。
核心阶段作用validate验证项目是否正确所有必要信息是否可用很少单独使用compile编译项目的源代码将src/main中的java代码编译成class文件输出到targe目录下test将单元测试的资源文件和代码进行编译生成的文件位于target/test-classes 打包部署请跳过该阶段package把class文件resources文件打包成jar包也可以是war包生成的jar包位于target目录下verify检查包是否有效很少单独使用install将jar部署到本地仓库本地的其他模块依赖该jar包时可以直接从本地仓库去获取deploy将jar包部署到远端仓库需要在maven的setting.xml中配置私服的用户名和密码以及在pom.xml配置
也就是说如果我们执行了 mvn package会从 mvn validate 开始一直执行到 package其他同理。但是不会执行 mvn clean因为 clean、site、default 都是独立的生命周期。因此保险起见在执行 package、install、deploy 之前先 clean。
5、Maven 聚合与继承
聚合对于复杂的Maven项目一般建议采用多模块的方式来设计开发便于后期维护管理。但是构建项目时如果每次都需要按模块一个一个进行构建会十分麻烦而Maven的聚合功能就可以很好的解决这个问题当用户对聚合模块执行构建任务时会对所有被其聚合的模块自动地依次进行构建任务。
继承在一个多模块的项目中对于同一个依赖的依赖声明要在多个模块的POM都进行声明会导致有大量重复的依赖声明。所以Maven在设计之时借鉴了面向对象中的继承思想可在父模块的POM中声明依赖子模块的POM文件可通过继承父模块的POM来获得对相关依赖的声明。对于父模块而言其目的是为了消除子模块的POM文件的重复配置其不含有任何实际的项目代码所以父模块POM文件的packaging元素同样需要设置为pom。
参考文章推荐阅读
Maven – 构建生命周期简介 (apache.org)
高效使用Java构建工具Maven篇 (qq.com)
maven学习笔记(超详细总结) - clear_love8 - 博客园 (cnblogs.com)