maven权威指南笔记(一)

第一章 maven介绍
1.什么是maven?
像Ant这样的构建工具仅仅是关注预处理,编译,打包,测试和分发。像 Maven 这样的一个项目管理工具提供了构建工具所提供功能的超集。 除了提供构建的功能,Maven还可以生成报告,生成Web站点,并且帮助推动工作团 队成员间的交流。
一个更正式的 Apache Maven的定义: Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Life cycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。 当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
2.maven的理念:约定优于配置 (加快开发速度)
Maven通过给项目提供明智的默认行为来融合这个概念。 在没有自定义的情况下,源代码假定是在
usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/src/main/java
资源文件假定是在/usr/local/hudson/hudsonhome/jobs/maven-guide-zh-to-production/workspace/content-zh/src/main/resources
测试代码假定是在/usr/local/hudson/hudson-home/jobs/maven-guide-zh-toproduction/workspace/content-zh/src/test
项目假定会产生一个 JAR 文件。Maven假定你想要把编译好的字节码放到 /usr/local/hudson/hudson-home/jobs/maven-guidezh-to-production/workspace/content-zh/target/classes
并且在
/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/target
创建一个可分发的 JAR 文件。 虽然这看起来无关紧要,但是想想大部分基于 Ant 的构建必须为每个子项目定义这些目录。 Maven 对约定优于配置的应用不仅仅是简单的目录位置,Maven 的核心插件使用了一组通用的约定,以用来编译源代码,打包可分发的构件,生成 web 站点,还有许多其他的过程。 Maven 的力量来自它的"武断",它有一个定义好的生命周期和一组知道如何构建和装配软件的通用插件。如果你遵循这些约定,Maven 只需要几乎为零的工作——仅仅是将你的源代码放到正确的目录,Maven 将会帮你处理剩下的事情。
3.Maven是一个一般的接口
在 Maven 为构建软件提供一个一般的接口之前,每个单独的项目都专门有人来管理一个完全自定义的构建系统。开发人员必须在开发软件之外去学习每个他们要参与的新项目的构建系统的特点。
如果一个新的进行静态源码分析的源码分析工具面世了,或者如果有人开发了一个新的单元测试框架,每个人都必须放下手头的工作去想办法使这个新东西适应每个项目的自定义构建环境。 如何运行单元测试?世界上有一千种不同的答案。构建环境由无数无休止的关于工具和构建程序的争论所描述刻画。Maven 之前的时代是低效率的时代,是“构建工程师”的时代。
现在,你只要签出源码,然后运行: mvn install 。虽然 Maven 有很多优点,包括依赖管理和通过插件重用一般的构建逻辑,但它成功的最核心原因是它定义了构建软件的一般的接口。每当你看到一个使用 Maven 项目如 Apache Wicket,你就可以假设你能签出它的源码然后使用 mvn install 构建它,没什么争论的。
4.基于Maven插件的全局性重用
Maven 的核心其实不做什么实际的事情,除了解析一些 XML 文档,管理生命周期与插件之外,它什么也不懂。Maven 被设计成将主要的职责委派给一组 Maven 插件,这些插件可以影响 Maven 生命周期,提供对目标的访问。绝大多数 Maven 的动作发生于Maven 插件的目标,如编译源码,打包二进制代码,发布站点和其它构建任务。你从Apache 下载的 Maven 不知道如何打包 WAR 文件,也不知道如何运行单元测试,Maven大部分的智能是由插件实现的,而插件从 Maven 仓库获得。事实上,第一次你用全新的 Maven 安装运行诸如 mvn install 命令的时候,它会从中央 Maven 仓库下载大部分核心 Maven 插件。这不仅仅是一个最小化 Maven 分发包大小的技巧,这种方式更能让你升级插件以给你项目的构建提高能力。Maven 从远程仓库获取依赖和插件的这一事实允许了构建逻辑的全局性重用。
Maven Surefire 插件是负责运行单元测试的插件。从版本 1.0 发展到目前广泛使用的在 JUnit 基础上增加了 TestNG 测试框架支持的版本。不用升级 Maven 安装或者新装任何软件,你就能获得这些功能。更重要的是,除了 POM 中一个插件的版本号,你不需要更改你项目的任何东西。这种机制不仅仅适用于 Surefire 插件,项目使用ompiler 插件进行编译,通过 Jar插件变成 JAR 文件,还有一些插件生成报告,运行 JRuby 和 Groovy 的代码,以及一些用来向远程服务器发布站点的插件。Maven 将一般的构建任务抽象成插件,同时这些插件得到了很好的维护以及全局的共享,你不需要从头开始自定义你项目的构建系统然后提供支持。你完全可以从 Maven 插件获益,这些插件有人维护,可以从远程仓库下载到。这就是基于 Maven 插件的全局性重用。
5.一个项目的概念模型
Maven 维护了一个项目的模型,你不仅仅需要把源码编译成字节码,你还需要开发软件项目的描述信息,为项目指定一组唯一的坐标。你要描述项目的的属性。项目的许可证是什么?谁开发这个项目,为这个项目做贡献?这个项目依赖于其它什么项目没有?Maven不仅仅是一个“构建工具”,它不仅仅是在类似于 make 和 Ant 的工具的基础上的改进,它是包含了一组关于软件项目和软件开发的语义规则的平台。这个基于每一个项目定义的模型实现了如下特征:
(1)依赖管理
由于项目是根据一个包含组标识符,构件标识符和版本的唯一的坐标定义的。项目间可以使用这些坐标来声明依赖。
(2)远程仓库
和项目依赖相关的,我们可以使用定义在项目对象模型(POM)中的坐标来创建Maven 构件的仓库。
(3)全局性构建逻辑重用
插件被编写成和项目模型对象(POM)一起工作,它们没有被设计成操作某一个已知位置的特定文件。一切都被抽象到模型中,插件配置和自定义行为都在模型中进行。
(4)工具可移植性/集成
像 Eclipse,NetBeans,和 InteliJ 这样的工具现在有共同的地方来找到项目的信息。在 Maven 出现之前,每个 IDE 都有不同的方法来存储实际上是自定义项目对象模型(POM)的信息。Maven 标准化了这种描述,而虽然每个 IDE 仍然继续维护它的自定义项目文件,但这些文件现在可以很容易的由模型生成。
便于搜索和过滤构件
像 Nexus 这样的工具允许你使用存储在 POM 中的信息对仓库中的内容进行索引和搜索。Maven 为软件项目的语义一致性描述的开端提供了一个基础。
你很容易的在你项目的 Maven构建中集成 Ant 构建脚本。这是 Maven 项目一种很常见的使用模式
Maven并不是完全根据你构建系统的机制来定义的,它不是为你构建的不同任务编写脚本,它提倡一组标注,一个一般的接口,一个生命周期,一个标准的仓库格式,一个标准的目录布局,等等。它当然也不太在意 POM 的格式正好是 XML 还是 YAML 还是 Ruby。它比这些大得多,Maven 涉及的比构建工具本身多得多。在 Maven 中,要从 Java 源码创建一个JAR 文件,你只需要创建一个简单的 pom.xml,将你的源码放在 /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/src/main/java
然后从命令行运行 mvn install
例 1.2. 一个简单的 Maven pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
</project>
这就是你 pom.xml 的全部。从命令行运行 mvn install 会处理资源文件,编译源代码,运行单元测试,创建一个 JAR ,然后把这个 JAR 安装到本地仓库以为其它项目提供重用性。不用做任何修改,你可以运行 mvn site ,然后在 target/site 目录找到一个 index.html 文件,这个文件链接了 JavaDoc 和一些关于源代码的报告。
6.Maven的特性
Maven 拥有约定,因为你遵循了约定,它已经知道你的源代码在哪里。它把字节码放到 target/classes ,然后在 target 生成一个 JAR 文件。
Maven 是声明式的。你需要做的只是创建一个 pom.xml 文件然后将源代码放到默认的目录。Maven 会帮你处理其它的事情。
Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。
Maven 以插件的形式为一些一般的项目任务提供了内置的智能。如果你想要编写运行单元测试,你需要做的只是编写测试然后放到 /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/src/test/java
添加一个对于 TestNG 或者 JUnit 的测试范围依赖,然后运行 mvn test 。如果你想要部署一个web 应用而非 JAR ,你需要做的是改变你的项目类型为 war ,然后把你文档根目录置为 /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
content-zh/src/main/webapp 。
第二章 安装和运行maven
1.当你把Maven解压到安装目录后,你需要设置两个环境变量——PATH和M2_M2_HOME。设置这两个环境变量,键入下面的命令:
C:\Users\tobrien>set M2_HOME=c:\Program Files\maven-2.0.9(maven所在目录)
C:\Users\tobrien > set PATH=%PATH%;%M2_HOME%\bin
当你开始使用Maven,它会开始下载插件到本地仓库中。
2.Maven目录结构
bin/
boot/
conf/
lib/
bin/目录包含了运行Maven的mvn脚本。 boot/ 目录包含了一个负责创建Maven运行所需要的类装载器的JAR文件,(classwords-1.1.jar)。 conf/ 目录包含了一个全局的settings.xml文件,该文件用来自定义你机器上Maven的一些行为。如果你需要自定义Maven,更通常的做法是覆写~/.m2目录下的settings.xml文件,每个用户都有对应的这个目录。lib/ 目录有了一个包含Maven核心的JAR文件(maven-2.0.9-uber.jar)。
3.用户相关配置和仓库
当你不再仅仅满足于使用Maven,还想扩展它的时候,你会注意到Maven创建了一些本地的用户相关的文件,还有在你home目录的本地仓库。在~/.m2目录下有:
~/.m2/settings.xml
该文件包含了用户相关认证,仓库和其它信息的配置,用来自定义Maven的行为。
~/.m2/repository/
该目录是你本地的仓库。当你从远程Maven仓库下载依赖的时候,Maven在你本地仓库存储了这个依赖的一个副本。
注意:
在Unix上,可以用~符号来表示你的home目录,(如~/bin表示/home/tobrien/bin)。在Windows上,我们仍然使用 ~ 来表示你的home目录。在Windows XP上,你的home目录是 C:\Documents and Settings\tobrien,在Windows Vista上,你的home目录是 C:\Users\tobrien。从现在开始,你应该能够理解这种路径表示,并翻译成你操作系统上的对应路径。
4.升级Maven
只要更新环境变量为你安装新版maven的地方即可。
Maven Help插件能让你列出活动的Maven Profile,显示一个实际POM(effective POM),打印实际settings(effective settings),或者列出Maven插件的属性。
Maven Help 插件有四个目标。前三个目标是—— active-profiles, effective-pom 和
effective-settings —— 描述一个特定的项目,它们必须在项目的目录下运行。 最后
一个目标—— describe ——相对比较复杂,展示某个插件或者插件目标的相关信息。
help:active-profiles
列出当前构建中活动的Profile(项目的,用户的,全局的)。
help:effective-pom
显示当前构建的实际POM,包含活动的Profile。
help:effective-settings
打印出项目的实际settings, 包括从全局的settings和用户级别settings继承的配置。
help:describe
描述插件的属性。它不需要在项目目录下运行。但是你必须提供你想要描述插件的 groupId 和 artifactId。
5.描述一个Maven插件
一旦你开始使用Maven,你会花很多时间去试图获得Maven插件的信息:插件如何工作?配置参数是什么?目标是什么? 你会经常使用help:describe 目标来获取这些信息。通过 plugin 参数你可以指定你想要研究哪个插件,你可以传入插件的前缀(如help 插件就是 maven-help-plugin),或者可以是 groupId:artifact[:version] ,这里 version 是可选的。比如, 下面的命令使用 help 插件的 describe 目标来输出Maven Help 插件的信息。
$ mvn help:describe -Dplugin=help
如果你想要 Help 插件输出完整的带有参数的目标列表,只要运行带有参数full 的 help:describe 目标就可以了,像这样:
$ mvn help:describe -Dplugin=help -Dfull
该选项能让你查看插件所有的目标及相关参数。但是有时候这些信息显得太多了。这时候你可以获取单个目标的信息,设置 mojo 参数和 plugin 参数。下面的命令列出了Compiler 插件的 compile 目标的所有信息
$ mvn help:describe -Dplugin=compiler -Dmojo=compile -Dfull
?在Maven里面, 一个插件目标也被认为是一个 “Mojo” 。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值