Eclipse是一种技术,是可一个扩展的工具集平台;Eclipse还是一个开源项目,正是这个项目为世界奉献了这项卓越的技术;Eclipse更是一个社群,这里的人们为开源项目做出贡献,同时也开发基于Eclipse的商业工具。本书将帮助你跳入这个不断扩展的系统,成为一名工具编写者。本书是一个忠实的向导,它将领你跨过第一道门槛,进入Eclipse开发的世界。书中准备了一个详尽的范例,带你一步步走过一个插件的整个发展过程。另外,本书还将告诉你扩展Eclipse时应当遵循的原则。本书作者Erich是Java开发工具领域当之无愧的权威,一直影响着Eclipse平台的发展和成长。另一位作者Kent对软件开发的理解无人能出其右,而且善于深入浅出地阐释技术思想。
译序:Eclipse的Meta-Knowledge
序
前言
第1章 全景 1
1.1 本书的目标 3
1.2 插件 4
1.3 Eclipse简介 4
第一篇 第零循环:Hello World
第2章 为Eclipse插件开发做好准备 9
2.1 设置工作区 9
2.2 源码的浏览和搜索 10
2.3 前行的路标 11
第3章 Hello World 12
3.1 声明与实现的分离 13
3.2 Hello按钮 14
3.3 向世界问好 20
3.4 前行的路标 26
第二篇 第一循环:基本的插件
第4章 我们的计划 29
4.1 例示JUnit 29
4.2 JUnit集成 31
第5章 创建一个执行测试的菜单项 32
5.1 前行的路标 37
第6章 创建一个执行测试的菜单 38
6.1 前行的路标 47
第7章 显示测试结果 48
7.1 前行的路标 52
第8章 定义扩展点 53
8.1 前行的路标 61
第9章 向扩展发出通知 62
第10章 发布 64
10.1 将插件打包 64
10.2 将插件打包成零件 67
10.3 贡献 70
10.4 前行的路标 72
第11章 结束第一循环 73
第12章 间奏:测试驱动的插件开发 74
12.1 PDE JUnit 75
12.2 测试项目装置 79
12.3 测试我们贡献的JUnit插件 81
12.4 现在…… 85
第三篇 第二循环:插件的其他部分
第13章 查看测试结果 89
13.1 贡献一个视图 89
13.2 监听测试进程 92
13.3 改变颜色 94
第14章 贡献菜单 100
14.1 创建上下文菜单 100
14.2 贡献菜单项 105
14.3 前行的路标 108
第15章 把失败的测试当作编译错误 110
第16章 将失败的测试变成标记 112
16.1 标记的测试 112
16.2 传递项目信息 115
16.3 创建标记 117
16.4 删除标记 120
16.5 标记的图片 122
16.6 标记处理 123
第17章 找出所有的测试 127
第18章 构建器和项目特性 131
18.1 资源监听器与构建器 131
18.2 利用项目特性配置构建器 133
18.3 前行的路标 139
第19章 自动测试的属性设置 140
19.1 前行的路标 147
第20章 异常处理 148
20.1 IStatus和CoreException 148
20.2 在错误对话框中展现异常 150
20.3 Logging Errors 151
第21章 插件的跟踪调试 154
21.1 前行的路标 157
第22章 标记解决以及调用耗时操作 158
22.1 测试标记的解决办法 158
22.2 构建并再次执行 159
22.3 显示构建进度 160
22.4 重新执行测试 164
22.5 前行的路标 165
第23章 测试报表视图——使用JFace 166
23.1 TestResult 167
23.2 测试 168
23.3 视图 170
23.4 TestReportLabelProvider 173
23.5 TestReportContentProvider 176
23.6 处理事件 182
23.7 前行的路标 186
第24章 一个简单的编辑器 188
24.1 贡献一个编辑器 190
24.2 扩展一个contributor 194
24.3 前行的路标 199
第25章 再论ResultView——监视变化 201
25.1 检查颜色 201
25.2 监视变化 202
25.3 响应变化 204
25.4 前行的路标 207
第26章 视角 209
26.1 视角中的视图 209
26.2 显示视图菜单 212
26.3 前行的路标 214
第27章 帮助 215
27.1 顶层帮助 215
27.2 整合帮助 218
27.3 上下文敏感的帮助 219
27.4 前行的路标 223
第28章 国际化和可访问性 224
28.1 提取清单文件中的字符串 224
28.2 提取代码中的字符串 225
28.3 可访问性 227
28.4 前行的路标 229
第29章 为其他程序员发布插件 230
29.1 定义API 230
29.2 类的导出 231
29.3 将公共包与内部包分开 232
29.4 将核心与UI分开 234
29.5 发布扩展点——扩展点schema 235
29.6 前行的路标 238
第30章 结束第二循环 239
30.1 贡献 240
30.2 重新部署插件 242
30.3 下一步做什么 244
第四篇 第三循环:模式的故事
第31章 核心运行时——IAdaptable 247
31.1 Extension Object / Extension Interface 249
31.2 通过IAdaptable提供接口 251
31.3 AdapterFactories——为现有类型增加接口 252
第32章 核心工作区——资源 257
32.1 访问文件系统资源——Proxy和Bridge 257
32.2 工作区——Composite模式 261
32.3 遍历资源树——Visitor模式 262
32.4 跟踪资源的变化——Observer模式 263
32.5 批量修改——Execute Around Method模式 266
第33章 Java核心 267
33.1 从资源到Java元素——Adapter模式 267
33.2 Java元素——(Virtual)Proxy模式 269
33.3 Java元素树——Composite模式 272
33.4 类型体系——Objectify Associations模式 273
33.5 遍历Java模型 273
33.6 跟踪Java元素的变化——Observer模式 274
33.7 收集结果——Builder模式 275
33.8 抽象语法树分析——Visitor模式 277
第34章 标准窗体组件工具包——SWT 281
34.1 组合窗体组件——Composite模式 282
34.2 定义布局——Strategy模式 285
34.3 响应事件——Observer模式 287
第35章 JFace——用户界面框架 289
35.1 Viewer:连接窗体组件和领域模型——Pluggable Adapter模式 289
35.2 viewer:不使用继承定制Viewer——Strategy模式 294
35.3 动作——Command模式 295
第36章 UI工作台 297
36.1 实现“懒加载法则”——Virtual Proxy模式 297
36.2 持久化UI状态——Memento模式 299
36.3 工作台服务——IAdaptable接口 302
第37章 结束第三循环 306
37.1 最后的路标 307
37.2 盛情相邀 309
第五篇 附 录
附录A TestRunner实现细节 313
A.1 TestRunner 313
A.2 SocketTestRunner 318
附录B TestProject测试装置 322
附录C 添加了“排除某些测试用例”功能的AutoTestBuilder 326
参考文献 329
索引 330
每个人都需要别人的关怀和帮助,每个人也同样需要关怀和帮助别人。作为一名程序员翱翔在Eclipse的天空能够同时满足这两方面的需要,所以才会有那么多人乐此而不疲。当然,这里也有那些常见的宣传词,例如“提高生产力”、“紧跟市场”、“占据技术优势”——对于那些在其中工作的人,Eclipse是一个能够大幅提高生产力的环境,人们为Eclipse作出的贡献使它更臻完美;如果找到了合适的插件,产品上市的时间将大大提前,你将获得巨大的技术优势。但是,尽管这些都是事实,但它们都不是重点,它们都不足以解释:为何开发者们如此钟爱Eclipse。
我们喜欢在Eclipse环境中工作,是因为它给了我们无微不至的关怀:每当遇到编程问题时,总会有一项Eclipse功能帮助我们解决它。我们喜欢为Eclipse作出贡献,是因为做这件事给了我们助人的快乐——既是帮助自己,更是帮助别人。如果我们作出的贡献还为别人留下了发展的空间,使他们能够在此之上作出更多的贡献,一个正反馈循环就出现了,每个人都会在其中获得快乐。
“为Eclipse作贡献”甚至还可能成为一个精彩的商业计划——“贡献”并不表示你不能用你的成果赚钱。你可以在Eclipse基础上发布功能完备的产品,也可以发售针对现有产品的扩展插件。
Eclipse非常强大——不论从个人角度、专业角度还是社会角度来说都是如此。但是,要加入贡献者的圈子,你必须首先掌握大量的知识。我们希望本书能帮助你跨过这道门槛,开始为Eclipse作出贡献的旅程。
对于那些喜欢为别人编写开发工具的人来说,Eclipse既带来了好消息,也带来了坏消息。好消息是:Eclipse强大得令人难以置信,而且它的内部开发者都遵循创建Eclipse Java开发工具(JDT)时制订的那些准则,这使得它的结构清晰而优美。坏消息则是:Eclipse拥有一套完整的世界观,如果你希望在Eclipse的沙箱里玩得开心,就必须首先牢记它的准则。
打个不恰当的比方,初涉Eclipse的感觉多少有点像孤身一人在曼谷上空跳伞(这个比喻不适用于泰国程序员)。平安着陆之后,你需要食物和住所,但如何去得到呢?你应该如何利用身边的资源满足自己迫切的需要?
帮助你克服这种迷失感正是本书的首要目标。如果你和一名向导一起降落在曼谷,你就可以对他说:“我饿了。”而他会告诉你:“你可以在某地吃顿饭。”同样,如果你说:“我想实现这样一个功能。”本书会告诉你:“这应该是一个视角,那应该是一个Object Contribution,而那个功能则需要一个新的编辑器。”
即便读完本书,你还是无法获得Eclipse世界的完整地图,但对于任何基本的问题,你至少会知道一条解决的途径。你还会了解到一些准则,只有遵守它们,你才能和别人友好相处。这就好像我们为你画出一幅曼谷地图,在上面标出六条大街、一家饭店和一家宾馆。你无法从这张图上了解曼谷的一切,但靠着它已经足以在这个城市生存下来,足以开始了解更多的东西。
在学习Eclipse的过程中,你花在阅读代码上的时间会比编写代码多得多。你必须习惯于一天用六个小时读代码,再用一个小时写代码——你会发现这样的一天效率同样高得惊人。在习惯了Eclipse的文化之后,你会自然而然地“知道”如何解决越来越多的问题,但你同样会经常照搬其他方案的结构来解决类似的问题——可能是模仿Eclipse的结构,也可能是模仿你自己以前的解决方案。当我们与你一道走进书中的范例时,我们不会装出一副无所不知的圣贤模样——实际上,我们也记不住所有的细节。不过,我们会告诉你如何找到可供模仿的结构。学会充分利用Eclipse的搜索工具,这也是成为Eclipse贡献者所必需的一项技能。
本书不是为想要学习使用Eclipse的初学者准备的,我们希望读者至少熟悉Eclipse的常用术语——视图、编辑器,凡此种种。使用Eclipse一段时间之后,你很可能产生对它进行扩展的想法,那时这本书就该派上用场了。在筹备这本书时,我们发现可以讲的概念数不胜数。可是,如果我们把Eclipse所有的2000个知识点都写进去,恐怕就再也没人愿意看这本书了。为了留住你的目光,我们决定只介绍其中的50个知识点——对于刚迈进这个世界的你来说,这应该是最重要的50件事。在很多章节的最后,你可以找到我们为你准备的“前行的路标”。你可以跟随它的指引在代码中找到书中概念的延伸。实际上,在向别人传授Eclipse知识时,我们最常用的办法就是:“不妨去看看org.eclipse.core.runtime的源代码”。有这么一个故事:有个博士生马上要进行答辩,答辩的主题是“果实”。可是时间已经太紧迫了,他只来得及去了解黄瓜这一种果实。答辩开始了,第一个问题是:“请谈谈你对西红柿的了解。”“你看,”他说道,“西红柿是一种果实——跟黄瓜一样。黄瓜含有80%的水分,它的表皮能抵挡病虫害,可以用黄瓜来做沙拉。”就这样,尽管他不了解别的果实,但他成功地把每个问题都扯到了黄瓜上面。
我们也了解黄瓜。除了Eclipse之外,我们还有两条“黄瓜”:模式和JUnit。所以,贯穿这本书的始终,你会不断发现类似于模式的建议——实际上,一开始写这本书的时候,我们总觉得有点不舒服,直到我们开始写下一些“法则”;有了“法则”的概念之后,我们的写作就进展得顺利多了。说到底,这些法则其实就是微型的模式。 JUnit——我们的第二条“黄瓜”——则是运行所有示例的基础。1997年,在去亚特兰大的飞机上,我们俩花了几个小时开发出了JUnit的第一个版本。从那以后,我们的整个技术生活几乎都围绕着它。对于本书中的示例代码,JUnit是一个最理想的运行环境:你可以非常方便地运行所有测试,并一目了然地看到结果。
但是,我们必须给你一个忠告:如果你已经听厌了模式和JUnit,也许这本书并不适合你。