Maven 学习总结

Maven 基本信息

Maven是什么?

Apache Maven是一个软件项目管理和综合工具。基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件。

Maven是一个项目管理和综合工具。Maven提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven使用标准的目录结构和默认构建生命周期。

在多个开发团队环境时,Maven可以设置按标准在非常短的时间里完成配置工作。由于大部分项目的设置都很简单,并且可重复使用,Maven让开发人员的工作更轻松,同时创建报表,检查,构建和测试自动化设置。

Maven的优点

  • 简化了项目依赖管理:
  • 易于上手,对于新手可能一个"mvn clean package"命令就可能满足他的工作
  • 便于与持续集成工具(jenkins)整合
  • 便于项目升级,无论是项目本身升级还是项目使用的依赖升级。
  • 有助于多模块项目的开发,一个模块开发好后,发布到仓库,依赖该模块时可以直接从仓库更新,而不用自己去编译。
  • maven有很多插件,便于功能扩展,比如生产站点,自动发布版本等

Maven的缺点

  • maven采用约定优于配置的策略(convention over configuration),虽然上手容易,但是一旦出了问题,难于调试。
  • 中国的网络环境差,很多repository无法访问,比如google code, jboss 仓库无法访问等。

Maven坐标

一般maven使用[groupID,artifactId,version,packaging]来表示一个项目的某个版本

生命周期和插件

Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”:

  • Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
  • Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
  • Site Lifecycle 生成项目报告,站点,发布站点。

每个生命周期都包含了一些阶段(phase)。三套生命周期相互独立,但各个生命周期中的phase却是有顺序的,且后面的phase依赖于前面的phase。执行某个phase时,其前面的phase会依顺序执行,但不会触发另外两套生命周期中的任何phase。

Maven的核心文件很小,主要的任务都是由插件来完成。定位到:%本地仓库%\org\apache\maven\plugins,可以看到一些下载好的插件
一个插件通常可以完成多个任务,每一个任务就叫做插件的一个目标。

Maven的生命周期是抽象的,实际需要插件来完成任务,这一过程是通过将插件的目标(goal)绑定到生命周期的具体阶段(phase)来完成的。如:maven-compiler-plugin插件的compile目标绑定到default生命周期的compile阶段,完成项目的源代码编译.

关于Maven生命周期和插件的具体信息,可以看:这篇文章

依赖管理

Maven常见的依赖范围

  • compile: 编译依赖,默认的依赖方式,在编译(编译项目和编译测试用例),运行测试用例,运行(项目实际运行)三个阶段都有效,典型地有spring-core等jar。
  • test: 测试依赖,只在编译测试用例和运行测试用例有效,典型地有JUnit。
  • provided: 对于编译和测试有效,不会打包进发布包中,典型的例子为servlet-api,一般的web工程运行时都使用容器的servlet-api。
  • runtime: 只在运行测试用例和实际运行时有效,典型地是jdbc驱动jar包。
  • system: 不从maven仓库获取该jar,而是通过systemPath指定该jar的路径。
  • import: 用于一个dependencyManagement对另一个dependencyManagement的继承。

处理依赖冲突

Maven采用“最近获胜策略(nearest wins strategy)”的方式处理依赖冲突,即如果一个项目最终依赖于相同artifact的多个版本,在依赖树中离项目最近的那个版本将被使用。

关于依赖冲突的具体信息,还有如何手动处理,请看:这篇文章

发表评论

电子邮件地址不会被公开。