- 浏览: 793591 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (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 13980今天又回顾了一下 《Maven in Action》的读书笔记 ... -
《Maven in Action》读后感
2012-02-23 23:48 2207今天终于读完了《Maven in Action》一书,真所谓书 ... -
第十八章 Archetype
2012-02-23 23:30 50741. Archetype 是 Maven ... -
第十七章 编写Maven插件
2012-02-23 19:42 44881. 编写 Maven 插件的主要步骤 ... -
第十六章 m2eclipse
2012-02-23 15:44 23731. m2eclipse ( http: ... -
第十五章 生成项目站点
2012-02-21 09:27 22841. Maven 社区提供了大量插件,能让用户 ... -
第十四章 灵活的构建
2012-02-20 16:21 18671. 通过 <propertie ... -
第十三章 版本管理
2012-02-20 15:57 21161. 版本管理( Version Manage ... -
第十二章 使用Maven构建Web应用
2012-02-15 18:38 60371. Web 项目的 POM ... -
第十一章 使用Hudson进行持续集成
2012-02-09 17:09 23091. 持续集成就是快速 且高频率 ... -
第十章 使用Maven进行测试
2012-02-05 22:17 214001. com.google.code. ... -
第九章 使用Nexus创建私服
2011-12-06 23:17 107911. Nexus 分为开源版和企业版,开源 ... -
第八章 聚合与继承
2011-12-06 09:55 20451. 为了能用一条命令来构建一个实际 ... -
第六章 仓库
2011-12-03 18:44 24051. Maven 在一个工作站上的某个位置统一 ... -
第五章 坐标和依赖
2011-12-03 15:14 20791. Maven 定义了这样一组规则:世界上任 ... -
第四章 背景案例
2011-12-02 21:20 14171. 主要场景: 1) 用户访问注册页面 2) ... -
第三章 Maven 使用入门
2011-12-01 18:40 25451. 就像Make的Makefile, Ant的build. ... -
第二章 Maven的安装和配置
2011-12-01 10:01 62331. 设置JAVA_HOME, Path中加入%JAVA_H ... -
第一章 Maven 简介
2011-12-01 09:48 22871. 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章...
在Eclipse插件开发中,首先需要理解的是OSGi(Open Services Gateway Initiative)框架,它是Eclipse的基础架构,用于管理插件之间的依赖关系和生命周期。每个Eclipse插件都是一个独立的OSGi模块,可以导入和导出...
总结来说,软件生命周期是一个系统化的过程,旨在通过有序的阶段管理和文档化工作,确保软件产品的质量和用户满意度。虽然具体的实践可能会因项目和技术的变化而有所不同,但生命周期的基本原理仍然是软件开发过程的...
本章会涵盖创建自定义视图的步骤,包括视图生命周期管理、数据模型和UI更新策略。 4. **第13章:编辑器(Editors)** - 编辑器是Eclipse中的核心组件,用于编辑文件或资源。本章将深入讨论如何开发自定义编辑器,...
- 创建自定义编辑器,了解IEditorPart接口和编辑器的生命周期。 - 实现编辑器的数据模型,以及与模型的交互。 11. **第14章 透视图(Perspectives)**: - 理解透视图的概念,它是Workbench中的工作环境配置。 ...
第二至第四章可能会讲解Eclipse插件的生命周期管理,包括启动序列、扩展点(extension points)和扩展(extensions)。扩展点是Eclipse提供的接口,允许插件插入自己的功能;扩展则是插件对这些接口的具体实现。此外...
第9章 "Eclipse插件体系结构"探讨了Eclipse插件开发的核心概念,包括插件生命周期、依赖管理、扩展点和扩展。理解Eclipse的插件体系结构有助于开发者更好地组织代码,使其插件能与其他插件协同工作,同时掌握如何...
第九章"Eclipse插件体系结构"深入剖析了Eclipse插件的工作原理,包括插件的生命周期、依赖关系、扩展点(Extension Points)和贡献项(Extensions)等概念,这是理解Eclipse插件开发机制的核心。 第十章"开发第一个...
- **features**:在某些插件框架中,比如Eclipse,"features"是一种高级的打包和部署单位,它是一组相关的插件和配置的集合。一个feature可以包含多个插件,以及它们之间的依赖关系,使得安装和管理变得更加简单。 ...
书中详细讲解了Eclipse插件的生命周期、插件结构、插件依赖关系以及如何使用Eclipse的Plug-in Development Environment (PDE)工具进行开发。 2. **Java**: Java作为Eclipse插件开发的基础语言,开发者需要掌握...
例如,一个`IPlugin`接口可能包含`Initialize`和`Execute`方法,用于初始化插件和执行其功能。 4. **插件发现机制** 主程序需要有一种方式来发现和加载可用的插件。这通常通过扫描特定的目录或者使用配置文件来...
3. **插件生命周期**:从创建到部署,插件经历了设计、编码、测试和发布等阶段。开发者需要掌握如何在BOS平台上创建新插件项目,编写代码实现功能,以及进行单元测试和系统测试。 4. **插件设计原则**:遵循良好的...
插件的生命周期管理和错误处理也是主程序的重要职责。一旦插件加载成功,主程序可以根据需要激活或禁用它们,确保系统的正常运行。 6. **安全性与稳定性**: 由于插件可能来自不同的来源,主程序需要对它们进行...
2. **ASP.NET语法理解**:在开发插件前,开发者需熟悉ASP.NET的语法和架构,包括控件、数据绑定、页面生命周期、MVC模式等。这将帮助创建能够正确处理ASP.NET代码的插件。 3. **插件开发环境**:通常,开发者会使用...
7. **插件生命周期管理**:了解`initComponent`和`disposeComponent`方法,它们分别在插件启动和关闭时调用,用于初始化和释放资源。 8. **版本控制与持续集成**:推荐使用Git进行版本控制,并结合Jenkins、Travis ...
8. **性能优化**:为了保证整体性能,框架需要有效地管理插件的生命周期,如延迟加载、按需加载和缓存策略。此外,优化插件间的通信方式(如使用本地消息队列)也是必要的。 9. **测试与调试**:良好的插件框架应...
C#插件框架通常采用依赖注入(Dependency Injection,DI)来管理插件的生命周期和依赖关系。这使得主程序能够控制插件的实例化,同时也方便了对插件的服务共享。 4. **服务层(Addin.Services)**: "Addin....
每个插件都有自己的生命周期、依赖关系,并通过API与其他插件通信。核心插件提供基础功能,如编辑器、运行时环境等,而第三方插件则可以扩展这些功能,如支持其他编程语言、版本控制工具等。 二、开发环境搭建 要...
插件的生命周期包括加载、初始化、运行和卸载。主程序需要能够正确地管理这些阶段,确保插件的安全启动和关闭,防止资源泄漏或状态冲突。 7. **安全性与隔离**: 由于插件可能来自第三方开发者,安全性是个重要...