第1章 Maven简介 1
1.1 何为Maven 2
1.1.1 何为构建 2
1.1.2 Maven是优秀的构建工具 2
1.1.3 Maven不仅仅是构建工具 3
1.2 为什么需要Maven 4
1.2.1 组装PC和品牌PC 4
1.2.2 IDE不是万能的 4
1.2.3 Make 5
1.2.4 Ant 5
1.2.5 不重复发明轮子 6
1.3 Maven与极限编程 7
1.4 被误解的Maven 8
1.5 小结 9
第2章 Maven的安装和配置 10
2.1 在Windows上安装Maven 11
2.1.1 检查JDK安装 11
2.1.2 下载Maven 11
2.1.3 本地安装 12
2.1.4 升级Maven 13
2.2 在基于UNIX的系统上安装Maven 13
2.2.1 下载和安装 13
2.2.2 升级Maven 15
2.3 安装目录分析 15
2.3.1 M2_HOME 15
2.3.2 ~/.m2 16
2.4 设置HTTP代理 17
2.5 安装m2eclipse 18
2.6 安装NetBeans Maven插件 22
2.7 Maven安装最佳实践 24
2.7.1 设置MAVEN_OPTS环境变量 24
2.7.2 配置用户范围settings.xml 24
2.7.3 不要使用IDE内嵌的Maven 25
2.8 小结 26
第3章 Maven使用入门 27
3.1 编写POM 28
3.2 编写主代码 29
3.3 编写测试代码 30
3.4 打包和运行 34
3.5 使用Archetype生成项目骨架 36
3.6 m2eclipse简单使用 37
3.6.1 导入Maven项目 37
3.6.2 创建Maven项目 39
3.6.3 运行mvn命令 39
3.7 NetBeans Maven插件简单使用 41
3.7.1 打开Maven项目 41
3.7.2 创建Maven项目 42
3.7.3 运行mvn命令 43
3.8 小结 44
第4章 背景案例 45
4.1 简单的账户注册服务 46
4.2 需求阐述 46
4.2.1 需求用例 46
4.2.2 界面原型 48
4.3 简要设计 49
4.3.1 接口 49
4.3.2 模块结构 49
4.4 小结 50
第5章 坐标和依赖 51
5.1 何为Maven坐标 52
5.2 坐标详解 53
5.3 account-email 54
5.3.1 account-email的POM 54
5.3.2 account-email的主代码 56
5.3.3 account-email的测试代码 60
5.3.4 构建account-email 62
5.4 依赖的配置 62
5.5 依赖范围 63
5.6 传递性依赖 64
5.6.1 何为传递性依赖 64
5.6.2 传递性依赖和依赖范围 65
5.7 依赖调解 66
5.8 可选依赖 66
5.9 最佳实践 68
5.9.1 排除依赖 68
5.9.2 归类依赖 69
5.9.3 优化依赖 71
5.10 小结 74
第6章 仓库 75
6.1 何为Maven仓库 76
6.2 仓库的布局 76
6.3 仓库的分类 78
6.3.1 本地仓库 79
6.3.2 远程仓库 80
6.3.3 中央仓库 80
6.3.4 私服 81
6.4 远程仓库的配置 82
6.4.1 远程仓库的认证 83
6.4.2 部署至远程仓库 84
6.5 快照版本 85
6.6 从仓库解析依赖的机制 87
6.7 镜像 89
6.8 仓库搜索服务 90
6.8.1 Sonatype Nexus 90
6.8.2 Jarvana 91
6.8.3 MVNbrowser 91
6.8.4 MVNrepository 92
6.8.5 选择合适的仓库搜索服务 93
6.9 小结 93
第7章 生命周期和插件 94
7.1 何为生命周期 95
7.2 生命周期详解 96
7.2.1 三套生命周期 97
7.2.2 clean生命周期 97
7.2.3 default生命周期 97
7.2.4 site生命周期 98
7.2.5 命令行与生命周期 98
7.3 插件目标 99
7.4 插件绑定 99
7.4.1 内置绑定 100
7.4.2 自定义绑定 102
7.5 插件配置 104
7.5.1 命令行插件配置 104
7.5.2 POM中插件全局配置 104
7.5.3 POM中插件任务配置 105
7.6 获取插件信息 106
7.6.1 在线插件信息 106
7.6.2 使用maven-help-plugin描述插件 108
7.7 从命令行调用插件 109
7.8 插件解析机制 110
7.8.1 插件仓库 110
7.8.2 插件的默认groupId 111
7.8.3 解析插件版本 111
7.8.4 解析插件前缀 112
7.9 小结 114
第8章 聚合与继承 115
8.1 account-persist 116
8.1.1 account-persist的POM 116
8.1.2 account-persist的主代码 118
8.1.3 account-persist的测试代码 123
8.2 聚合 124
8.3 继承 127
8.3.1 account-parent 127
8.3.2 可继承的POM元素 130
8.3.3 依赖管理 131
8.3.4 插件管理 135
8.4 聚合与继承的关系 137
8.5 约定优于配置 139
8.6 反应堆 143
8.6.1 反应堆的构建顺序 144
8.6.2 裁剪反应堆 145
8.7 小结 147
第9章 使用Nexus创建私服 148
9.1 Nexus简介 149
9.2 安装Nexus 149
9.2.1 下载Nexus 149
9.2.2 Bundle方式安装Nexus 150
9.2.3 WAR方式安装Nexus 151
9.2.4 登录Nexus 152
9.3 Nexus的仓库与仓库组 152
9.3.1 Nexus内置的仓库 152
9.3.2 Nexus仓库分类的概念 154
9.3.3 创建Nexus宿主仓库 154
9.3.4 创建Nexus代理仓库 155
9.3.5 创建Nexus仓库组 156
9.4 Nexus的索引与构件搜索 157
9.5 配置Maven从Nexus下载构件 160
9.6 部署构件至Nexus 163
9.6.1 使用Maven部署构件至Nexus 163
9.6.2 手动部署第三方构件至Nexus 164
9.7 Nexus的权限管理 165
9.7.1 Nexus的访问控制模型 165
9.7.2 为项目分配独立的仓库 167
9.8 Nexus的调度任务 169
9.9 其他私服软件 170
9.10 小结 171
第10章 使用Maven进行测试 172
10.1 account-captcha 173
10.1.1 account-captcha的POM 173
10.1.2 account-captcha的主代码 175
10.1.3 account-captcha的测试代码 180
10.2 maven-surefire-plugin简介 184
10.3 跳过测试 184
10.4 动态指定要运行的测试用例 186
10.5 包含与排除测试用例 187
10.6 测试报告 188
10.6.1 基本的测试报告 189
10.6.2 测试覆盖率报告 190
10.7 运行TestNG测试 191
10.8 重用测试代码 193
10.9 小结 194
第11章 使用Hudson进行持续集成 195
11.1 持续集成的作用、过程和优势 196
11.2 Hudson简介 198
11.3 安装Hudson 199
11.4 准备Subversion仓库 200
11.5 Hudson的基本系统设置 203
11.6 创建Hudson任务 205
11.6.1 Hudson任务的基本配置 205
11.6.2 Hudson任务的源码仓库配置 206
11.6.3 Hudson任务的构建触发配置 207
11.6.4 Hudson任务的构建配置 208
11.7 监视Hudson任务状态 209
11.7.1 全局任务状态 209
11.7.2 自定义任务视图 211
11.7.3 单个任务状态 212
11.7.4 Maven项目测试报告 214
11.8 Hudson用户管理 215
11.9 邮件反馈 217
11.10 Hudson工作目录 218
11.11 小结 220
第12章 使用Maven构建Web应用 221
12.1 Web项目的目录结构 222
12.2 account-service 224
12.2.1 account-service的POM 224
12.2.2 account-service的主代码 225
12.3 account-web 230
12.3.1 account-web的POM 230
12.3.2 account-web的主代码 231
12.4 使用jetty-maven-plugin进行测试 237
12.5 使用Cargo实现自动化部署 239
12.5.1 部署至本地Web容器 239
12.5.2 部署至远程Web容器 241
12.6 小结 242
第13章 版本管理 243
13.1 何为版本管理 244
13.2 Maven的版本号定义约定 245
13.3 主干、标签与分支 246
13.4 自动化版本发布 247
13.5 自动化创建分支 252
13.6 GPG签名 253
13.6.1 GPG及其基本使用 254
13.6.2 Maven GPG Plugin 255
13.7 小结 258
第14章 灵活的构建 259
14.1 Maven属性 260
14.2 构建环境的差异 262
14.3 资源过滤 263
14.4 Maven Profile 265
14.4.1 针对不同环境的profile 265
14.4.2 激活profile 266
14.4.3 profile的种类 269
14.5 Web资源过滤 271
14.6 在profile中激活集成测试 272
14.7 小结 274
第15章 生成项目站点 275
15.1 最简单的站点 276
15.2 丰富项目信息 278
15.3 项目报告插件 281
15.3.1 JavaDocs 281
15.3.2 Source Xref 283
15.3.3 CheckStyle 284
15.3.4 PMD 286
15.3.5 ChangeLog 288
15.3.6 Cobertura 289
15.4 自定义站点外观 290
15.4.1 站点描述符 290
15.4.2 头部内容及外观 291
15.4.3 皮肤 292
15.4.4 导航边栏 294
15.5 创建自定义页面 295
15.6 国际化 298
15.7 部署站点 299
15.8 小结 302
第16章 m2eclipse 303
16.1 m2eclipse简介 304
16.2 新建Maven项目 304
16.3 导入Maven项目 306
16.3.1 导入本地Maven项目 307
16.3.2 从SCM仓库导入Maven项目 308
16.3.3 m2eclipse中Maven项目的结构 309
16.4 执行mvn命令 310
16.5 访问Maven仓库 312
16.5.1 Maven仓库视图 312
16.5.2 搜索构件和Java类 314
16.6 管理项目依赖 315
16.6.1 添加依赖 315
16.6.2 分析依赖 317
16.7 其他实用功能 319
16.7.1 POM编辑的代码提示 319
16.7.2 Effective POM 320
16.7.3 下载依赖源码 321
16.8 小结 321
第17章 编写Maven插件 323
17.1 编写Maven插件的一般步骤 324
17.2 案例:编写一个用于代码行统计的Maven插件 324
17.3 Mojo标注 331
17.4 Mojo参数 332
17.5 错误处理和日志 336
17.6 测试Maven插件 337
17.7 小结 341
第18章 Archetype 342
18.1 Archetype使用再叙 343
18.1.1 Maven Archetype Plugin 343
18.1.2 使用Archetype的一般步骤 343
18.1.3 批处理方式使用Archetype 344
18.1.4 常用Archetype介绍 345
18.2 编写Archetype 347
18.3 Archetype Catalog 352
18.3.1 什么是Archetype Catalog 352
18.3.2 Archetype Catalog的来源 353
18.3.3 生成本地仓库的Archetype Catalog 354
18.3.4 使用nexus-archetype-plugin 355
18.4 小结 356
附录A POM元素参考 357
附录B Settings元素参考 359
附录C 常用插件列表 360