Maven技术书之《Maven实战》阅读整理

Maven是一个实用且优秀的构建工具,我之于Maven只能算入门,通过阅读许晓斌的《Maven实战》让我对Maven有了整理的认识以及更深入的了解。

本文是阅读笔记,包括列出了重要的资源链接。本文没有太多的实际内容,只是很宽泛的记录了关于Maven的知识库。

-------------------------------------------------------------------------
以下是我本人的书评
书是前几年就买了的,但是跟很多人一样,对于maven的学习,可能都是直接网上查下,怎么download,然后下载eclipse插件m2e,快速上手。对于Maven并没有形成系统的知识库。本书的内容涵盖入门篇、进阶篇以及高级篇,比如hello world的例子、maven插件编写、archetype编写等等。总之很全面。同时也介绍了很多maven的优秀插件。

特超所值的一本书,比起在网上搜集maven入门的资料(博客),倒不如花一天时间看《Maven实战》来学习Maven这个Java世界中的实用工具!

-------------------------------------------------------------------------

Apache Maven主页: [url]https://maven.apache.org[/url]

[color=darkblue][b]书目录列表:[/b][/color]
1. Maven简介
2. Maven的安装和配置
3. Maven使用入门
4. 背景案例
5. 坐标和依赖(Coordinate and Dependency)
6. 仓库(Repository)
7. 生命周期和插件(lifecycle and plugin)
8. 聚合与继承(aggregate and inherit)
9. 使用Nexus创建私服
10. 使用Maven进行测试
11. 使用Hudson进行持续集成
12. 使用Maven构建Web应用
13. 版本管理
14. 灵活的构建
15. 生成项目站点(site生命周期介绍)
16. m2eclipse(eclipse的插件)
17. 编写Maven插件
18. Archetype
-------------------------------------------------------------------------


1-4章为基本知识,以及利用“Hello world”入门(结合IDE)。

[b]POM.xml[/b],(POM:project Object Model)
[b]settings.xml[/b]:用户目录下的:~/.m2/settings.xml

-------------------------------------------------------------------------
5-8章算是进阶章,介绍了重要的概念:坐标、依赖、仓库、生命周期、插件、聚合及继承。

[b]构成唯一坐标的元素[/b]: groupId、artifactId、version、packaging、classifier

第5章: 依赖相关:
dependencies: dependency: groupId, artifactId, version, type, scope, optional, exclusions.
其中:
[b]scope[/b]配置了目标依赖jar与项目classpath的关系。见下表:
[table]
|Scope|compiler|test|runtime|example|
|compiler|Y|Y|Y||
|test|--|Y|--|JUnit|
|provided|Y|Y|--|servlet-api|
|runtime|--|Y|Y|JDBC related jars|
|system|Y|Y|--|需要指定属性systemPath|
[/table]

[b]optional[/b]: if true,依赖不会被传递,只会对当前项目有效。默认false。
[b]exclusions[/b]: 排除特定的依赖。

附加一个properties: 定义全局变量

[b]Useful mvn command: [/b]
> mvn dependency: list
> mvn dependency: tree
> mvn dependency: analyze

第6章: 仓库相关:
配置repositories: id, name, url, releases, snapshots
部置至远程仓库方法
介绍了镜像mirrors: id, name, url, mirrorOf

[color=orange][b]【重要】仓库搜索服务:[/b][/color]
1. Sonatype Nexus: [url]http://repository.sonatype.org[/url]
[img]http://dl.iteye.com/upload/picture/pic/136647/ef71c5f5-c412-38a8-a7b6-8841672ac0d1.png[/img]

2. Jarvana: [url]http://www.jarvana.com/jarvana[/url]
3. MVNbrower: [url]http://www.mvnbroser.com[/url]
4. MVNrepository: [url]http://mvnrepository.com[/url]
[img]http://dl.iteye.com/upload/picture/pic/136649/b5a8b6d9-501c-3126-a3d0-1f76b4b47061.png[/img]

第7章: 生命周期和插件
独立的生命周期: clean、default(核心)、site

