书籍详情
使用Ant进行Java开发
作者:(美)Erik Hatcher,(美)Steve Loughran著;刘永丹,陈洋译;刘永丹译
出版社:电子工业出版社
出版时间:2005-09-01
ISBN:9787121016837
定价:¥69.00
购买这本书可以去
内容简介
Ant,一个备受赞誉的Java构建工具。它以其易于使用、与平台无关、迎合如今项目自动测试和自动部署的需要,成为许多项目构建过程的重要环节。目前它已成为所有主要开源Java项目采用的独立工具,并已成了事实上的标准。 本书作者是被SAM RUBY先生誉为“两个最了解ANT的人”。他们将以最佳的方式给你讲授Ant,从一个简单的构建定义开始,然后展示加入你的项目所需的那些功能。如果你是一个初学Ant的人,本书将系统带你领略大多数Java项目都要经历的核心步骤:编译、测试、执行、打包以及分发。如果你是一个富有经验的Ant用户,本书能教你如何使用Ant“增强系统的能力”。所以不管你使用Ant的经验如何,都能从本书中学到很多东西,你的软件项目也将因为使用Ant作为构建过程的基础而受益匪浅。 本书分为三个部分,第1部分提供了Ant及其功能的基础知识。第2部分,每章讨论一个专题,在其中探讨了多种项目,并介绍了Ant在其中扮演的关键角色。第3部分是为那些想突破既有能力限制的高级用户撰写的内容。
作者简介
ErikHatcher,一位Ant项目提交者,目前正主持jGurus的AntFAQjGuru,他在那里回答世界上最棘手的Ant问题。Erik居住在Virginia的Charlottesville。SteveLoughran,也是一位Ant的提交者,就职于HewlettPackard,负责设计和建立成品WebService。Steve居住在Oregon的Corvallis。
目录
译者序 v
序 xxi
前言 xxiii
致谢 xxv
关于本书 xxvii
关于作者 xxxii
关于封面 xxxiii
Part 1 学习Ant
第1章 Ant简介 3
1.1 何为Ant 3
1.1.1 何为构建过程,我们为什么需要它 4
1.1.2 为什么我们认为Ant是一个优秀的构建工具 4
1.2 Ant的核心概念 5
1.2.1 示例工程 7
1.3 为什么要使用ANT 10
1.3.1 集成开发环境 10
1.3.2 Make 11
1.3.3 其他构建工具 13
1.3.4 立刻就来运行吧 14
1.4 Ant的演化史 14
1.5 Ant与软件开发方法 16
1.5.1 XP(eXtreme Programming) 16
1.5.2 Rational统一过程 17
1.6 示例工程 17
1.6.1 文档搜索引擎—Ant示例工程 18
1.7 太棒了,可是ANT能否…… 19
1.8 超越JAVA开发 21
1.8.1 Web 发布引擎 21
1.8.2 简单的工作流引擎 21
1.8.3 Microsoft .NET 以及其他语言 21
1.9 小结 22
第2章 开始Ant之旅 23
2.1 定义我们的第一个工程 23
2.2 第一步: 检查工具是否已经就绪 24
2.3 第二步: 编写你的第一个Ant构建文件 24
2.3.1 测试构建文件 25
2.4 第三步: 运行你的第一个构建 26
2.4.1 如果构建失败 27
2.4.2 查看更多构建细节 29
2.5 第四步:强制结构 31
2.5.1 布置源文件路径 32
2.5.2 布置构建目录 33
2.5.3 布置发布目录 34
2.5.4 创建构建文件 35
2.5.5 目标依赖 35
2.5.6 运行新的构建文件 36
2.5.7 重新运行构建 37
2.5.8 Ant如何处理命令行上的多个目标 38
2.6 第五步: 运行我们的程序 39
2.6.1 为什么要在Ant内部运行 39
2.6.2 添加执行目标 40
2.6.3 运行新的目标 40
2.7 ANT 命令行选项 41
2.7.1 指定要运行的构建 42
2.7.2 控制所提供的信息量 42
2.7.3 获取项目信息 44
2.8 最终的构建文件 44
2.9 小结 46
第3章 理解Ant的datatypes和特性 47
3.1 入门 48
3.1.1 Datatype 概述 48
3.1.2 特性概述 48
3.2 通过<JAVAC>介绍DATATYPE和特性 49
3.3 路径(Path) 51
3.4 文件集(Fileset) 52
3.4.1 文件集举例 53
3.4.2 默认排除项(Default excludes) 53
3.5 模式集(Patternset) 54
3.6 选择器(or) 56
3.7 DATATYPE元素命名 57
3.8 过滤集(Filterset) 58
3.8.1 构建运行时在文件中插入日期戳 58
3.9 过滤链(filterchain)和过滤阅读器(FilterReader) 59
3.10 Mapper 61
3.10.1 Identity映射器 61
3.10.2 Flatten 映射器 62
3.10.3 Merge 映射器 62
3.10.4 Glob 映射器 63
3.10.5 Regexp 映射器 63
3.10.6 Package映射器 64
3.11 其他ANT DATATYPE 65
3.11.1 ZipFileset 65
3.11.2 Dirset 65
3.11.3 Filelist 65
3.11.4 ClassFileset 66
3.12 特性(Property) 66
3.12.1 通过<property>任务设置特性 67
3.12.2 <property> 任务怎样区别于其他任务 70
3.12.3 检查资源的可用性:<available> 70
3.12.4 忽略不必要的步骤:<uptodate> 以节省时间 72
3.12.5 用<condition>测试条件 72
3.12.6 在命令行中设置特性 74
3.12.7 用<tstamp>创建构建的时间戳 75
3.12.8 从XML文件中载入特性 76
3.13 使用特性控制Ant 77
3.13.1 有条件地执行 target 77
3.13.2 有条件的patternset包含/排除(inclusion/exclusion) 78
3.13.3 有条件的构建失败 78
3.14 引用 79
3.14.1 特性和引用 80
3.14.2 为嵌套的模式集使用引用 81
3.15 最佳实践 82
3.16 小结 83
第4章 使用JUnit进行测试 85
4.1 重构(Refactoring) 86
4.2 JAVA MAIN() 测试 86
4.3 JUNIT 入门 87
4.3.1 编写测试用例 88
4.3.2 运行测试用例 88
4.3.3 断言预期的结果 88
4.3.4 测试用例生命周期 90
4.3.5 编写测试组件 90
4.3.6 获取及安装JUnit 91
4.3.7 扩展JUnit 91
4.4 在我们的应用程序中使用单元测试 92
4.4.1 先编写测试 92
4.4.2 在测试过程中处理外部资源 93
4.5 JUNIT任务—<JUNIT> 94
4.5.1 组织目录以安放测试 94
4.5.2 配置JUnit到构建过程 95
4.6 测试失败意味着构建失败 97
4.6.1 捕获测试结果 97
4.6.2 运行多重测试 99
4.6.3 创建你自己的结果(result)formatter 100
4.7 生成测试结果报告 100
4.7.1 生成报告且允许当测试失败时中止构建 102
4.7.2 从命令行运行单个测试用例 103
4.7.3 初始化测试环境 103
4.7.4 其他测试问题 104
4.8 短路测试 105
4.8.1 处理大量测试 108
4.9 最佳实践 109
4.10 小结 110
第5章 运行程序 111
5.1 为什么需要运行外部程序 111
5.2 运行JAVA程序 112
5.2.1 介绍<java>任务 113
5.2.2 设置classpath 114
5.2.3 参数 115
5.2.4 定义系统特性 116
5.2.5 在新JVM中运行程序 117
5.2.6 设置环境变量 118
5.2.7 控制新JVM 118
5.2.8 使用failonerror处理错误 119
5.2.9 执行JAR文件 120
5.2.10 调用第三方程序 121
5.2.11 在调用之前探查Java程序 123
5.2.12 设置超时 124
5.3 使用<>启动本地程序 124
5.3.1 设置环境变量 126
5.3.2 处理错误 126
5.3.3 处理超时 127
5.3.4 制作并运行一个shell命令 127
5.3.5 在程序被调用之前进行探测 129
5.4 使用<apply>进行批量执行 130
5.5 处理输出 131
5.6 执行的限制 132
5.7 最佳实践 132
5.8 小结 133
第6章 工程打包 134
6.1 移动、复制和删除文件 135
6.1.1 如何删除文件 135
6.1.2 怎样复制文件 136
6.1.3 如何移动文件 137
6.1.4 过滤 138
6.2 为打包做准备 139
6.2.1 构建发布代码及其文档 139
6.2.2 加入数据文件 141
6.2.3 准备编制文档 142
6.2.4 准备安装脚本和文档 143
6.2.5 为重发布准备库 145
6.3 创建存档文件 146
6.3.1 JAR文件 148
6.3.2 创建一个JAR文件 148
6.3.3 测试JAR文件 149
6.3.4 创建JAR清单 150
6.3.5 向JAR中增加额外元数据 152
6.3.6 JAR文件的最佳实践 152
6.3.7 签署JAR文件 152
6.4 创建ZIP文件 154
6.4.1 创建二进制发布 154
6.4.2 创建源代码发布 156
6.4.3 合并Zip文件 157
6.4.4 Zip文件的最佳实践 157
6.5 创建TAR文件 158
6.6 使用WAR文件创建WEB应用程序 160
6.7 打包测试 161
6.8 小结 162
第7章 部署 163
7.1 典型部署问题 164
7.1.1 再看这些任务 164
7.1.2 部署所用的工具 164
7.2 用于部署的任务 165
7.2.1 使用<ftp>进行文件传输 166
7.2.2 探测服务器的有效性 166
7.2.3 使用<sleep>让构建暂停 168
7.2.4 Ant的email任务 169
7.2.5 使用<get>获取远程文件 170
7.2.6 使用任务进行部署 171
7.3 基于FTP的打包应用程序发布 171
7.3.1 通过<input>任务获得信息 172
7.4 基于Email的打包应用程序发布 173
7.5 本地部署到Tomcat 4.x 174
7.5.1 Tomcat的管理servlet API 175
7.5.2 使用Ant部署到Tomcat 176
7.6 远程部署到Tomcat 181
7.6.1 插曲:使用<antcall>调用目标 182
7.6.2 在部署中使用<antcall> 185
7.7 对部署进行测试 187
7.8 小结 187
第8章 综合运用Ant 188
8.1 我们目前的应用程序 188
8.2 构建定制的Ant任务库 189
8.3 载入跨工程的共用特性 194
8.4 处理版本依赖 196
8.4.1 安装库的新版本 198
8.5 构建文件的哲学 200
8.5.1 一开始就要把结果放在心上 200
8.5.2 将测试纳入构建 200
8.5.3 支持自动部署 200
8.5.4 使其可移植 200
8.5.5 允许用定制 201
8.6 小结 201
Part 2 应用Ant
第9章 在开发项目中使用Ant 205
9.1 设计基于Ant的构建过程 206
9.1.1 分析你的项目 206
9.1.2 建立核心构建文件 208
9.1.3 完善构建文件 208
9.2 移植到ANT 209
9.3 移植的十个步骤 210
9.3.1 从基于Make的项目移植 211
9.3.2 从基于IDE的项目移植 211
9.4 主构建:管理大型项目 212
9.4.1 重构构建文件 212
9.4.2 引入<ant>任务 213
9.4.3 示例:基本主构建文件 213
9.4.4 设计可升级的灵活主构建文件 215
9.5 管理子工程构建 221
9.5.1 如何控制子工程的特性 221
9.5.2 从主构建文件中继承特性和引用 223
9.5.3 在<ant>里声明特性和引用 224
9.5.4 通过XML文件片断共享特性 225
9.5.5 使用XML文件片断共享目标 227
9.6 创建可重用的库构建文件 228
9.7 展望未来:让大型项目支持演化 230
9.8 ANT项目的最佳实践 231
9.8.1 管理库 232
9.8.2 实现过程 232
9.9 小结 233
第10章 超越Ant的核心任务 234
10.1 理解任务的种类 235
10.1.1 那么,什么是“可选”任务 235
10.1.2 Ant的主要可选任务 236
10.1.3 为什么需要第三方任务 237
10.2 可选任务实际演练 237
10.2.1 操控特性文件 237
10.2.2 为构建期间添加音频反馈和视觉反馈 239
10.2.3 添加依赖关系检查 241
10.2.4 用JavaCC进行语法解析 243
10.2.5 置换正则表达式 244
10.3 使用软件配置管理任务 245
10.3.1 CVS 245
10.3.2 ClearCase 246
10.4 使用第三方任务 247
10.4.1 用<taskdef>定义任务 247
10.5 几个知名的第三方任务 248
10.5.1 Checkstyle 248
10.5.2 Torque—对象-关系映射 250
10.6 ANT-CONTRIB任务 253
10.7 项目间共享任务定义 258
10.8 最佳实践 258
10.9 小结 259
第11章 XDoclet 260
11.1 安装XDoclet 261
11.2 生成TO-DO列表 261
11.3 XDoclet的体系结构 262
11.3.1 XDoclet的Ant任务 263
11.3.2 模板化 264
11.3.3 XDoclet如何工作 265
11.4 编写自己的XDoclet模板 265
11.4.1 代码生成 267
11.4.2 按类生成与单文件生成的比较 272
11.4.3 过滤要处理的类 273
11.5 高级XDoclet 273
11.5.1 定制子任务 274
11.5.2 建立定制标记处理器 274
11.6 XDoclet的发展方向 275
11.6.1 XDoclet与C#的比较 275
11.6.2 展望Java的未来:JSR175和JSR181 276
11.7 XDoclet最佳实践 276
11.7.1 依赖关系检查 276
11.8 小结 277
第12章 web开发 278
12.1 WEB应用程序有什么不同 279
12.2 使用标记库 280
12.2.1 建立标记库 280
12.2.2 集成标记库 286
12.2.3 使用Ant开发标记库小结 287
12.3 编译JSP网页 288
12.3.1 安装<jspc>任务 289
12.3.2 使用<jspc>任务 289
12.3.3 为部署而编译JSP 291
12.3.4 其他JSP编译任务 292
12.4 定制web应用程序 292
12.4.1 基于filterset的定制 292
12.4.2 利用XDoclet定制部署描述文件 294
12.4.3 定制WAR文件中的库 297
12.5 生成静态内容 297
12.5.1 生成新内容 297
12.5.2 建立新文件 298
12.5.3 修改既有文件 299
12.6 使用HTTPUNIT测试WEB应用程序 299
12.6.1 编写HttpUnit测试 300
12.6.2 编译测试 302
12.6.3 准备从Ant中运行HttpUnit测试 303
12.6.4 运行HttpUnit测试 303
12.6.5 整合测试 304
12.6.6 HttpUnit的局限性 306
12.6.7 Canoo WebTest 306
12.7 利用CACTUS进行服务器端测试 310
12.7.1 从Ant视角看Cactus 311
12.7.2 Cactus如何运作 313
12.7.3 我们的测试用例登场了 314
12.7.4 Cactus小结 314
12.8 小结 315
第13章 使用XML 317
13.1 导言:关于XML库 318
13.2 验证XML 319
13.2.1 当文件不合法的时候 320
13.2.2 解析XML DTDs 321
13.2.3 支持其他的XML验证机制 322
13.3 利用XSLT转换XML 323
13.3.1 使用XML Catalog datatype 325
13.3.2 由XML生成PDF文件 327
13.3.3 Styler——一个第三方的转换任务 327
13.4 生成XML格式的构建日志 327
13.4.1 样式表 328
13.4.2 输出文件 329
13.4.3 构建日志的后处理 330
13.5 将XML数据载入Ant特性 331
13.6 XML处理的将来 332
13.7 小结 332
第14章 Enterprise JavaBeans 333
14.1 EJB概述 333
14.1.1 Enterprise JavaBeans的多种类型 334
14.1.2 EJB JAR 334
14.1.3 厂商相关的情形 335
14.2 一个简单的EJB构建 335
14.3 使用ANT的EJB任务 336
14.4 使用<EJBJAR> 337
14.4.1 厂商相关的<ejbjar>处理 339
14.5 使用XDoclet进行EJB开发 340
14.5.1 XDoclet子任务 341
14.5.2 XDoclet的@标记 342
14.5.3 利用XDoclet支持不同的应用服务器 343
14.5.4 Ant特性替换 343
14.6 MIDDLEGEN 345
14.7 部署到J2EE应用服务器 348
14.8 一个完整的EJB例子 349
14.9 EJB工程的最佳实践 354
14.10 小结 354
第15章 使用Web服务 355
15.1 何谓Web服务,何谓SOAP 356
15.1.1 SOAP API 357
15.1.2 向Java增加Web服务能力 357
15.2 用Ant创建一个SOAP客户端应用程序 357
15.2.1 准备我们的构建文件 358
15.2.2 创建代理类 359
15.2.3 使用SOAP代理类 361
15.2.4 编译SOAP客户端 361
15.2.5 运行SOAP服务 362
15.2.6 回顾SOAP客户端创建 363
15.3 用Axis和Ant创建一个SOAP服务 363
15.3.1 构建Web服务的简单方法 364
15.4 向既有Web应用程序添加Web服务 367
15.4.1 配置Web应用程序 367
15.4.2 添加库 368
15.4.3 在构建中包含SOAP服务 368
15.4.4 测试服务器上的需要类 369
15.4.5 实现SOAP端点 370
15.4.6 部署Web服务 370
15.5 为SOAP服务编写客户端 371
15.5.1 导入WSDL 371
15.5.2 实现测试 372
15.5.3 编写Java客户端 375
15.6 什么是互操作,为什么它成其为问题 376
15.7 构建一个C#客户端 376
15.7.1 条件探测 377
15.7.2 在C#中导入WSDL 378
15.7.3 编写C#客户端类 379
15.7.4 构建C#客户端 379
15.7.5 运行C#客户端 380
15.7.6 回顾C#客户端的构建过程 381
15.8 构建Web服务的严格方法 381
15.9 回顾Web服务开发 382
15.10 通过SOAP调用Ant 383
15.11 小结 384
第16章 持续集成 386
16.1 利用操作系统调度Ant构建 387
16.1.1 Windows方法 387
16.1.2 Unix 版本 388
16.1.3 使用脚本 388
16.2 CRUISECONTROL 388
16.2.1 它如何工作 389
16.2.2 这就是Cruise——让构建管理器工作起来 389
16.2.3 报告构建日志 395
16.2.4 邮件通知与构建标注 396
16.2.5 CruiseControl小结 396
16.2.6 提示与技巧 396
16.2.7 CruiseControl的优点和缺点 396
16.3 ANTHILL 397
16.3.1 让Anthill转起来 398
16.3.2 Anthill是如何工作的 399
16.3.3 Anthill小结 400
16.4 GUMP 401
16.4.1 安装和运行Gump 401
16.4.2 Gump如何运作 403
16.4.3 Gump小结 404
16.5 持续集成工具的比较 405
16.6 小结 406
第17章 开发本地代码 407
17.1 本地代码的挑战 407
17.2 使用既有的构建工具 408
17.2.1 交给IDE去做 408
17.2.2 使用Make 409
17.3 引入<CC>任务 410
17.3.1 安装任务 410
17.3.2 添加一个编译器 411
17.3.3 <cc>任务快速入门 411
17.4 在ANT中构建一个JNI库 412
17.4.1 构建JNI库的步骤 413
17.4.2 编写Java存根(Stub) 414
17.4.3 编写C++类 415
17.4.4 编译C++源代码 416
17.4.5 部署和测试库 419
17.5 实现跨平台 422
17.5.1 移植C++源文件 422
17.5.2 扩展构建文件 423
17.5.3 移植测试 424
17.5.4 移植代码 424
17.6 深入<CC>的细节 425
17.6.1 定义预处理宏 425
17.6.2 通过<libset>链接到库 426
17.6.3 配置编译器和链接器 427
17.6.4 定制链接器 428
17.7 发布本地库 429
17.8 小结 430
第18章 成品部署 431
18.1 不同应用服务器的挑战 432
18.1.1 迥然不同的底层行为 432
18.1.2 不同的Java运行时行为 433
18.1.3 使用不同的API实现进行复制 434
18.1.4 与供应商相关的库 436
18.1.5 部署描述文件 436
18.1.6 与服务器相关的部署过程 436
18.1.7 与服务器相关的管理 436
18.2 与操作员齐心协力 437
18.2.1 操作员用例 437
18.2.2 操作员测试 437
18.2.3 操作员缺陷跟踪 438
18.2.4 将操作员与构建过程集成 438
18.3 利用Ant迎接部署的挑战 440
18.3.1 建立单一的源代码树 440
18.3.2 为创建档案文件而编写统一的目标 440
18.3.3 运行服务器端Ant进行部署 441
18.3.4 自动化上载和部署过程 442
18.4 ANT的强大部署工具介绍 442
18.4.1 <copy>任务 442
18.4.2 <serverdeploy>任务 443
18.4.3 使用<telnet>进行远程控制 443
18.5 建立一个成品的部署过程 446
18.5.1 计划 446
18.5.2 目录结构 447
18.5.3 配置文件 447
18.5.4 构建文件 447
18.5.5 远程构建文件build.xml 447
18.5.6 为安装到服务器编写构建文件 449
18.5.7 上载至远程服务器 450
18.5.8 让远程部署转起来 454
18.5.9 对部署过程进行回顾 455
18.6 部署至特定应用服务器 456
18.6.1 Tomcat 4.0 和 Tomcat 4.1 456
18.6.2 BEA WebLogic 458
18.6.3 HP Bluestone 应用服务器 458
18.6.4 其他服务器 459
18.7 验证部署 459
18.7.1 创建时间戳文件 460
18.7.2 将时间戳文件添加到应用程序中 460
18.7.3 测试时间戳 462
18.8 最佳实践 462
18.9 小结 463
Part 3 扩展Ant
第19章 编写Ant任务 467
19.1 什么是一个真正的Ant任务 468
19.1.1 世界上最简单的Ant任务 468
19.1.2 在同一个构建过程中编译和应用一个任务 469
19.1.3 任务的生命周期 469
19.2 Ant API 入门 470
19.2.1 Task 470
19.2.2 Project 471
19.2.3 Path 472
19.2.4 Fileset 472
19.2.5 DirectoryScanner 472
19.2.6 EnumeratedAttribute 473
19.2.7 FileUtils 473
19.3 任务如何获得数据 474
19.3.1 设置属性 474
19.3.2 支持嵌套元素 480
19.3.3 支持datatypes 481
19.3.4 允许自由格式文本 482
19.4 建立一个基本的Ant Task子类 483
19.4.1 为任务添加属性 483
19.4.2 处理元素文本 484
19.5 操作FILESET 485
19.6 错误处理 486
19.7 测试Ant任务 487
19.8 执行外部程序 487
19.8.1 处理进程输出 490
19.8.2 本地执行小结 490
19.9 在任务中执行Java程序 490
19.9.1 创建Java程序新进程的示例 490
19.10 支持任意命名的元素和属性 493
19.11 构建任务库 495
19.12 支持多版本Ant 497
19.13 小结 497
第20章 进一步扩展Ant 498
20.1 在Ant中使用脚本 499
20.1.1 <script>约定的隐含对象 500
20.1.2 脚本使用小结 501
20.2 监听者与日志工具 502
20.2.1 编写一个定制监听者 503
20.2.2 使用log4j的日志功能 506
20.2.3 编写一个定制日志工具 509
20.2.4 使用MailLogger 513
20.3 开发定制的MAPPER 514
20.4 创建定制的OR 515
20.4.1 在构建中使用定制or 516
20.5 实现定制的FILTER 517
20.5.1 编写定制filter的reader 519
20.6 小结 520
附录A 安装 523
附录B Ant之XML入门 532
附录C IDE集成 536
附录D Ant风格的要素 544
附录E Ant任务参考 562
资源 621
索引
序 xxi
前言 xxiii
致谢 xxv
关于本书 xxvii
关于作者 xxxii
关于封面 xxxiii
Part 1 学习Ant
第1章 Ant简介 3
1.1 何为Ant 3
1.1.1 何为构建过程,我们为什么需要它 4
1.1.2 为什么我们认为Ant是一个优秀的构建工具 4
1.2 Ant的核心概念 5
1.2.1 示例工程 7
1.3 为什么要使用ANT 10
1.3.1 集成开发环境 10
1.3.2 Make 11
1.3.3 其他构建工具 13
1.3.4 立刻就来运行吧 14
1.4 Ant的演化史 14
1.5 Ant与软件开发方法 16
1.5.1 XP(eXtreme Programming) 16
1.5.2 Rational统一过程 17
1.6 示例工程 17
1.6.1 文档搜索引擎—Ant示例工程 18
1.7 太棒了,可是ANT能否…… 19
1.8 超越JAVA开发 21
1.8.1 Web 发布引擎 21
1.8.2 简单的工作流引擎 21
1.8.3 Microsoft .NET 以及其他语言 21
1.9 小结 22
第2章 开始Ant之旅 23
2.1 定义我们的第一个工程 23
2.2 第一步: 检查工具是否已经就绪 24
2.3 第二步: 编写你的第一个Ant构建文件 24
2.3.1 测试构建文件 25
2.4 第三步: 运行你的第一个构建 26
2.4.1 如果构建失败 27
2.4.2 查看更多构建细节 29
2.5 第四步:强制结构 31
2.5.1 布置源文件路径 32
2.5.2 布置构建目录 33
2.5.3 布置发布目录 34
2.5.4 创建构建文件 35
2.5.5 目标依赖 35
2.5.6 运行新的构建文件 36
2.5.7 重新运行构建 37
2.5.8 Ant如何处理命令行上的多个目标 38
2.6 第五步: 运行我们的程序 39
2.6.1 为什么要在Ant内部运行 39
2.6.2 添加执行目标 40
2.6.3 运行新的目标 40
2.7 ANT 命令行选项 41
2.7.1 指定要运行的构建 42
2.7.2 控制所提供的信息量 42
2.7.3 获取项目信息 44
2.8 最终的构建文件 44
2.9 小结 46
第3章 理解Ant的datatypes和特性 47
3.1 入门 48
3.1.1 Datatype 概述 48
3.1.2 特性概述 48
3.2 通过<JAVAC>介绍DATATYPE和特性 49
3.3 路径(Path) 51
3.4 文件集(Fileset) 52
3.4.1 文件集举例 53
3.4.2 默认排除项(Default excludes) 53
3.5 模式集(Patternset) 54
3.6 选择器(or) 56
3.7 DATATYPE元素命名 57
3.8 过滤集(Filterset) 58
3.8.1 构建运行时在文件中插入日期戳 58
3.9 过滤链(filterchain)和过滤阅读器(FilterReader) 59
3.10 Mapper 61
3.10.1 Identity映射器 61
3.10.2 Flatten 映射器 62
3.10.3 Merge 映射器 62
3.10.4 Glob 映射器 63
3.10.5 Regexp 映射器 63
3.10.6 Package映射器 64
3.11 其他ANT DATATYPE 65
3.11.1 ZipFileset 65
3.11.2 Dirset 65
3.11.3 Filelist 65
3.11.4 ClassFileset 66
3.12 特性(Property) 66
3.12.1 通过<property>任务设置特性 67
3.12.2 <property> 任务怎样区别于其他任务 70
3.12.3 检查资源的可用性:<available> 70
3.12.4 忽略不必要的步骤:<uptodate> 以节省时间 72
3.12.5 用<condition>测试条件 72
3.12.6 在命令行中设置特性 74
3.12.7 用<tstamp>创建构建的时间戳 75
3.12.8 从XML文件中载入特性 76
3.13 使用特性控制Ant 77
3.13.1 有条件地执行 target 77
3.13.2 有条件的patternset包含/排除(inclusion/exclusion) 78
3.13.3 有条件的构建失败 78
3.14 引用 79
3.14.1 特性和引用 80
3.14.2 为嵌套的模式集使用引用 81
3.15 最佳实践 82
3.16 小结 83
第4章 使用JUnit进行测试 85
4.1 重构(Refactoring) 86
4.2 JAVA MAIN() 测试 86
4.3 JUNIT 入门 87
4.3.1 编写测试用例 88
4.3.2 运行测试用例 88
4.3.3 断言预期的结果 88
4.3.4 测试用例生命周期 90
4.3.5 编写测试组件 90
4.3.6 获取及安装JUnit 91
4.3.7 扩展JUnit 91
4.4 在我们的应用程序中使用单元测试 92
4.4.1 先编写测试 92
4.4.2 在测试过程中处理外部资源 93
4.5 JUNIT任务—<JUNIT> 94
4.5.1 组织目录以安放测试 94
4.5.2 配置JUnit到构建过程 95
4.6 测试失败意味着构建失败 97
4.6.1 捕获测试结果 97
4.6.2 运行多重测试 99
4.6.3 创建你自己的结果(result)formatter 100
4.7 生成测试结果报告 100
4.7.1 生成报告且允许当测试失败时中止构建 102
4.7.2 从命令行运行单个测试用例 103
4.7.3 初始化测试环境 103
4.7.4 其他测试问题 104
4.8 短路测试 105
4.8.1 处理大量测试 108
4.9 最佳实践 109
4.10 小结 110
第5章 运行程序 111
5.1 为什么需要运行外部程序 111
5.2 运行JAVA程序 112
5.2.1 介绍<java>任务 113
5.2.2 设置classpath 114
5.2.3 参数 115
5.2.4 定义系统特性 116
5.2.5 在新JVM中运行程序 117
5.2.6 设置环境变量 118
5.2.7 控制新JVM 118
5.2.8 使用failonerror处理错误 119
5.2.9 执行JAR文件 120
5.2.10 调用第三方程序 121
5.2.11 在调用之前探查Java程序 123
5.2.12 设置超时 124
5.3 使用<>启动本地程序 124
5.3.1 设置环境变量 126
5.3.2 处理错误 126
5.3.3 处理超时 127
5.3.4 制作并运行一个shell命令 127
5.3.5 在程序被调用之前进行探测 129
5.4 使用<apply>进行批量执行 130
5.5 处理输出 131
5.6 执行的限制 132
5.7 最佳实践 132
5.8 小结 133
第6章 工程打包 134
6.1 移动、复制和删除文件 135
6.1.1 如何删除文件 135
6.1.2 怎样复制文件 136
6.1.3 如何移动文件 137
6.1.4 过滤 138
6.2 为打包做准备 139
6.2.1 构建发布代码及其文档 139
6.2.2 加入数据文件 141
6.2.3 准备编制文档 142
6.2.4 准备安装脚本和文档 143
6.2.5 为重发布准备库 145
6.3 创建存档文件 146
6.3.1 JAR文件 148
6.3.2 创建一个JAR文件 148
6.3.3 测试JAR文件 149
6.3.4 创建JAR清单 150
6.3.5 向JAR中增加额外元数据 152
6.3.6 JAR文件的最佳实践 152
6.3.7 签署JAR文件 152
6.4 创建ZIP文件 154
6.4.1 创建二进制发布 154
6.4.2 创建源代码发布 156
6.4.3 合并Zip文件 157
6.4.4 Zip文件的最佳实践 157
6.5 创建TAR文件 158
6.6 使用WAR文件创建WEB应用程序 160
6.7 打包测试 161
6.8 小结 162
第7章 部署 163
7.1 典型部署问题 164
7.1.1 再看这些任务 164
7.1.2 部署所用的工具 164
7.2 用于部署的任务 165
7.2.1 使用<ftp>进行文件传输 166
7.2.2 探测服务器的有效性 166
7.2.3 使用<sleep>让构建暂停 168
7.2.4 Ant的email任务 169
7.2.5 使用<get>获取远程文件 170
7.2.6 使用任务进行部署 171
7.3 基于FTP的打包应用程序发布 171
7.3.1 通过<input>任务获得信息 172
7.4 基于Email的打包应用程序发布 173
7.5 本地部署到Tomcat 4.x 174
7.5.1 Tomcat的管理servlet API 175
7.5.2 使用Ant部署到Tomcat 176
7.6 远程部署到Tomcat 181
7.6.1 插曲:使用<antcall>调用目标 182
7.6.2 在部署中使用<antcall> 185
7.7 对部署进行测试 187
7.8 小结 187
第8章 综合运用Ant 188
8.1 我们目前的应用程序 188
8.2 构建定制的Ant任务库 189
8.3 载入跨工程的共用特性 194
8.4 处理版本依赖 196
8.4.1 安装库的新版本 198
8.5 构建文件的哲学 200
8.5.1 一开始就要把结果放在心上 200
8.5.2 将测试纳入构建 200
8.5.3 支持自动部署 200
8.5.4 使其可移植 200
8.5.5 允许用定制 201
8.6 小结 201
Part 2 应用Ant
第9章 在开发项目中使用Ant 205
9.1 设计基于Ant的构建过程 206
9.1.1 分析你的项目 206
9.1.2 建立核心构建文件 208
9.1.3 完善构建文件 208
9.2 移植到ANT 209
9.3 移植的十个步骤 210
9.3.1 从基于Make的项目移植 211
9.3.2 从基于IDE的项目移植 211
9.4 主构建:管理大型项目 212
9.4.1 重构构建文件 212
9.4.2 引入<ant>任务 213
9.4.3 示例:基本主构建文件 213
9.4.4 设计可升级的灵活主构建文件 215
9.5 管理子工程构建 221
9.5.1 如何控制子工程的特性 221
9.5.2 从主构建文件中继承特性和引用 223
9.5.3 在<ant>里声明特性和引用 224
9.5.4 通过XML文件片断共享特性 225
9.5.5 使用XML文件片断共享目标 227
9.6 创建可重用的库构建文件 228
9.7 展望未来:让大型项目支持演化 230
9.8 ANT项目的最佳实践 231
9.8.1 管理库 232
9.8.2 实现过程 232
9.9 小结 233
第10章 超越Ant的核心任务 234
10.1 理解任务的种类 235
10.1.1 那么,什么是“可选”任务 235
10.1.2 Ant的主要可选任务 236
10.1.3 为什么需要第三方任务 237
10.2 可选任务实际演练 237
10.2.1 操控特性文件 237
10.2.2 为构建期间添加音频反馈和视觉反馈 239
10.2.3 添加依赖关系检查 241
10.2.4 用JavaCC进行语法解析 243
10.2.5 置换正则表达式 244
10.3 使用软件配置管理任务 245
10.3.1 CVS 245
10.3.2 ClearCase 246
10.4 使用第三方任务 247
10.4.1 用<taskdef>定义任务 247
10.5 几个知名的第三方任务 248
10.5.1 Checkstyle 248
10.5.2 Torque—对象-关系映射 250
10.6 ANT-CONTRIB任务 253
10.7 项目间共享任务定义 258
10.8 最佳实践 258
10.9 小结 259
第11章 XDoclet 260
11.1 安装XDoclet 261
11.2 生成TO-DO列表 261
11.3 XDoclet的体系结构 262
11.3.1 XDoclet的Ant任务 263
11.3.2 模板化 264
11.3.3 XDoclet如何工作 265
11.4 编写自己的XDoclet模板 265
11.4.1 代码生成 267
11.4.2 按类生成与单文件生成的比较 272
11.4.3 过滤要处理的类 273
11.5 高级XDoclet 273
11.5.1 定制子任务 274
11.5.2 建立定制标记处理器 274
11.6 XDoclet的发展方向 275
11.6.1 XDoclet与C#的比较 275
11.6.2 展望Java的未来:JSR175和JSR181 276
11.7 XDoclet最佳实践 276
11.7.1 依赖关系检查 276
11.8 小结 277
第12章 web开发 278
12.1 WEB应用程序有什么不同 279
12.2 使用标记库 280
12.2.1 建立标记库 280
12.2.2 集成标记库 286
12.2.3 使用Ant开发标记库小结 287
12.3 编译JSP网页 288
12.3.1 安装<jspc>任务 289
12.3.2 使用<jspc>任务 289
12.3.3 为部署而编译JSP 291
12.3.4 其他JSP编译任务 292
12.4 定制web应用程序 292
12.4.1 基于filterset的定制 292
12.4.2 利用XDoclet定制部署描述文件 294
12.4.3 定制WAR文件中的库 297
12.5 生成静态内容 297
12.5.1 生成新内容 297
12.5.2 建立新文件 298
12.5.3 修改既有文件 299
12.6 使用HTTPUNIT测试WEB应用程序 299
12.6.1 编写HttpUnit测试 300
12.6.2 编译测试 302
12.6.3 准备从Ant中运行HttpUnit测试 303
12.6.4 运行HttpUnit测试 303
12.6.5 整合测试 304
12.6.6 HttpUnit的局限性 306
12.6.7 Canoo WebTest 306
12.7 利用CACTUS进行服务器端测试 310
12.7.1 从Ant视角看Cactus 311
12.7.2 Cactus如何运作 313
12.7.3 我们的测试用例登场了 314
12.7.4 Cactus小结 314
12.8 小结 315
第13章 使用XML 317
13.1 导言:关于XML库 318
13.2 验证XML 319
13.2.1 当文件不合法的时候 320
13.2.2 解析XML DTDs 321
13.2.3 支持其他的XML验证机制 322
13.3 利用XSLT转换XML 323
13.3.1 使用XML Catalog datatype 325
13.3.2 由XML生成PDF文件 327
13.3.3 Styler——一个第三方的转换任务 327
13.4 生成XML格式的构建日志 327
13.4.1 样式表 328
13.4.2 输出文件 329
13.4.3 构建日志的后处理 330
13.5 将XML数据载入Ant特性 331
13.6 XML处理的将来 332
13.7 小结 332
第14章 Enterprise JavaBeans 333
14.1 EJB概述 333
14.1.1 Enterprise JavaBeans的多种类型 334
14.1.2 EJB JAR 334
14.1.3 厂商相关的情形 335
14.2 一个简单的EJB构建 335
14.3 使用ANT的EJB任务 336
14.4 使用<EJBJAR> 337
14.4.1 厂商相关的<ejbjar>处理 339
14.5 使用XDoclet进行EJB开发 340
14.5.1 XDoclet子任务 341
14.5.2 XDoclet的@标记 342
14.5.3 利用XDoclet支持不同的应用服务器 343
14.5.4 Ant特性替换 343
14.6 MIDDLEGEN 345
14.7 部署到J2EE应用服务器 348
14.8 一个完整的EJB例子 349
14.9 EJB工程的最佳实践 354
14.10 小结 354
第15章 使用Web服务 355
15.1 何谓Web服务,何谓SOAP 356
15.1.1 SOAP API 357
15.1.2 向Java增加Web服务能力 357
15.2 用Ant创建一个SOAP客户端应用程序 357
15.2.1 准备我们的构建文件 358
15.2.2 创建代理类 359
15.2.3 使用SOAP代理类 361
15.2.4 编译SOAP客户端 361
15.2.5 运行SOAP服务 362
15.2.6 回顾SOAP客户端创建 363
15.3 用Axis和Ant创建一个SOAP服务 363
15.3.1 构建Web服务的简单方法 364
15.4 向既有Web应用程序添加Web服务 367
15.4.1 配置Web应用程序 367
15.4.2 添加库 368
15.4.3 在构建中包含SOAP服务 368
15.4.4 测试服务器上的需要类 369
15.4.5 实现SOAP端点 370
15.4.6 部署Web服务 370
15.5 为SOAP服务编写客户端 371
15.5.1 导入WSDL 371
15.5.2 实现测试 372
15.5.3 编写Java客户端 375
15.6 什么是互操作,为什么它成其为问题 376
15.7 构建一个C#客户端 376
15.7.1 条件探测 377
15.7.2 在C#中导入WSDL 378
15.7.3 编写C#客户端类 379
15.7.4 构建C#客户端 379
15.7.5 运行C#客户端 380
15.7.6 回顾C#客户端的构建过程 381
15.8 构建Web服务的严格方法 381
15.9 回顾Web服务开发 382
15.10 通过SOAP调用Ant 383
15.11 小结 384
第16章 持续集成 386
16.1 利用操作系统调度Ant构建 387
16.1.1 Windows方法 387
16.1.2 Unix 版本 388
16.1.3 使用脚本 388
16.2 CRUISECONTROL 388
16.2.1 它如何工作 389
16.2.2 这就是Cruise——让构建管理器工作起来 389
16.2.3 报告构建日志 395
16.2.4 邮件通知与构建标注 396
16.2.5 CruiseControl小结 396
16.2.6 提示与技巧 396
16.2.7 CruiseControl的优点和缺点 396
16.3 ANTHILL 397
16.3.1 让Anthill转起来 398
16.3.2 Anthill是如何工作的 399
16.3.3 Anthill小结 400
16.4 GUMP 401
16.4.1 安装和运行Gump 401
16.4.2 Gump如何运作 403
16.4.3 Gump小结 404
16.5 持续集成工具的比较 405
16.6 小结 406
第17章 开发本地代码 407
17.1 本地代码的挑战 407
17.2 使用既有的构建工具 408
17.2.1 交给IDE去做 408
17.2.2 使用Make 409
17.3 引入<CC>任务 410
17.3.1 安装任务 410
17.3.2 添加一个编译器 411
17.3.3 <cc>任务快速入门 411
17.4 在ANT中构建一个JNI库 412
17.4.1 构建JNI库的步骤 413
17.4.2 编写Java存根(Stub) 414
17.4.3 编写C++类 415
17.4.4 编译C++源代码 416
17.4.5 部署和测试库 419
17.5 实现跨平台 422
17.5.1 移植C++源文件 422
17.5.2 扩展构建文件 423
17.5.3 移植测试 424
17.5.4 移植代码 424
17.6 深入<CC>的细节 425
17.6.1 定义预处理宏 425
17.6.2 通过<libset>链接到库 426
17.6.3 配置编译器和链接器 427
17.6.4 定制链接器 428
17.7 发布本地库 429
17.8 小结 430
第18章 成品部署 431
18.1 不同应用服务器的挑战 432
18.1.1 迥然不同的底层行为 432
18.1.2 不同的Java运行时行为 433
18.1.3 使用不同的API实现进行复制 434
18.1.4 与供应商相关的库 436
18.1.5 部署描述文件 436
18.1.6 与服务器相关的部署过程 436
18.1.7 与服务器相关的管理 436
18.2 与操作员齐心协力 437
18.2.1 操作员用例 437
18.2.2 操作员测试 437
18.2.3 操作员缺陷跟踪 438
18.2.4 将操作员与构建过程集成 438
18.3 利用Ant迎接部署的挑战 440
18.3.1 建立单一的源代码树 440
18.3.2 为创建档案文件而编写统一的目标 440
18.3.3 运行服务器端Ant进行部署 441
18.3.4 自动化上载和部署过程 442
18.4 ANT的强大部署工具介绍 442
18.4.1 <copy>任务 442
18.4.2 <serverdeploy>任务 443
18.4.3 使用<telnet>进行远程控制 443
18.5 建立一个成品的部署过程 446
18.5.1 计划 446
18.5.2 目录结构 447
18.5.3 配置文件 447
18.5.4 构建文件 447
18.5.5 远程构建文件build.xml 447
18.5.6 为安装到服务器编写构建文件 449
18.5.7 上载至远程服务器 450
18.5.8 让远程部署转起来 454
18.5.9 对部署过程进行回顾 455
18.6 部署至特定应用服务器 456
18.6.1 Tomcat 4.0 和 Tomcat 4.1 456
18.6.2 BEA WebLogic 458
18.6.3 HP Bluestone 应用服务器 458
18.6.4 其他服务器 459
18.7 验证部署 459
18.7.1 创建时间戳文件 460
18.7.2 将时间戳文件添加到应用程序中 460
18.7.3 测试时间戳 462
18.8 最佳实践 462
18.9 小结 463
Part 3 扩展Ant
第19章 编写Ant任务 467
19.1 什么是一个真正的Ant任务 468
19.1.1 世界上最简单的Ant任务 468
19.1.2 在同一个构建过程中编译和应用一个任务 469
19.1.3 任务的生命周期 469
19.2 Ant API 入门 470
19.2.1 Task 470
19.2.2 Project 471
19.2.3 Path 472
19.2.4 Fileset 472
19.2.5 DirectoryScanner 472
19.2.6 EnumeratedAttribute 473
19.2.7 FileUtils 473
19.3 任务如何获得数据 474
19.3.1 设置属性 474
19.3.2 支持嵌套元素 480
19.3.3 支持datatypes 481
19.3.4 允许自由格式文本 482
19.4 建立一个基本的Ant Task子类 483
19.4.1 为任务添加属性 483
19.4.2 处理元素文本 484
19.5 操作FILESET 485
19.6 错误处理 486
19.7 测试Ant任务 487
19.8 执行外部程序 487
19.8.1 处理进程输出 490
19.8.2 本地执行小结 490
19.9 在任务中执行Java程序 490
19.9.1 创建Java程序新进程的示例 490
19.10 支持任意命名的元素和属性 493
19.11 构建任务库 495
19.12 支持多版本Ant 497
19.13 小结 497
第20章 进一步扩展Ant 498
20.1 在Ant中使用脚本 499
20.1.1 <script>约定的隐含对象 500
20.1.2 脚本使用小结 501
20.2 监听者与日志工具 502
20.2.1 编写一个定制监听者 503
20.2.2 使用log4j的日志功能 506
20.2.3 编写一个定制日志工具 509
20.2.4 使用MailLogger 513
20.3 开发定制的MAPPER 514
20.4 创建定制的OR 515
20.4.1 在构建中使用定制or 516
20.5 实现定制的FILTER 517
20.5.1 编写定制filter的reader 519
20.6 小结 520
附录A 安装 523
附录B Ant之XML入门 532
附录C IDE集成 536
附录D Ant风格的要素 544
附录E Ant任务参考 562
资源 621
索引
猜您喜欢