级别: 中级 Michael Galpin (mike.sr@gmail.com), 软件工程师, eBay
2008 年 4 月 22 日 Eclipse 已经成为世界各地的 Java™ 开发人员的首选集成开发环境 (IDE)。可是,Eclipse 绝对不可能适合所有的架构。其插件架构允许您添加所需的功能。这对于像 eBay 这样的大型企业来说甚至更为重要。这类企业都有非常特殊的需求。使用 Eclipse 不但可以轻松地根据需求调整解决方案,而且还可以轻松地在大型企业中扩展该解决方案。本文是 “面向 eBay 的 Eclipse” 两部分系列中的第 2 部分,我们将查看 eBay 的一些企业需求以及它如何使用 Eclipse 来满足这些需求。我们将主要介绍 eBay 如何使用 Eclipse,并且您可以在企业中使用类似的策略。
本文假定您基本熟悉 Eclipse。我们将讨论 eBay 开发环境(eBay Development Environment,EDE),这是基于 Eclipse V3.2 的并且要求使用 JDK V5.0 或更高版本(有关链接,请参阅 参考资料)。略微熟悉 Web 开发,包括 HTML、JavaScript 和 CSS 会很有用,但不是必需的。
eBay 的挑战
软件开发形式和规模各异。很多人喜欢从事软件开发。软件开发咨询也是项大业务。各种规格的企业也都进行软件开发。当您自己开发软件时,都会选取喜欢的工具。根据喜欢的方法编写代码。跟踪代码并可能定期执行一些备份。当开始处理其他事务时,事情就变得更棘手了。对于拥有上千人的企业,开发变得更加复杂。幸运的是,Eclipse 克服了这项挑战。它为标准化提供了一个十分强大的工具。不管企业规模有多大,其插件架构所提供的可扩展性都可以轻松地根据企业需求来调整功能。为进行演示,我们将查看 eBay 是如何使用 Eclipse 满足需求的。
eBay 企业
您几乎肯定听说过 eBay。每年都有数以百万计的人使用它买卖商品。eBay 市场是一个高度多元化的电子商务平台,每秒钟可处理大量交易。为了完成交易,eBay 雇佣了上千名软件工程师编写了上百万行代码。这样做带来几项挑战,例如管理大型开发、整合源代码管理和保证代码的一致性和质量。让我们逐个查看这些挑战并了解 eBay 如何使用 Eclipse 克服这些挑战。
大型开发
所有工程师都开发出大量代码。这些代码不是一次性代码。这些代码必须由开发它的同一个大型企业来维护。那意味着由一名开发人员编写的同一段代码通常是由许多其他工程师来使用和修改的。惟一的扩展方法是标准化 — 标准化代码组织方式、标准化编码约定和标准化工具。标准化一切可以标准化的内容。
拥有大型代码库的企业所面对的首批问题之一是如何组织代码。面对上千个包和类,必定存在令人难以置信的依赖关系。想象一下,仅仅是给项目设置正确的类路径就会非常困难。再想象一下,上千名开发人员这样做的目的只是为了开始工作。仅仅尝试获得要编译的现有代码以进行维护或构建就会浪费大量时间。
这个问题在 eBay 中是通过使用 Eclipse 插件进行自动化来解决的。eBay 使用一种拥有专利但是非常简单的 XML 配置机制来跟踪项目及其相互依赖性。每个文件都把代码组织到项目中并详细说明该项目依赖于哪些其他项目。清单 1 中显示了这类文件的示例。
清单 1. eBay 项目文件
<project
type='JAR'
path='v4samplecode'
javac.source='1.5'
javac.target='1.5'
hasV4Js='true'
hasV4Css="true"
>
<src>
<dir path='src'/>
</src>
<dependencies>
<project name='GlobalEnvironment'/>
<project name='DocumentFramework'/>
<project name='DarwinTestUtils'/>
<project name='DarwinCoreUtils'/>
<project name='DarwinCoreComponents'/>
<project name='DarwinCoreApp'/>
<project name='DarwinCoreAppResources'/>
<project name='V4DeCodeContent' />
<project name='DarwinTools' />
<project name='DarwinCodeGenImpl' />
<library name='DSF-Foo' />
<library name='EbayResources'/>
<project name='EbayUrlServices'/>
<library name='Darwin'/>
<library name='DarwinTests'/>
<library name='Dsf'/>
<library name='Kernel'/>
<library name="KernelTestAPI"/>
<library name='xml'/>
<library name='commons-jxpath'/>
<library name='icesoft-sdk'/>
<library name='junit'/>
<library name='servlet-api'/>
<library name='jsp-api'/>
<library name="jakarta-taglibs-standard"/>
</dependencies>
</project>
|
该文件允许 eBay 插件生成 Eclipse 项目(.project 和 .classpath 文件)和在类路径中引用其他 Eclipse 项目。很明显,这些文件极为重要,而且 eBay 已经创建了用于帮助编辑和呈现这些文件的插件。
图 1. 项目依赖性插件
XML 文件已被检入源代码控制(稍后会有相关介绍),然后 eBay 插件将创建所有 Eclipse 项目并把这些项目导入开发人员的工作区。人们可以单击一个按钮,如图 2 所示。
图 2. 开始构建
像工具提示建议的那样,构建插件将完成大量工作。
图 3. 构建插件信息
单击 OK 将创建并构建所有 Eclipse 项目。下面显示了一个相对较小的工作区示例。
图 4. 工作区中的项目
可以想象得到,如果工程师必须亲自设置所有这些项目只是为了能够创建一个项目,这会有多么痛苦。痛苦本身在于使用大型代码库的复杂度。eBay 解决方案并不是万能的。必须创建具有相互依赖性的大量项目,然后把所有这些项目构建到可交付内容中。eBay 插件只是自动执行所有这些工作。但是,如果您在大型项目中使用过 Eclipse,则知道即使将一切工作安排得井井有条也不能解决所有问题。仅仅是拥有大量文件和类就会变成一个问题。这是 eBay 在 Eclipse 插件的帮助下克服的又一项挑战。
Megajar
如上面所见,通过大型代码库最终得到使用大量类的项目十分简单。您是否曾经尝试过运行带有几十万个源代码文件的 Eclipse?这样做会对系统造成极大的负担,必须使用大量内存(是否曾经收到 Eclipse 抛出的内存不足异常?)并导致所有进程都运行得极为缓慢。在这样的系统中,链接到经过编译的代码而是实际的源代码会好得多。这是使用 eBay 所谓的 Megajar 来完成的。
这个想法实际上非常简单。假定您的项目与大约十二个其他项目存在依赖关系,这些项目都有自己的依赖性树。您不打算更改任何一个项目。只是要依赖这些项目来构建您的项目。因此需要做的是把所有源代码编译成一个 JAR。您不希望失去能够从 Eclipse 中访问这些代码的 JavaDoc 的优点,但是使用 Eclipse 可以轻松地把源代码与针对该目的的 JAR 关联起来。
这是 Megajar 的工作原理。只要提供需要构建的代码集,eBay 构建系统就会给您提供相应的 Megajar。该构建插件随后将针对 Megajar 而不是源代码构建工作区。当然,这都是由 Eclipse 插件来完成的。有一个 Megajars 视图,如图 5 所示。
图 5. Megajars 视图
单击 Megajar 图标将启动 Megajar 进程。您将看到一个信息框,告诉您将要发生的操作。
图 6. 信息框
这个一次性步骤可能会花费一段时间,但是绝对物有所值。它消除了计算机的过重负担并可以更快地构建和部署系统。它既节省了时间,又使开发人员免于忍受速度很慢的系统。它很简短,它实际上从代码组织的角度帮助完成大规模代码库。eBay 团队已经创建其他一些工具来帮助开发人员使用大型代码库。这些工具将使用可视化来使 eBay 开发人员可以轻松地处理大型代码库。
管理范围:可视化工具和搜索工具
在任何一个软件应用程序中,都有某些具有特别意义的文件/类。即使涉及的代码具有大量的类,这种说法也是正确的。主要差别是这些类变得更难查找。幸运的是,这类型问题可以通过工具解决。
在 第 1 部分 中,我们讨论了 eBay 的 V4 架构。这是 eBay 为克服开发大型 Web 应用程序的挑战而开发的前端框架。V4 中的重要构造之一称为应用程序规范。一个项目可以创建许多 Web 页面,每个页面都有自己的内容、CSS、JavaScript 等。所有这些多样的页面和资源都会导致出现大量类,但是可以有一个应用程序规范。幸运的是,eBay 已经为查找和管理这些类构建了一个工具:下面显示了应用程序浏览器(Application Explorer)。
图 7. eBay Application Explorer
Application Explorer 可以快速识别给定项目中的应用程序规范并显示每个应用程序规范的可视化元数据。只需在普通 Eclipse 浏览器中的项目上右键单击就可以访问它。
图 8. V4 上下文菜单
应用程序规范是 V4 架构中非常高级的对象。应用程序可以有多个页面。每个页面都可以使用低级别 API 构建,添加 div、span、表单等内容。但是,V4 是一个组件架构,而且大多数页面实际上都是通过此类组件来构建的。
重用组件将提高 eBay 开发人员生产率。组件重用有几个要点。很明显,必须将组件设计为可以在各种场景中重用。还需要为此类组件准备一个大型目录。容易忽略的另外一个要点是需要能够找到所有这些组件。同样,eBay 通过创建 Eclipse 插件 —— 组件浏览器(Component Viewer) —— 满足了这个需求,如下所示:
图 9. Component Viewer
浏览器显示了 Eclipse 工作区中的所有项目的所有组件(按项目组织)。使用浏览器可以浏览查找所需的组件,然后可以使用项目依赖性插件(参见图 1)并根据需要调整项目依赖性。
使用 Component Viewer 可以帮助查找 eBay 应用程序中使用的特定类型的类。eBay 已经构建了工具来解决更加普遍的问题 —— 查找类(特指库类)。eBay 工程师绝对相信 DRTW(不要重复发明轮子,Don't Reinvent The Wheel)并积极利用了开放源码库。这样做会导致使用大量库和大量库类,从而难于进行类查找,同样,一个 eBay 插件可以提供帮助:JAR 浏览器。
图 10. JAR 浏览器
这些工具帮助开发人员找到所需类并使用可视化来方便查看。它们都是 eBay 为帮助 eBay 开发人员所编写的 Eclipse 插件。但是,eBay 所使用的其他有价值的 Eclipse 插件有许多都不是 eBay 编写的。有大量插件可用于 Eclipse,通过识别满足特定需求的现有插件,您可以进一步推动企业。让我们看看 eBay 使用的一些插件。
利用其他 Eclipse 插件
您的企业一定具有专门的需求。Eclipse 为创建满足这些需求的插件提供了一个平台。我们已经了解了对于诸如 eBay 之类具有各种需求的企业来说这是怎样一种情况。您的所有需求并不都是完全特定于您的。在许多情况下,需求可能非常特殊化,但是对于其他企业来说也可能十分常见。在这种情况下,很可能已经存在满足了这些需求的 Eclipse 插件。此外,我们将看到这个推断对于 eBay 来说是多么正确,但是并不是只有 eBay 才能够使用 Eclipse 及其插件系统。
eBay 的开发人员所做的工作都是世界各地的开发人员常做的。他们需要使用应用服务器。在 eBay 的案例中,应用服务器是 IBM® WebSphere® Application Server Community Edition(实质上是 Apache Geronimo)。很自然地,eBay 将利用 Eclipse Web Tools Project (WTP),使用诸如服务器视图之类的插件来管理和部署应用服务器,如下所示:
图 11. EDE 中的标准服务器视图
您可能已经注意到 Megajar 对话框(参见图 6)带有一条关于 “recycling the server” 的消息。这就是我们讨论的服务器。WTP 的开源本性使 eBay 的自有插件可以与 WTP 交互来自动创建预配置的服务器实例。开发人员不会在这类任务上浪费时间。对于 Web 开发人员来说,在服务器上运行代码是一项常见任务。
对于任何规模的企业中的任何一名开发人员来说,另一项常见任务是管理源代码。让我们看看对于像 eBay 规模这样大的企业管理源代码的方法及 Eclipse 所扮演的角色。
集成源代码控制:Rational ClearCase 插件
源代码管理是一个众所周知的问题,而且有许多解决方案。Eclipse 附带了 CVS 支持。在 eBay 中使用了 IBM Rational® ClearCase®。EDE 附带安装了 ClearCase 插件,如下所示:
图 12. ClearCase 插件
集成 ClearCase 之类的工具是使用像 Eclipse 一样的 IDE 的主要原因。该插件将通过源代码管理工具使您可以轻松地检入和检出文件,实现您想要的一切。
图 13. ClearCase 插件上下文菜单
无论您的企业选择哪种源代码管理工具,都可以使用适合该工具的 Eclipse 插件。这是除 Java 开发之外令 Eclipse 人气飙升的原因之一。大型系统的源代码控制会十分困难,但是 Eclipse 中集成的源代码管理确实提供了帮助。eBay 这种规模的企业面临的另外一项任务是管理源代码的一致性。这是可以使用 Eclipse 插件解决的另一个具有挑战性的领域。
增强编码标准:FindBugs
静态分析是许多企业都使用的很有价值的工具,可以帮助管理大型代码库。FindBugs 开源项目是一个适用于 Java 代码的流行的静态分析工具,当然,存在一个适合它的 Eclipse 插件。eBay 就像使用任何一部分源代码一样使用了该开源项目。FindBugs 被集成到 EDE 中,以便开发人员可以亲自运行它并解决它找到的所有问题。对类、包或项目运行 FindBugs 非常简单。
图 14. FindBugs
FindBugs 将识别许多常见问题的根源。查看一下清单 2。
清单 2. 有错误的代码
import java.util.HashSet;
import java.util.Set;
public class DataStruct {
private int id;
private String code;
public DataStruct(int id, String code){
this.id = id;
this.code = code;
}
public boolean equals(DataStruct other){
return (this.id == other.id &&
this.code.equalsIgnoreCase(other.code));
}
public int hashCode(){
return 1000*id + code.hashCode();
}
public static void main(String[] args) {
Set<DataStruct> data = new HashSet<DataStruct>();
data.add(new DataStruct(24, "ESX"));
data.add(new DataStruct(24, "ESX"));
System.out.println(data.size());
}
}
|
运行主方法时发生什么情况?您可能期望它输出 1,但是却输出了 2。为什么会这样?运行 FindBugs 来寻找一些蛛丝马迹。
图 15. FindBugs 结果
FindBugs 显示,我们定义了 equals(DataStruct) 方法,但是我们的类仍然使用 Object.equals(Object)。我们需要覆盖 Object.equals(Object),但是却搞乱了方法签名。这类 bug 很容易出现,但是 eBay 则很少遇到这个问题,因为 eBay 明智地使用了 FindBugs。
结束语
我们已经看到了 eBay 如何使用 Eclipse 克服了它所面临的许多挑战。这些挑战中有许多都是特定于 eBay 环境的。它一直是发布新软件(Web 应用程序)的大型开发企业。Eclipse 使 eBay 可以开发满足这些独特需求的插件。并不是所有需求都是 eBay 专有的,而且任何人都可以获得大量 Eclipse 插件帮助满足这些更常见的需求。您的企业可以遵循相同模式开发自己专用的插件和利用现有插件。通过使用 Eclipse,这些技术可以提高企业的生产率。
参考资料 学习
获得产品和技术
讨论
关于作者  | 
|  | Michael Galpin 从 1998 年就开始进行专业的软件开发。他拥有加州理工学院的数学学位,现在是位于 San Jose, CA 的 eBay 的工程师。 |
对本文的评价
|