每个生命周期过都包含了好多个[b]阶段(phase)[/b]
具体戳: [url]http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html[/url]

Maven的核心仅仅定义了[b]抽象[/b]的生命周期,具体的任务是交由插件完成的,插件以独立的构件形式存在。

plugin: 插件绑定、自定义绑定等。
在线插件信息: [url]http://maven.apache.org/plugins/index.html[/url]

插件仓库

第8章: 聚合和继承
packaging = pom

[b]聚合[/b]的核心配置: modules

[b]继承:[/b]
parent: groupId, artifactId, version, [b]relativePath[/b]
可继承的POM元素列表(几十个): groupId, version, dependencies... 等。

在父pom中使用dependencyManagement声明依赖的版本(version),起到统一管理version的作用,从而降低依赖冲突。

scope = import,导入目标pom并合并到当前dependencyManagement中。

插件管理元素: pluginManagement

[list]
[*]聚合: 目的是为了方便快速构建项目。
[*]继承: 目的是为了消除重复配置。
[/list]

[b]Maven的核心设计理念: 约定优于配置(conversion over configuration)。[/b]

[b]反应堆[/b](reactor): 指所有模块组成的一个构建结构。
构建顺序: [b]模块间的依赖关系是有向非循环的。[/b]

操作反应堆的命令行: -am, -amd -also-make-dependents, -pl, --projects , -rf -resume-from

-------------------------------------------------------------------------

