一、Maven简介
1.1 Maven是什么
Maven这个单词来自于意第绪语,意为知识的积累,最早在Jakata Turbine项目中它被用来简化项目的构建过程。当时有很多项目,它们的Ant build文件仅有细微的差别,而JAR文件都由CVS来维护。于是Maven创始者开始了Maven这个项目,该项目的清晰定义包括,一种很方便的发布 项目信息的方式,以及一种在多个项目中共享JAR的方式。
Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定 义的项目对象模型来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
Maven包含一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。
1.2 Maven能干什么
(1)项目构建
(2)文档管理
(3)生成测试报告
(4)解决项目间依赖项
(5)源代码版本管理
(6)项目Releases
(7)项目的分发
1.3 Maven生命周期
Clean Lifecycle在进行真正的构建之前进行一些清理工作。
Default Lifecycle构建的核心部分,编译,测试,打包,部署等等。
Site Lifecycle生成项目报告,站点,发布站点。
参考文章:
https://blog.csdn.net/luanlouis/article/details/50492163
1.4 Maven生命周期详解
(1)clean生命周期
clean生命周期的目的是清理项目,它包含三个阶段:
1)pre-clean 执行一些清理前需要完成的工作。
2)clean 清理上一次构建生成的文件。
3)post-clean 执行一些清理后需要完成的工作。
(2)default生命周期
default生命周期定义了真正构件时所需要执行的所有步骤,它是生命周期中最核心的部分,它包含的阶段如下:
1)validate验证项目是否正确和所有需要的相关资源是否可用
2) initialize 初始化构建
3) generate-sources
4) process-sources处理源代码
5) generate-resources
6) process-resources处理项目主资源文件。对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中。
7) compile 编译项目的主源代码
8) process-classes
9) generate-test-sources
10) process-test-sources处理项目测试资源文件
11)generate-test-resources
12) process-test-resources处理测试的资源文件
13)test-compile 编译项目的测试代码
14)process-test-classes
15) test使用单元测试框架运行测试,测试代码不会被打包或部署
16)prepare-package 做好打包的准备
17)package 接受编译好的代码,打包成可发布的格式
18) pre-integration-test
19) integration-test
20) postintegration-test
21) verify
22) install将包安装到Maven本地仓库,供本地其他Maven项目使用
23)deploy 将最终的包复制到远程仓库,供其他开发人员和Maven项目使用
(3)site生命周期
site生命周期的目的是建立和发布项目站点,Maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。该生命周期包含如下阶段:
1)pre-site 执行一些在生成项目站点之前需要完成的工作
2)site 生成项目站点文档
3)post-site 执行一些在生成项目站点之后需要完成的工作
4)site-deploy 将生成的项目站点发布到服务器上
二、Maven坐标
2.1 groupId:
定义当前Maven项目隶属的实际项目。Spring
Framework有多个子模块,例如spring-core、spring-context、spring-beans、spring-test等。
2.2 artifactId:
该元素定义实际项目中的一个Maven项目(子模块),推荐的做法是使用实际项目名称作为artifactId的前缀,这样做的好处是方便寻找实际构件。
2.3 version:
该元素定义Maven项目当前所处的版本,如上例中spring-jdbc的版本为4.3.2.RELEASE。
2.4 packaging:
该元素定义Maven项目的打包方式。打包方式通常与所生成构件的文件扩展名对应。如packaging为jar,最终的文件名为artifactId-version.jar。当不定义packaging时,Maven会使用默认值jar。
2.5 classifier:
该元素用来帮助定义构件输出的一些附属构件。附属构件与主构件对应,如上例中主构件是spring-jdbc-4.3.2.RELEASE.jar,该项目可能还会通过使用一些插件生成如spring-jdbc-4.3.2.RELEASE-javadoc.jar、spring-jdbc-4.3.2.RELEASE-source.jar这样一些附属构件。
上述5个元素中,groupId、artifactId、version是必须定义的,packaging是可选的(默认为jar),而classifier是不能直接定义的。
三、Maven依赖中的scope详解
3.1 compile
默认就是compile,什么都不配置也就是意味着compile。compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。
3.2 test
scope为test表示依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。比较典型的如junit。
3.3 runntime
runntime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过编译而已,说实话在终端的项目(非开源,企业内部系统)中,和compile区别不是很大。比较常见的如JSR×××的实现,对应的API jar是compile的,具体实现是runtime的,compile只需要知道接口就足够了。oracle jdbc驱动架包就是一个很好的例子,一般scope为runntime。另外runntime的依赖通常和optional搭配使用,optional为true。我可以用A实现,也可以用B实现。
3.4 provided
provided意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude的动作。
3.5 system
从参与度来说,也provided相同,不过被依赖项不会从maven仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用。
3.6 scope的依赖传递
A–>B–>C。当前项目为A,A依赖于B,B依赖于C。知道B在A项目中的scope,那么怎么知道C在A中的scope呢?答案是:
当C是test或者provided时,C直接被丢弃,A不依赖C;
否则A依赖C,C的scope继承于B的scope。
下面是一张nexus画的图。
四、Maven仓库管理
4.1 Maven仓库
用来统一存储所有Maven共享构建的位置就是仓库
4.2、Maven仓库布局
根据Maven坐标定义每个构建在仓库中唯一存储路径,大致为:
groupId/artifactId/version/artifactId-version.packaging
4.3、Maven本地仓库
每个用户只有一个本地仓库,默认是在~/.m2/repository/,~代表的是用户目录
4.4 Maven远程仓库
1、中央仓库:Maven默认的远程仓库,URL地址:http://search.maven.org/
2、[endif]私服:是一种特殊的远程仓库,它是架设在局域网内的仓库
网友评论