Maven介绍
maven概念模型
Maven是Apache下的一个开源项目,它是一个创新的项目管理工具,它用于对Java项目进行项目构建、依赖管理及项目信息管理
Maven包含了一个项目对象模型(Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑
项目对象模型(Project Object Model)
? 通过pom.xml文件定义项目的坐标、项目依赖、项目信息、插件目标、打包方式等。
依赖管理系统(Dependency Management System)
? 通过定义项目所依赖组件的坐标有maven进行依赖管理。
? 比如:项目依赖spring-context, 通过在pom.xml中定义依赖即可将spring-context的jar包自动加入到工程
一个项目生命周期(Project Lifecycle)
? 一个软件开发人员每天都在完成项目的生命周期:清理、编译、测试、部署,有的手工完成,有的通过Ant(项目构建工具)脚本自动完成,maven将项目生命周期抽象统一为:清理、初始化、编译、测试、 告、打包、部署、站点生成等。Maven就是要保证一致的项目构建流程,通过执行一些简单的命令即可实现上面生命周期的各个过程
插件(plugin)目标(goal)
? maven管理项目生命周期过程都是基于插件完成的
项目构建工具
-
Ant
??最早的构建工具,基于IDE,在2000年左右诞生,是当时最流行的 java 构建工具,不过它的 XML 脚本编写格式使得 XML 文件特别大,但是其对工程构建过程中的过程控制得特别好。 -
Maven
??项目对象模型,通过其描述信息来管理项目的构建, 告和文档的软件项目管理工具。它填补了 Ant 的缺点,仍然采用 XML 作为配置文件格式,第一次支持了从 络上下载的功能,只需给定依赖的 URL,Maven便会自动将依赖 jar 包下载到本地。Maven 专注的是依赖管理,使用 java 编写。 -
Gradle
??结合了以上两个的优点,继承了 Ant 的灵活性和 Maven 的生命周期管理,它最后被 google 采用,作为 Android 的御用管理工具。它与前两个相比最大的区别在于不用 XML 作为配置文件格式,采用了 DSL 格式,使得脚本更加简洁。
目前市面上 Ant 版本比较老,所以一般是一些比较传统的软件公司使用;Maven 使用 java 编写,是当下大多数互联 公司会使用的一个构建工具;Gradle 是用 groovy 编写的,是目前比较新型的构建工具,一些初创互联 公司会使用,以后有很大的使用空间
Maven四大特性
- 依赖管理
??Maven 为 java 世界引入了一个新的依赖管理系统:jar 包管理。当需要使用某个 jar 包时,不需要再从 络上下载并导入了,只需要配置其依赖即可;而当 jar 包需要升级时,也不需要重新下载最新的包并重新导入,只要修改 pom.xml 配置文件即可。在 java 世界中,可以用 groupId、artifactId、version 组成的 Coordination(坐标)唯一标识一个依赖。
同时,任何基于 Maven 构建的项目自身也必须定义这三项属性,生成的包可以是 jar 包,也可以是 war 包。一个典型的依赖引用如下所示:
坐标属性的理解
??Maven 坐标为各种组件引入了秩序,任何一个组件都必须定义自己的坐标
groupId:定义当前Maven项目隶属的实际项目-公司名称(jar 包所在仓库路径)。由于 Maven 中模块的概念,因此一个实际项目往往会被划分为很多模块。比如 Spring 是一个实际项目,其对应的 Maven 模块会有很多,如spring-core、spring-webmvc等。
artifactId:该元素定义实际项目中的一个 Maven 模块-项目名,推荐的做法是使用实际项目名称作为 artifactId 的前缀。比如,spring-bean、spring-webmvc等。
version:该元素定义 Maven 项目当前所处的版本
2. 多模块构建
??项目复查时,使用将 dao、service、controller 层分离的方式,将一个项目分解为多个模块已经是一个很通用的方式。
在 Maven 中需要定义一个 parent POM 作为一组 module 的聚合 POM。在该 POM 中可以使用 标签来定义一组子模块。parent POM 不会有什么实际构建产出,而 parent POM 中的 build 配置以及依赖配置都会自动继承给子模块。
-
一致的项目结构
??在 Ant 时代,大家创建 java 项目目录时比较随意,然后通过 Ant 配置指定哪些属于 source,哪些属于 testSource等。并且,不同的 IDE (IDEA和Eclipse)创建项目时,目录结构是不一样的,这就会导致两种 IDE 的项目不能兼容导入。而 Maven 在设计之初的理念就是 “Conversion over configuration”(约定大于配置),其制定了一套统一的项目目录结构作为标准的 java maven 项目结构,解决了不同 IDE 带来的文件目录不一致问题,只要是 Maven 项目,在各个 IDE 中建立的项目结构都是一样的。 -
一致的构建模型和插件机制
??在编写 JavaWeb 项目时需要使用类似 tomcat 的服务器,我们可以通过插件的形式将服务器引入进来。例如,如果需要使用 jetty 的服务器,可以通过下面的配置将 jetty 服务器引入进来
maven的仓库
maven工程需要配置仓库,本地的项目A项目B等通过maven从远程仓库( 络上的仓库)下载jar包并存在本地仓库,本地仓库就是本地文件夹,当第二次需要此jar包时则不需要从远程仓库下载,因为本地仓库已经存在了,可以将本地仓库理解为缓存,有了本地仓库就不用每次从远程仓库下载
Maven仓库类型:
- 本地仓库:用来存储远程仓库货中央仓库下载的插件和jar包,项目使用一些插件或jar包,优先从本地仓库查找
- 远程仓库:如果本地需要插件或者jar包,本地仓库没有,默认去远程仓库下载
- 中央仓库:在maven环境内部内置一个远程仓库地址http://repo1.maven.org/maven2,它是中央仓库,服务于整个互联 ,它是由maven自己维护,里面有大量的常用类库,并包含该了世界上大部分流行的开源项目构件
项目生命周期
Maven有三套项目独立的生命周期,相互独立:
- Clean Lifecycle在进行真正的构建之前进行一些清理工作
- Default Lifecycle构建的核心部分,编译、测试、打包、部署等等
- Site Lifecycle生产项目 告、站点、发布站点
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树Java概览Maven基础93810 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!