第9章是关于创建私服的,当前市场上主要有三种管理私服的工具:
[list]
[*] Apache - Archiva
[*] JFrog - Artifactory
[*] Sonatype - Nexus
[/list]
Nexus ['neksəs],是连接的意思。下载页面: [url]http://nexus.sonatype.org/downloads/[/url]

安装方式(Nexus是java web app):
[list]
[*] Bundle方式安装Nexus
[*] WAR方式安装Nexus
[/list]
Login: admin/admin123

Type:
[list]
[*] Hosted Repository(宿主仓库): Id, Name
[*] Proxy Repository(代理仓库): Remote Storage Location
[*] Repository Group(仓库组)
[/list]
提供搜索Maven中央库的功能。

配置Maven: setting.xml: 定义, 激活
创建一个匹配任何仓库的镜像: 使Maven下所有的下载都通过Nexus:mirrorOf = *

部置构件至Nexus: Artifact upload功能。

权限管理: admin, deployment, anonymous

更高级的内容:
[list]
[*] 为项目分配独立的仓库
[*] 调度任务
[/list]

-------------------------------------------------------------------------

第10章后,我称之为高级篇~ 作者写的满满的都是干货。

[b]10. 使用Maven进行测试[/b]
[b]本章主要围绕以下插件(plugin)讲解: [/b]
[list]
[*]maven-surefire-plugin(内置插件)
[*]cobertura-maven-plugin(测试覆盖率插件)
[*]maven-jar-plugin(将test代码打包)
[/list]

Maven的重要职责之一就是自动运行单元测试,它通过maven-surefire-plugin与主流的单元测试框架JUnit3、JUnit4以及TestNG集成。(两大主流的单元测试框架: JUnit [url]http://www.junit.org/[/url]和TestNG(Test Next Generation) [url]http://testng.org/[/url])

介绍测试运行器(Test Runner): [b]maven-surefire-plugin[/b]。
surefire: sure-fire,拆开来看就很好理解,是一定会发生,一定会成功的意思。

内置绑定: 生命周期阶段需要绑定到某个插件的目标才能完成真正的工作,test阶段(phase)正是与maven-surefile-plugin的test目标相绑定了。

目标类: src/test/java/下的: Test*.java, *Test.java, *TestCase.java

跳过测试:
>mvn package -DskipTests : 跳过运行测试代码
>mvm package -Dmaven.test.skip = true : 此参数同时控制了maven-compire-plugin和maven-surefire-plugin两个插件的行为,可以同时跳过测试代码的编译和运行。

同时,maven-compire-plugin能动态指定要运行的测试用例(使用command)和包含、排除测试用例(config pom)。

测试报告: 文本格式和XML格式(JUnit)。
测试覆盖率报告: 测试覆盖率是衡量项目代码质量的一个重要的参考指标。[b]Cobertuna[/b]是一个优秀的开源测试覆盖率统计工具([url]http://cobertura.sourceforge.net/[/url]),maven通过插件cobertura-maven-plugin与之集成。

介绍与[b]TestNG[/b]的集成: TestNG较JUnit的一大优势在于它支持测试组的概念。

重用测试代码: 优秀的程序员会像对待产品代码一样细心维护测试代码。在命令行运行mvn package的时候,maven会将项目的主代码及资源文件打包,默认的打包行为是不会包含测试代码的。
配置插件maven-jar-plugin将两个目标(goal)即jar和test-jar绑定。


[b]11. 使用Hudson进行持续集成[/b]

Subversion是是当前最流行的版本控制工具(其它的还有CVS, Git, Mercurial等),而当前优秀的持续集成工具有很多,如开源的Husson、CruiseControl,商业的Bamboo、Teamcity等。目前最流行的开源持续集成工具正是Hudson。

持续集成流程如下图所示:
[img]http://dl.iteye.com/upload/picture/pic/136659/c8451260-8eaa-356c-8786-8b393e30660d.png[/img]

介绍[b]Hudson[/b]
官网: [url]http://hudson-ci.org/[/url],下载hudson.war,具体使用Hudson不作展开。


[b]12. 使用Maven构建Web应用[/b]

以上章节讨论的打包方式为JAR,本章开始介绍使用Maven打包WAR。即: [b]packaging = war[/b]。

需要熟悉Maven构建出来的Web目录。

POM元素finalName: 用来标识项目生成的主构件的名称。

相关插件介绍:
使用[b]jetty-maven-plugin[/b]进行测试: 配置该插件后,并运行(mvn jetty:run),jetty-maven-plugin会启动Jetty,并且默认监听本地的8080端口,并将当前项目部署到容器中,同时它还会根据用户配置扫描代码改动。

使用Cargo实现自动化部署: Cargo是一组帮助用户操作Web容器的工具,它能够帮助用户实现自动化部署,通过插件[b]cargo-maven2-plugin[/b]提供与Maven的集成,Maven用户可以使用该插件将Web项目部署到Web容器中。同时,Cargo也可以部署应用至远程正在运行的Web容器中。

13. 版本管理
[list]
[*]版本管理(Version Management): 项目整体版本的演变过程管理,如1.0-SNAPSHOT到1.0,再到1.1-SNAPSHOT。
[*]版本控制(Version Control): 是指借助版本控制工具(如Subversion)追踪代码的每一个变更。
[/list]
关于版本控制的标签(Tag),使用标签就可以明确地将某个源码版本(也就是项目状态)从主干中标记出来,放到单独的位置。

自动化版本发布,Maven插件[b]maven-release-plugin[/b]的介绍。

用来帮助提高安全性的技术——GPG(GnuPG)的介绍,及介绍插件[b]maven-gpg-plugin[/b]。

[b]14. 灵活的构建[/b]
本章的标题的名字起的太宽泛,主要是讲项目构建过程中常常需要面对的问题就是不同的平台环境差异,这可能是操作系统的差异、开发平台和测试平台的差异、不同客户之间的差异等。这了应对这些差异,Maven提供了属性(properties)、资源过滤(resource filter)以及profile三大特性。Maven用户可以在POM和资源文件中使用Maven属性表示那些可能变化的量,通过不同profile中的属性值和资源过滤特性为不同环境执行不同的构建。

[b]Maven属性[/b]
Maven的属性,通过properties元素定义,属性分类(6类): 内置属性、POM属性、自定义属性、Setting属性、Java系统属性、环境变量属性。其中内置属性主要有${basedir} 表示项目根目录(pom.xml所在目录),${version} 表示项目版本。

[b]资源过滤[/b]
插件[b]maven-resource-plugin[/b]: 处理资源文件。
插件[b]maven-war-plugin[/b]: 处理web项目中的web资源文件(如src/main/webapp/*.css)。

[b]profile[/b]
根据具体的需要,可以在以下位置声明profile:
pom.xml, 用户settings.xml, 全局settings.xml, profiles.xml

介绍了激活profile的方法。

[b]15. 生成项目站点[/b]

Maven3中使用插件[b]maven-site-plugin[/b]生成站点,配置plugin的信息(groupId, artifactId等)后,在项目上运行mvn site就能直接生成一个最简单的站点。(由于site生命周期中的site阶段(phase)绑定到了maven-site-plugin的site目标(goal)上)。

复习: [b]site生命周期[/b](maven三大生命周期之一,第7章介绍),有四个阶段,分别是pre-site, site, post-site, site-deploy。

关于项目信息如(关于、持续集成、依赖、依赖管理等)在Maven3中是由插件[b]maven-project-info-reports-plugin[/b]生成。

项目报告插件介绍: 配置在project--reporting--plugins元素下面,

[list]
[*]插件[b]maven-javadoc-plugin[/b],使用JDK的javadoc工具生成javaDoc文档。
[*]插件[b]maven-jxr-plugin[/b]会以Web页面的形式将Java源代码展现出来。
[*]插件[b]maven-checksyle-plugin[/b],使用CheckStyle工具来帮助Java开发人员遵循编码规[*]范,能根据一套规则自动检查Java代码,使得团队能够方便地定义自己的编码规范。
[*]插件[b]maven-pmd-plugin[/b],使用PMD工具分析Java源代码,寻找代码中的问题,包括潜在的bug、可优化代码、重复代码以及过于复杂的表达式。
[*]插件[b]maven-changelog-plugin[/b]能够基于版本控制系统中就近的变更记录生成三份变更报告。
[*]插件[b]cobertura-maven-plugin[/b]生成测试覆盖率报告(前面介绍过)。
[/list]
自定义站点外观。
国际化。

部署站点至服务器上: 为了方便团队和用户得到必要的项目信息。使用mvn clean site-deploy命令,[b]site-deploy[/b]目标的工作就是部署maven站点。


16. m2eclipse
官方站点: [url]http://m2eclipse.sonatype.org/[/url]

执行maven command: console--> maven console。
通过eclipse浏览本地及远程仓库的内容,打开view: [b]Maven Repositories[/b]。

[b]添加依赖: 右击pom.xml,选择Maven -- Add Dependency,添加依赖。另一种方法是: m2eclipse的POM编辑器,打开pom.xml文件,有Dependencies的Tab,可以用来添加、删除、编辑依赖。[/b]

[b]POM编辑器Tab之Dependency Hierarchy[/b]可以显示依赖层次。
[b]POM编辑器Tab之Effective POM[/b],可以查看项目的完整的POM信息(只读)。

下载依赖源码: 右击pom.xml -- Maven -- Download Source,为当前项目的依赖下载源码包。


[b]17. 编写Maven插件[/b]
[b]复习: [color=blue]Maven的任何行为都是由插件完成的,包括项目的清理、编译、测试以及打包等操作都有其对应的Maven的插件。每个插件拥有一个或者多个目标,用户可以直接从命令行运行这些插件目标,或者选择将目标绑定到Maven的生命周期。[/color][/b]

插件下载: Apache, Codehaus, Googlecode, Sourceforge, Github。一般情况下不需要自己手动编写Maven插件,除非有特殊的需求。

本章介绍了编写Maven插件的步骤及案例。


18. Archetype
Archetype的意思是: 原型。在Maven里,可以使用Maven Archetype快速生成项目骨架,Archetype可以理解成[b]Maven项目的模版[/b]。

通过插件[b]maven-archetype-plugin[/b]来完成以上生成项目骨架的需求。
> mvn archetype: generate, 需要输入: groupId, artifactId, version, package。

常用的archetype:
[list]
[*][b]maven-archetype-quickstart[/b]: 最常用的Archetype。
[*][b]maven-archetype-webapp[/b]: 生成最简单的Maven war项目模版。
[/list]

高级: 编写一个Archetype。

你可能感兴趣的:(【总结】)