文章目录
一、几个基本概念理解
前言
maven是apache 下的一个开源项目管理软件;可以实现编译、打包等功能,也可以管理项目与项目之间的关系(依赖、继承、聚合)。
一、几个基本概念理解
1、(POM)项目对象模型:是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,xml中通过一小段描述信息来管理项目的依赖、构建、报告和文档等等。
2、坐标:maven寻找构件的依据,每个存在于maven中的依赖都必须具有唯一的坐标。通过groupId、artifactId、version、packaging、classifier几个标签来进行定义。
groupId:往往定义项目的名称,通常格式为:org.组织名称.项目名称;
artifactId:项目模块名称,即我们通常说的project工程名称,是具体的应用名称;
version:当前项目所处的版本;
packaging: 项目的打包方式;非必填,默认为jar方式;
classifier:定义附属构建;项目除了可以生成主构件XXX.jar外,还可以通过一些插件生成XXX-sources.jar,XXX-doc.jar等附属构件,分别以源码的形式打包和文档的形式打包来做项目呈现;
3、仓库:
本地仓库:
远程仓库(中央仓库、局域网私服仓库):
4、父子工程和聚合工程:
一个父模块下面多个子模块,子模块与父模块为继承关系,众多子模块互相之间为聚合关系。
二、依赖
1. 依赖的传递性
直白解释:
项目一依赖了某个jar包;
项目二依赖了项目一,则项目二会自动也依赖了项目一依赖的jar包;
2.maven解决依赖冲突默认的两个原则
依赖冲突:项目中有存在多处对同一依赖的不同版本的引用,即坐标相同,版本号不同;
两个原则:
第一原则:最短路径原则
第二原则:最先声明原则
在pom中依赖声明的顺序靠前的依赖将被使用;
当第一原则不适用(冲突依赖的最短路径一致)的情况下,适用第二原则。第二原则是maven2.0.9定义的,目的是为了尽可能的避免构建的不确定性,在此版本之前第一原则不适用的场景下的依赖是不确定的。
3、依赖的有效范围
compile(默认使用该依赖范围):对于编译 测试 运行三种的classpath都有效
provided:于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行的时候,由于容器已经提供,就不需要maven重复地引入一遍。打包的时候可以不用包进去,别的设施会提供。
runtime:运行时依赖范围。使用此依赖范围的maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要jdk提供的jdbc的接口,只有在执行测试或者运行测试的时候才需要实现上述接口的jdbc的驱动。
System:
test:只对于测试的classpath有效;
import:导入依赖范围。该依赖范围不会对三种classpath产生实际的影响。只有在dependencyManagement下才有效果。父子工程中,父工程专门用作版本管理时,如果指定了scope=import,则子工程不可以再自行定义依赖的版本,必须使用父工程指定的版本号;(上图为父工程配置,下图为子工程配置),dependencyManagement标签表示只是声明依赖,并不实际引入。
三、项目的打包类型
如:<packaging>jar</ packaging>
pom ---------> 父类型都为pom类型
jar ---------> 内部调用或者是作服务使用(默认为jar)
war ---------> 需要部署的项目
四、项目的继承关系和聚合关系
一个父模块下面多个子模块,子模块与父模块为继承关系,众多子模块互相之间为聚合关系(上图为父模块配置,下图为子模块配置)
五、插件配置
通过三个常用插件的使用来举例:
1)编译器插件
当子模块使用的jdk版本不是maven的settings.xml文件中指定的jdk版本时,可以通过pom文件中以下配置指定自身特有的编译器版本,而不再使用settings.xml中配置的全局编译器版本;
2)资源拷贝插件
maven项目build打包的时候,默认会把resources下面的配置文件打包到classes目录下面,但是如果想要把java下面的配置文件也打包到classes目录下面,可以添加资源拷贝插件并指定打包目录和文件;
3)Tomcat插件
六、maven命令
maven是通过一系列命令来完成功能的,但是IDE都有对应的可视化界面如下图所示:
clean:清除编译文件和打包文件
compile:生成编译文件,相当于javac命令
package:生成编译文件并生成打包文件,相当于java命令
install:生成编译文件和打包文件,相当于java命令;
deploy:如果想把打包文件放到私服仓库,需要执行deploy命令,用到的不多;