- 浏览: 769374 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (651)
- Java (39)
- Java 初学者小问题 (66)
- 设计模式 (7)
- 项目管理 (3)
- 数据库 (1)
- 算法 (2)
- Java practices (6)
- Effective Java2读书笔记 (78)
- Linux (2)
- programming ruby 读书笔记 (5)
- Core Java Ninth Edition Volume I 读书笔记 (15)
- Pro Git 读书笔记 (12)
- Git (3)
- Maven in Action 读书笔记 (20)
- Web (12)
- 非技术类书籍 (11)
- 电影 (40)
- Web Cache (1)
- jquery (0)
- 历史 (4)
- Dive Into HTML5 读书笔记 (13)
- 三国演义小学毕业考 (79)
- 高效能人士的7个习惯 读书笔记 (12)
- Java Performance 读书笔记 (3)
- Protocol Buffer 学习笔记 (6)
- Mongo DB 学习笔记 (7)
- Morphia 学习笔记 (7)
- Algorithms -- Princeton 学习笔记 (13)
- String研究 (10)
- Hadoop: The Definitive Guide 读书笔记 (3)
- Java与模式读书笔记 (5)
- Date研究 (3)
- The Roman Empire 听课笔记 (4)
- Algorithms -- Standford 学习笔记 (16)
- Core Java Ninth Edition Volume II 读书笔记 (9)
- Thinking in Java 4th Edition 读书笔记 (21)
- Node : Up and Running 学习笔记 (5)
- Eloquent Javascript (8)
- Smashing Node.js 读书笔记 (1)
- Algorithms II -- Standford 学习笔记 (19)
- Algorithm II -- Princeton 学习笔记 (14)
- 网络安全 (2)
- Javascript (4)
- 正则表达式 (1)
- JAVA 7/8 (15)
- JVM (10)
- NodeJS (1)
- 鸟哥的linux私房菜读书笔记 (14)
- Web Service (1)
- The art of programming (9)
- Introduction to Algorithm 读书笔记 (4)
- Java 源码阅读 (0)
- Spring in Action 读书笔记 (2)
- Java Network Programming 读书笔记 (2)
最新评论
-
心存高远:
谢谢作者分享,刚好看到这里不太明白,现在茅塞顿开。不过runt ...
关于 Maven的传递依赖的理解 -
sxlkk:
851228082 写道甚至在某次技术会议现场遇到《Maven ...
关于 Maven的传递依赖的理解 -
851228082:
851228082 写道a----compile----b-- ...
第五章 坐标和依赖 -
851228082:
a----compile----b-----provided- ...
第五章 坐标和依赖 -
851228082:
甚至在某次技术会议现场遇到《Maven in action》的 ...
关于 Maven的传递依赖的理解
1. Maven 的生命周期就是为了对所有的构建过程进行抽象和统一。这个生命周期包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建步骤。 Maven 的生命周期是抽象的,不做任何实际工作,实际任务都交由插件完成。(这种思想与 template method 非常类似)每个构建步骤可以绑定一个或者多个插件行为。 Maven 为大多数构建步骤编写并绑定了默认插件,如: maven-compiler-plugin 和 maven-surefire-plugin 。
2. M aven 拥有三套相互独立的生命周期,它们分别是: clean 、 default 和 site 。每个生命周期包含一些阶段 (phase) ,这些阶段是有顺序的,而且后面的阶段依赖于前面的阶段。用户和 Maven 最直接的交互方式是调用这些生命周期的阶段。在调用某一阶段时,该阶段所在的生命周期之前的阶段会首先被执行。但不同周期间的阶段是相互独立的。
3. clean 生命周期的目的是清理项目,它包含三个阶段: pre-clean , clean , post-clean 。
4. default 生命周期定义了真正构建时所需要执行的所有步骤,包含如下阶段 : validate , initialize , generate-soruces , process-sources , generate-resources , process-resources , compile , process-classes , generate-test-sources , process-test-sources , generate-test-resources , process-test-resources , test-compile , process-test-classes , test , prepare-package , package , pre-integration-test , integration-test , post-integration-test , verify , install , deploy 。
5. site 生命周期的目的是建立和发布站点,它包含四个阶段: pre-site , site , post-site , site-deploy 。
6. 关于生命周期的详细介绍,可以参考:
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
7. 从命令行执行 Maven 任务的最主要方式就是调用 Maven 的生命周期阶段。如 mvn clean deploy site-deploy 调用了 clean 生命周期的 clean 阶段(自动触发 clean 之前的依赖: pre-clean )、 default 生命周期的 deploy 阶段(自动触发 deploy 之前的依赖)以及 site 生命周期的 site-deploy 阶段(自动触发 site-deploy 之前的依赖: pre-site , site , post-site )。
8. 插件以独立的构件形式存在, Maven 会在需要的时候下载并使用插件。
9. 一个插件可以完成多个任务(功能),每个功能就是一个插件目标( plugin goal )。如 dependency:analyze 表示插件 maven-dependency-plugin 的 analyze 目标。
10. M aven 生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务。 Maven 的核心为一些主要的生命周期阶段默认绑定了很多插件目标,可以参考 :
查看具体的绑定关系。由于项目的打包类型会影响构建的具体过程,因此 default 生命周期的阶段与插件目标的绑定关系由项目打包类型决定。
11. 在 POM 中自定义生命周期阶段与插件目标的绑定关系:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.1.1</version> <executions> <execution> <id>attach-sources</id> <phase>verify</phase> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
可以将 mven-source-plugin 中的 jar-no-fork 目标(将项目的主代码打包成 jar 文件)绑定到 verify 这个 phase 。
12. 很多插件的目标在编写时已经定义了默认绑定阶段。可以用以下命令查看:
Mvn help:describe –Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 –Ddetail 。
13. 如果多个目标被绑定到同一个阶段,它们的执行顺序由插件声明的先后顺序决定。
默认绑定与自定义绑定的执行顺序是?
14. 可以在命令行执行 maven 命令时提供 plugin 的参数配置:
Mvn install –Dmaven.test.skip=true
maven.test.skip 是 maven-surefire-plugin 的一个参数,当其值为 true 时,就会跳过执行测试。
15. 可以在 POM 的插件配置中对插件进行一个全局的参数配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.1</version> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build>
该配置告诉 maven-compiler-plugin 要编译的源文件是 Java 1.5 的,并且生成与 JVM 1.5 兼容的字节代码文件。由于 maven-compiler-plugin 被绑定到 compile 与 test-compile 阶段,所以上述配置对这两个阶段都会生效。
16. 我们还可以为某个插件目标及其绑定的某个阶段配置特定的参数:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.3</version> <executions> <execution> <id>ant-validate</id> <phase>validate</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <echo>I’m bound to validate phase.</echo> </tasks> </configuration> </execution> <execution> <id>ant-verify</id> <phase>verify</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <echo>I’m bound to verify phase.</echo> </tasks> </configuration> </execution> </executions> </plugin>
以上配置将 maven-antrun-plugin:run 绑定到了 validate 与 verify 两个 phase ,但为两个 phase 设置了不同的参数。
17. 基本上所有的插件都来自于 Apache 和 Codehaus 。
插件来源 |
插件列表 |
下载地址 |
Apache |
||
Codehaus |
18. 可以从插件目标的文档中查阅参数的 Expression 属性,它表示了该参数在命令行中的参数名,如果没有 Expression 则说明该插件目标参数只能在 POM 中配置。如:
Maven-surefire-plugin 的 skip 参数, Expression 为 :${maven.test.skip} 则在命令行中配置该参数时参数名就为 -Dmaven.test.skip 。而在 POM 中配置时,参数名为 skip 。
19. 我们既可以通过 mvn 命令激活某个生命周期阶段,也可以直接调用某个插件目标,因为有些任务不适合绑定到生命周期阶段上,如: maven-help-plugin:describe , maven-dependency-plugin:tree 。 为了简化插件目标的定位, Maven 引入了插件前缀( Plugin Prefix ),可以用插件前缀替换插件坐标,方便在命令行直接运行插件。如:
Mvn help:describe –Dplugin=compiler –Dgoal=compile -Ddetail
20. Maven 会区别对待依赖的远程仓库和插件的远程仓库。可以在 POM 中配置插件的远程仓库。 Maven 内置的插件仓库配置:
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Maven Plugin Repository</name>
<url>http://repo1.maven.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshosts>
<releases>
<updatePolicy>never</updatePolicy
>
</releases>
</pluginRepository>
</pluginRepositories>
一般来说,中央仓库所包含的插件完全能够满足我们的需要。
21. 配置插件时可以不配置其 groupId , Maven 会默认用 org.apache.maven.plugins 。
22. Maven 在超级 POM 中为所有核心插件定义了版本。如果用户使用某个插件而没定义版本时,会使用超级 POM 中定义的版本,如果这个插件不属于核心插件, Maven 2 会解析成 lastest 而 Maven 3 会解析成 release 。
23. 插件前缀会保存在 groupId/maven-metadata.xml 中。 Maven 在解析插件仓库元数据时,会默认使用 org.apahce.maven.plugins 和 org.codehaus.mojo 两个 groupId ,用户可以配置 settings.xml 让 Maven 检查其他 groupId 上的插件仓库元数据:
<settings> <pluginGroups> <pluginGroup>com.your.plugins</pluginGroup> </pluginGroups> </settings>
元数据信息如下:
<metadata> <plugins> <plugin> <name>Maven Clean Plugin</name> <prefix>clean</prefix> <artifactId>maven-clean-plugin</artifactId> </plugin> … </plugins> </metadata>
发表评论
-
关于 Maven的传递依赖的理解
2012-09-30 09:50 13919今天又回顾了一下 《Maven in Action》的读书笔记 ... -
《Maven in Action》读后感
2012-02-23 23:48 2171今天终于读完了《Maven in Action》一书,真所谓书 ... -
第十八章 Archetype
2012-02-23 23:30 50301. Archetype 是 Maven ... -
第十七章 编写Maven插件
2012-02-23 19:42 44551. 编写 Maven 插件的主要步骤 ... -
第十六章 m2eclipse
2012-02-23 15:44 23311. m2eclipse ( http: ... -
第十五章 生成项目站点
2012-02-21 09:27 22411. Maven 社区提供了大量插件,能让用户 ... -
第十四章 灵活的构建
2012-02-20 16:21 18301. 通过 <propertie ... -
第十三章 版本管理
2012-02-20 15:57 20621. 版本管理( Version Manage ... -
第十二章 使用Maven构建Web应用
2012-02-15 18:38 60021. Web 项目的 POM ... -
第十一章 使用Hudson进行持续集成
2012-02-09 17:09 22491. 持续集成就是快速 且高频率 ... -
第十章 使用Maven进行测试
2012-02-05 22:17 213021. com.google.code. ... -
第九章 使用Nexus创建私服
2011-12-06 23:17 107501. Nexus 分为开源版和企业版,开源 ... -
第八章 聚合与继承
2011-12-06 09:55 20111. 为了能用一条命令来构建一个实际 ... -
第六章 仓库
2011-12-03 18:44 23551. Maven 在一个工作站上的某个位置统一 ... -
第五章 坐标和依赖
2011-12-03 15:14 20191. Maven 定义了这样一组规则:世界上任 ... -
第四章 背景案例
2011-12-02 21:20 13891. 主要场景: 1) 用户访问注册页面 2) ... -
第三章 Maven 使用入门
2011-12-01 18:40 25141. 就像Make的Makefile, Ant的build. ... -
第二章 Maven的安装和配置
2011-12-01 10:01 61841. 设置JAVA_HOME, Path中加入%JAVA_H ... -
第一章 Maven 简介
2011-12-01 09:48 22381. Maven 是优秀的构建工 ...
相关推荐
背景案例第5章 坐标和依赖第6章 仓库第7章 生命周期和插件第8章 聚合与继承第9章 使用nexus创建私服第10章 使用maven进行测试第11章 使用hudson进行持续集成第12章 使用maven构建web应用第13章 版本管理第...
第7章:生命周期和插件/7.4 插件绑定/7.4.2 自定义生命周期和插件的绑定 第7章:生命周期和插件/7.5 插件配置/7.5.1 命令行插件参数设置 第7章:生命周期和插件/7.5 插件配置/7.5.2 POM文件中进行插件参数设置 第7章...
第 2 章: 主要介绍 MyBatis 的基础模块及其生命周期, 并给出实例。 第 3 章: 主要介绍 MyBatis 配置的主要含义和内容。 第 4 章: 介绍 MyBatis 映射器的主要元素及其使用方法。 第 5 章: 介绍动态 SQL, 助你...
第1章Android基础入门 1.1在Eclipse中安装AndroidSDK和ADT 1.1.1下栽和安装JDK 1.1.2下栽和安装EclipseIDE ...第7章“手机终端”——手机自动服务和语音控制 第8章“Let'srace”——网络通信与地图服务
如果插件和宿主共享依赖库,那边编译插件的时候不可将共享库编译到插件当中,包括共享库的代码以及R文件,但是需要在编译时添加到classpath中,且插件中如果要使用共享依赖库中的资源,需要使用共享库的R文件来进行...
可以根据Activity或者fragment的生命周期对其生命周期方法位置进行先后排序,快捷键Ctrl + alt + K 7.CodeGlance 在右边可以预览代码,实现快速定位 8.findBugs-IDEA 查找bug的插件,Android Studio也提供了...
第7章 常用控件 7.1 Button(按钮) 7.2 ImageButton(图片按钮) 7.3 ToggleButton(开关按钮) 7.4 TextView(文本视图) 7.5 ImageView(图片视图) 7.6 EditText(编辑框) 7.7 RadioButton(单选按钮) 7.8 ...
第七章 核心引擎:持久化和事务 60 7.1 运行时状态 60 7.1.1 二进制持久化 60 7.1.2 Safe Pionts 60 7.1.3 配置持久化 61 7.1.4 事务 64 7.2 流程定义 64 7.3 历史日志 64 7.3.1 将流程事件存储到数据库 65 第八章 ...
第七章 核心引擎:持久化和事务 54 7.1 运行时状态 54 7.1.1 二进制持久化 54 7.1.2 Safe Pionts 54 7.1.3 配置持久化 55 7.1.4 事务 58 7.2 流程定义 58 7.3 历史日志 59 7.3.1 将流程事件存储到数据库 59 第八章 ...
第七章 核心引擎:持久化和事务 54 7.1 运行时状态 54 7.1.1 二进制持久化 54 7.1.2 Safe Pionts 54 7.1.3 配置持久化 55 7.1.4 事务 58 7.2 流程定义 58 7.3 历史日志 59 7.3.1 将流程事件存储到数据库 59 第八章 ...
3.4 Android活动的生命周期 14 3.4.1 活动的生命状态 14 3.4.2 活动的运作流程 16 第4章 手机短信软件设计实现 18 4.1 系统设计需求 18 4.1.1 需求分析 18 4.1.2 下载开发资源 18 4.1.3 更新Ec1ipse并下载ADT...
第七节:vue循环语句v-for 第八节:vue计算属性 第九节:vue监视属性 第十节:vue样式属性Class与Style绑定 第十一节:vue事件处理器 第十二节:vue表单处理 第十三节:vue生命周期 第十四节:vue-cli脚手架安装 第...
第七节:vue循环语句v-for 第八节:vue计算属性 第九节:vue监视属性 第十节:vue样式属性Class与Style绑定 第十一节:vue事件处理器 第十二节:vue表单处理 第十三节:vue生命周期 第十四节:vue-cli脚手架安装 第...
3.4 Android活动的生命周期 14 3.4.1 活动的生命状态 14 3.4.2 活动的运作流程 16 第4章 手机短信软件设计实现 18 4.1 系统设计需求 18 4.1.1 需求分析 18 4.1.2 下载开发资源 18 4.1.3 更新Ec1ipse并下载ADT...
第7章 01 ip地址与子网划分 02 ip地址配置 03 虚拟机网络模式 04 三层隔离验证试验 第8章 01 上节课复习 02 软件包介绍 03 rpm软件包管理 04 yum软件包管理 05 源码安装python3.5 06 ssh服务 07 apache服务 08 ...