目前在市场上所有的项目都已经不是按照传统的package来区分构建了,基本上都会采用项目管理工具来进行构建,目前比较流行的就是maven和gradle,那么我们现在来对maven的知识进行一个总结。
1.Maven的简介
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。
2.为什么使用Maven
(1)一个项目就是一个工程
如果项目非常庞大,就不适合使用package来划分模块,最好是每一个模块对应一个工程,利于分工协作。
借助于maven就可以将一个项目拆分成多个工程
(2)项目中使用jar包,需要“复制”、“粘贴”项目的lib中
同样的jar包重复的出现在不同的项目工程中,你需要做不停的复制粘贴的重复工作。
借助于maven,可以将jar包保存在“仓库”中,不管在哪个项目只要使用引用即可就行。
(3) jar包需要的时候每次都要自己准备好或到官网下载
借助于maven我们可以使用统一的规范方式下载jar包,规范
(4) jar包版本不一致的风险
不同的项目在使用jar包的时候,有可能会导致各个项目的jar包版本不一致,导致未执行错误。
借助于maven,所有的jar包都放在“仓库”中,所有的项目都使用仓库的一份jar包。
(5)一个jar包依赖其他的jar包需要自己手动的加入到项目中
FileUpload组件->IO组件,commons-fileupload-1.3.jar依赖于commons-io-2.0.1.jar
极大的浪费了我们导入包的时间成本,也极大的增加了学习成本。
借助于maven,它会自动的将依赖的jar包导入进来。
3.Maven构建的含义
构建就是把动态的Web工程经过编译得到的编译结果部署到服务器上的整个过程。
(1)编译:java源文件[.java]->编译->Classz字节码文件[.class]
(2)部署:最终在sevlet容器中部署的不是动态web工程,而是编译后的文件
编译前目录:
编译后
编译我们发现resources和src文件夹消失,直接是java编译后的字节码文件和resources下面的配置文件。
(3)构建的各个环节
[1] 清理clean:将以前编译得到的旧文件class字节码文件删除
[2] 编译compile:将java源程序编译成class字节码文件
[3] 测试test:自动测试,自动调用junit程序
[4] 报告report:测试程序执行的结果
[5] 打包package:动态Web工程打War包,java工程打jar包
[6] 安装install:Maven特定的概念-----将打包得到的文件复制到“仓库”中的指定位置
[7] 部署deploy:将动态Web工程生成的war包复制到Servlet容器下,使其可以运行
4.Maven的概念模型
(1)项目对象模型(Project Object Model):
一个maven工程独有一个pom.xml文件,通过pom.xml文件定义项目的坐标、项目依赖、项目信息、插件目标等。
(2)依赖管理系统(Dependency Management System):
通过maven的依赖管理对项目所依赖的jar进行统一管理
5.Maven的拆分和聚合思想
(1)工程的拆分
工程的拆分可以实现分模块开发与测试,可实现多线程开发与管理,提高工程代码复用度的同时也提高软件的开发速度与效率。比如:现在要使用maven工程对一个项目进行拆分,这时候就可以将dao拆解出来,形成独立的工程,同样service,web也都进行这样的拆分把工程拆分成独立的工程,将来要用到的时候就把它们的坐标给引进来就行了.
(2)工程的聚合
我们的项目拆成多个子模块后,独立运行各个模块是无法完成软件项目的要求的,只有把它们都整合起来,分工合作才能完成工作。因此需要父工程来管理各个子模块,把它们聚合在一起运行,把dao,service,web打成一个独立的可运行的war包。
(3)继承的理解
类似java类的继承,其实都是为了消除重复。子类继承父类,父类里有的方法和属性在子类中就不需要再定义和实现了,使用的时候直接调用父类就可以。有一个父工程,子工程(dao,service,web)要用到的依赖都可以在父工程(parentProject)的pom.xml先定义好,将来子工程在开发的时候就不需要再引坐标了。
(4)深度理解
父工程本身不写代码,它里面有一个pom.xml文件,这个文件可以将多个子模块中通用的jar所对应的坐标,集中在父工程中配置,将来的子模块就可以不需要在pom.xml中配置通用jar的坐标了。
6.Maven中的坐标
[XML] 纯文本查看 复制代码 <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
我们俗称 gav:使用下面三个向量子仓库中唯一定位一个 Maven 工程
在项目中的 pom.xml 文件中,我们可以看到下面gav的定义:
(1)groupid:公司或组织域名倒序
<groupid>junit</groupid>
(2)artifactid:模块名,也是实际项目的名称
<artifactid>junit</artifactid>
(3)version:当前项目的版本
<version>4.11</version>
7.pom基本配置介绍
(1)、dependencies:一个 pom.xml 文件中只能存在一个这样的标签。用来管理依赖的总标签。
(2)、dependency:包含在dependencies标签中,可以有无数个,每一个表示一个依赖
(3)、groupId,artifactId和version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。
(4)、type:依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值是jar。
(5)、scope:依赖的范围,默认值是 compile。后面会进行详解。
(6)、optional:标记依赖是否可选。
(7)、exclusions:用来排除传递性依赖。
|