maven的本质是一个跨平台的项目管理工具
它主要有两个功能:构建与依赖管理
(一)构建
构建是什么,以“java源文件”,“框架配置文件”,“JSP”,“HTML”,“图片”等资源为原材料去生产一个可以运行的项目的过程
以java语言为例,如果我们没有这些工具,我们就需要手动进行以下操作
编译我们自己写的源代码.java文件,形成.class文件。使用javac命令。
javac Hello.java
如果我们源码中使用到了第三方代码,就需要-classpath加入对应的jar包进去
javac -cp tom.jar Hello.java
使用java命令运行,也需要引入使用到的第三方jar包
Java -classpath .;/home/wangke/tom.jar com.hello.wangke.Hello
运行java命令的时候,实际就是启动了一个虚拟机,系统提供了三种类加载器:
Ø 启动类加载器(Bootstrap ClassLoader),负责将存放在
Ø 扩展类加载器,负责加载
Ø 应用程序类加载器(Application ClassLoader),负责加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。
我们就要手动保证我们用到的所有类都能成功正确的被加载进来
打包为jar包、war包等
jar -cvfm hello.jar META-INF\MANIFEST.MF Hello.class Tom.class
该命令表示用第一个文件当做MANIFEST.MF文件,hello.jar作为名称,将Hello.class和Tom.class打成jar包。其中多了一个参数m,表示要定义MENIFEST文件
以上一系列的操作:编译、运行、单元测试、生成文档、打包部署等,如果手工敲命令进行操作,则会非常繁琐并且重复
所以有一些IDE如eclipse、intelijIDEA等可以可视化的操作,但这又带来了大量的手动操作,引入依赖,编译,测试,这些都需要手动操作,手动操作意味着低效、容易出错。
缺点:
1.依赖大量的手工操作,效率低、容易出错
2.很难在项目中统一所有的IDE配置
所以就出现了我们的构建工具。
最早的构建工具是make,然后有了Ant,然后有maven,gradle
就可以将我们从“编译,打包,部署,测试”这些程式化的工作上解放出来,我们只需要关注问题本身与解决
Maven对以上“编译,打包,部署,测试”的步骤梳理为自动化的脚本:
[1]mvn clean:清理
[2]mvn compile:编译主程序
[3]mvn test-compile:编译测试程序
[4]mvn test:执行测试
[5]mvn package:打包
[6]mvn install:安装
[7]mvn site:生成站点
[8]mvn deploy:部署
(二)依赖管理
比如我们项目依赖A,B,C,而他们底层还依赖其他第三方包
1)我们首先要知道他们之间的依赖关系,如果所有jar包之间的依赖都需要程序员自己非常清楚了解,那么极大增加学习成本
2)还需要手动将他们全部都引入,手动“复制”、"粘贴"到WEB-INF/lib目录下
3)下载这些jar包也需要手动下载,去官网或者其他途径下载
为了解决以上问题,maven将每个三方包做了唯一标识,也就是依赖管理的底层基础-------坐标。Maven坐标的元素就包括:groupid、artifactID、version、packaging、classifier
Groupid:定义其隶属的公司或者项目,它的表示方式是域名反向一一对应,如spark项目:org.apache.spark
Artifactid:定义项目名或者模块名-
Version:项目的版本号
Packaging:定义打包方式,可以打包为jar包、war包等,不定义时默认为jar
上述5个元素中,groupid、artifactid、version是必须定义的,packaging是可选的(默认为jar),而classifier是不能直接定义的
这个值是通过某些特定的插件生成的,比如我们打包a-1.0-javadoc.jar,a-1.0-sources.jar文档或者源码,javadoc和sources就是classifier。
如果一个项目比较庞大,里面很多模块,那么groupid这一层就定义到项目名这一级别,artifactid定义到模块名,如spark的项目
ArtifactID定义模块名的时候,推荐的做法是项目名称作为前缀。如果没有前缀,那么就会看到很多core_2.11-2.3.0.jar,而加了之后spark-core_2.11-2.3.0.jar才能比较好的识别
但如果是一个没有子模块的项目,则groupid这一层就定义到公司这一级别,artifactid定义到项目级别,如fastjson的项目
比如我们自己的项目中:
依赖管理
有了maven的坐标唯一标识之后,就可以做依赖管理了,就是通过一个核心的配置pom.xml
在pom.xml中我们写入三个
可以看到它生成的依赖是多于3个了,因为这三个依赖自己底层还依赖其他,maven就帮我们把他们都引入进来了
能够引入进来的原因就是我们依赖的elasticsearch的pom文件,它里面也有它自己的一系列依赖
所以坐标唯一标识一个项目
Pom定义项目之间的联系,通过配置的方式实现依赖管理