|
class=atitle2>为何考虑 Eclipse 以及它与 Borland JBuilder Foundation
有什么不同
href="http://www-900.ibm.com/developerworks/cn/opensource/os-ecjbuild/#author1"><NAME>David
Gallardo</NAME> ( href="mailto:david@gallardo.org">david@gallardo.org) 软件顾问 2004
年 9 月
很多程序员都正在转向 Eclipse 这个日益流行的开放源代码开发环境。本文是为那些熟悉 JBuilder
而又正在考虑迁移到 Eclipse 的程序员编写的。本文首先简要对 Eclipse 3.0 和免费的 JBuilder X Foundation
版本进行比较,然后展示了在 Eclipse 中如何实现基本的功能。
Eclipse --
开源的选择 Eclipse 是一个开源的、可扩展的集成开发环境,最近已经吸引了业界的很多注意力。Eclipse
的支持者源源不断,当其他 IDE(例如 JBuilder)中具有某些特性而 Eclipse
中没有这些特性时,这些支持者就会感到沮丧,并想法开发这些特性。开发软件的大部分(但不是全部)工作都是编写代码。不管一个
IDE
提供了多少特性,如果它只提供基本的功能,那么它将不会给程序员带来太多帮助。这就是为什么很多程序员长期以来宁愿选择使用简
单的文本编辑器,而不愿使用
IDE。
有趣的是,很多早期采用 Eclipse 的用户都是从文本编辑器上迁移过来的,而不是从其他 IDE
上迁移过来的。当然,这就解释了为什么他们并不介意功能的缺乏。对于很多人来说,这是他们使用的第一个 IDE,这并没有简化他们
的开发任务。IBM 附属的
OTI 是一个非常优秀的面向对象的技术公司,已经花费了 4 千万美元来开发 Eclipse,然后将其捐赠给了开源社区。
更有趣的问题是 Eclipse 是否与其他花钱的 IDE 一样好。
答案非常确定。首先,这取决于您想要用它来做什么。如果您只需要进行基本的开发,就没有必要继续往下看了。对于编码、调试、重
构、单元测试等等,
Eclipse 可以与任何一种 IDE 匹敌,甚至比它们还要好。与免费的 JBuilder X Foundation 版本类似, Eclipse
也有代码补足、代码模板的功能,以及对重构、Ant、CVS 和 JUnit 的支持。实际上,您可能会发现 Eclipse 对很多特性的支持都比
JBuilder 更好。例如, Eclipse 具有更多的重构功能,能够更好地支持将本地代码与 CVS 服务器进行合并。
除了这些基本功能之外,还取决于您需要哪些特性,这方面的故事就有些更为复杂了。Eclipse
的优点之一就是它的源代码是开放的,可扩展性很好,可以扩充很多插件,开源插件和商业插件都可以用来扩充 Eclipse。如果您需要
基本的 Eclipse
IDE 所不具备的特性,一般都可以找到您需要的插件。大部分情况下,您都可以找到免费的插件,至少可以完全实现您想要的功能 --
例如,对于 Web 和
J2EE 的开发,通常都能找到这种插件。(请参阅 href="http://www-900.ibm.com/developerworks/cn/opensource/os-ecjbuild/#resources"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/" trackclick="no">参考资料
中关于在 Structs 和 Web 应用程序开发中获取、安装并使用插件的文章。)
除了免费的插件之外,您还可以找到很多用于 Eclipse
的价格适中的商业插件。如果您只需要一部分高级特性,但却无法找到满意的免费插件,就可以从第三方供应商那里购买这些插件,而
不用去购买完整的企业 IDE
包,这样会更经济。由于 Eclipse 的流行性和开源特性,它已经在 IDE 领域成为一把尖刀 -- 拥有数百种插件,既有免费的,也有商
业的。访问
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/" trackclick="no">Eclipse
插件主页 可以找到大部分 Eclipse 插件。
现在我们要特别介绍一下 Eclipse 3.0 在开发时缺少一种特性,而 JBuilder
在很早以前就具有这种特性了:构建用户界面的可视化工具。这种特性现在正在被积极地开发。Eclipse Visual Editor (VE)
release 0.5 可以支持 AWT/Swing,现在可用于 Eclipse 2.1.x 的版本,并且很快就可以用于 Eclipse 3.0,
release 1.0 了,不过在您阅读本文时可能还不可用。VE 1.0 会作为一个独立软件在 Eclipse 网站上提供下载,它不但可以支持
AWT/Swing,而且也可以支持 SWT。要了解有关 VE 的更多信息,并想体验一下 VE,请参阅 href="http://www-900.ibm.com/developerworks/cn/opensource/os-ecjbuild/#resources"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/" trackclick="no">参考资料
中的文章 "Building GUIs with the Eclipse Visual Editor."
开始体验 Eclipse Eclipse
与其他 IDE 稍有不同,因为它引入了一个新的对用户界面进行抽象的层次: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">视角(perspective)。最终您会发现这个概念会贯穿
Eclipse 的各种丰富特性:它删除了与手头任务无关的选项,从而让您可以集中注意力于要做的事情。
为了方便说明,我们还需要再介绍一些 Eclipse 术语。Eclipse 开发环境(即 Eclipse 主窗口内的全部内容)称为 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">工作台(workbench)。在这个主窗口中,有各种各样的面板,称为
xmlns:dw="http://www.ibm.com/developerWorks/">视图(View),视图中可显示控制台的输出、项目的概要信息等等。多个视图
常常堆叠成记事簿的形式,可通过标签页来选择。除了视图之外,工作台中还有一个特殊的面板,称为
xmlns:dw="http://www.ibm.com/developerWorks/">编辑器(editor),这个地方可以编辑各种不同类型的文档,如源代码等。
到此为止,我们对 Eclipse 工作台的描述听起来和 JBuilder
也没什么不同。当您执行不同的任务(如编码、调试、或是将代码的变更合并到中央代码库)时,您可以使用针对这种任务的特殊窗口
排列方式。这些特定于任务的窗口排列方式称为
xmlns:dw="http://www.ibm.com/developerWorks/">视角(perspectives)。它十分类似于
JBuilder 中编辑器下面的标签页功能,只不过在 Eclipse 中,整个工作台都可以改变,包括主工具条和菜单。
最基本的视角,是 Eclipse 启动时关闭最初的 Welcome 屏幕之后看到的那个,它称为 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">资源(Resource) 视角,如图 1
所示。
图 1. Eclipse Resource 视角
alt="Resource 视角"
src="http://www-900.ibm.com/developerworks/cn/opensource/os-ecjbuild/1-resourceperspective.gif"
width=600 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">
关于视角 与 JBuilder
类似,Eclipse
中的资源视角也有一个面向树的视图,称为导航器(Navigator),它位于工作台左上角(显然现在那里什么都没有,因为我们还什么都
没创建呢),可实现资源的导航和关联。最初,资源视角还有两个其他的视图——导航视图之下有一个大纲(Outline)视图,主编辑器区域之
下有一个任务(Task)视图。
Eclipse
对视图和编辑器进行了极为重要的区分。一个视角可以有多个视图,但是只能有一个编辑器,这个编辑器就是工作台的焦点所在。从一
般意义上讲,如果您在编辑器中打开了某个文件,那么其他的视图反映的都是这个文件不同方面的信息。如果打开的是
Java 文件,现在所在的是 Java 视角,那么其中一个视图,即 Package
Explorer,将向您展示该文件的物理位置和包层次关系,而另一个大纲视图将展示该类的方法和属性。如果您有多个 Java
文件,那么随着您在编辑器中切换不同的文件,这些视图也跟着发生变化。
即使我们可以很容易地打开新的视角,并在这些视角之间切换,但一般情况下也不必这样做,因为在您工作过程中,视角会在适当的
时候自动发生变化。(当然,Eclipse
会首先很有礼貌地征求您的同意。)稍后我们创建 Java 项目并调试 Java
程序时,您就能看到这一点。一旦您熟悉了视角的用法,您就会发现这种工作方式原来是如此的流畅和自然,它能够消除不适应当前任
务的所有 UI
组件,包括工具条按钮、菜单、视图等等。这样,我们就能更容易地找到相关的工具。
在 Eclipse
中创建新的项目 要开始使用 Eclipse,您必须首先创建一个项目。当您第一次使用 Eclipse 时,系统会要求您确认
workspace 目录的位置(假定您没有通过命令行参数指定),如果该目录不存在,Eclipse
将为您创建一个。缺省情况下,您的所有信息(包括 Eclipse 需要的特定信息,Java 源文件和类文件、图像等等),都保存在这个
workspace 目录下的子目录或文件夹中。这个目录下的每一个文件夹都对应一个项目,通常包含一个独立的应用程序,一
个
Web 应用程序,或其他类型的组件。
尽管我们推荐您在项目中使用这个工作空间,它能够更好地组织项目,不过 Eclipse 3.0
还是引入了在工作空间之外创建或指定已有目录作为项目文件夹的功能。如果您是从别的 IDE 迁移过来的,原来的 IDE
可能并没有严格限制目录的结构,这时该功能将极为有用。
如果您以前没用过 Eclipse,又想跟上潮流,就马上开始使用吧(如果您尚未安装 Eclipse,可参阅 href="http://www-900.ibm.com/developerworks/cn/opensource/os-ecjbuild/#resources"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/" trackclick="no">参考资料
中的“Getting Started with the Eclipse Platform”一文。)第一次运行 Eclipse 时,可看到
Welcome
屏幕。这个屏幕引导您打开教程和其他一些有趣的信息,您可以让这个屏幕重现,也可以通过点击顶部标签中的“X”将其关闭;还可以
通过从主菜单中选择 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">Help > Welcome
重新调出该屏幕。
如前面图 1 中所示,现在您所在的是资源视角。在 Eclipse
中,完成一件事情的方法永远不止一种,您可以用快捷键、工具条、也可以通过菜单进行选择,但在本文中,我们通篇都使用菜单。这
里,我们将用上下文菜单创建一个项目,如下所示:
xmlns:dw="http://www.ibm.com/developerWorks/">
- 在资源视角中,在导航器视图上点击右键,然后选择 New > Project。
- 在 New Project 向导中选择 Java Project。
- 为该项目输入一个名字,比如说“Hello”
- 请注意,在 Location 部分中,您既可以通过选择外部位置创建项目,也可以接受缺省的设置“Create project in
workspace.”
- 接下来,在 Project Layout 部分中,接受缺省的选择“Use project folder as root for
sources and class files”。一般情况下,最好使用独立的目录(通常是 src 和
bin),但目前为了简化问题,我们简单地接受缺省值。
- 这时如果点击 Next,就会将本项目所依赖的类库和其他项目加入到 classpath
中,不过我们并不需要这样做,因此直接点击 Finish。
- 稍后,Eclipse 会问,“This kind of project is associated with the Java
Perspective. Do you want to switch to this perspective now?”,选中“Remember
my decision”复选框,然后点击 Yes。
现在,我们已经创建了一个项目,可以创建类了。我们将创建一个标准“Hello, world”程序的变种。
xmlns:dw="http://www.ibm.com/developerWorks/">
- 用右键点击 Hello 项目,然后选择 New > Class。这将打开 New Class 向导。
- 输入
com.example.hello 作为包的名称。
- 输入
HelloObject 作为类的名称。
- 保持
java.lang.Object 作为父类。
- 确认选中了为
main() 方法创建存根的选项。
- 点击 Finish。参见图 2。
尽管我们推荐使用工作空间,这样可以将工作组织得更好,但 Eclipse 3.0
还是引入了在工作空间外创建或指定已有目录作为项目文件夹的功能。如果您是从不严格要求目录结构的 IDE 迁移过来的,这一功能就
特别有用。
图 2. HelloObject 类
alt=" HelloObject 类"
src="http://www-900.ibm.com/developerworks/cn/opensource/os-ecjbuild/2-javaperspective.gif"
width=600 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">
创建这个类之后,您会发现一些不同的东西。首先,文件中出现了一些 To Do
项,这是由于我们需要对生成注释的模板进行定制。这些注释与其他注解(如书签、断点、语法错误等)一样,都由编辑器的左边框上
的一个符号指出。稍后,您应该根据系统的指示对代码模板进行修改,但现在就保持这样好了。
您还应该注意到,对应于左边一栏的每一个符号,右边一栏中都有一个相同颜色的小框。左边框标识的只有当前编辑器中可见的东西
,而右边框则显示出文件中标记的内容。如果您的文件很长,而它最末尾处有一个错误,那么不论编辑器中显示的是文件的哪一部分,右边框
中都会在底部显示一个小红框;点击这个小框就能到达错误所在的地方。
除了最左边框上的复选标记符号之外,紧接着这些标记右边的一栏中还有一些小的三角形,这一点和 JBuilder 一样,它们可以控制
代码的折叠情况。
图 3. 代码折叠和 To-do 项
alt=代码折叠
src="http://www-900.ibm.com/developerworks/cn/opensource/os-ecjbuild/3-codefolding.gif"
width=439 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">
当您在 Eclipse
中操纵代码的时候,还会注意到在左边框上注解和代码折叠控制符之间有另外一栏。这一栏中包含了一些彩色的横条,可以将当前代码
与前一个版本进行比较。这一特性称为
QuickDiff。稍后您可以自己钻研一下。
class=atitle3>语法检查和代码补全 我们需要增加一些代码,这样就可以实际演练了。您将看到,Eclipse
提供了与 JBuilder 的 CodeInsight、ClassInsight 以及其他一些特性相同的功能,可帮助您编写源代码。
在 main() 方法中加入一行代码,创建名为 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">names 的 Vector。因为您尚未导入
Vector 类,这时在左边框中就会出现一个似曾相识的符号,即一个带叉“X”的红框,再加上一个黄色的灯泡。如果您稍微斜视一下,
甚至还可能误认为这就是
JBuilder 所使用的金色钥匙加带红圈的惊叹号。请参见图 4。)
图 4. 问题与 QuickFix
alt="问题与 QuickFix"
src="http://www-900.ibm.com/developerworks/cn/opensource/os-ecjbuild/4-vectordef.gif"
width=500 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">
“X”当然意味着存在问题,但是灯泡表示 Eclipse 能提供 QuickFix:即解决此问题的一条或多条建议。您可以点击这个灯泡,也
可以点击
Vector,然后按 Ctrl-1(QuickFix 快捷键)。这时出现一个弹出菜单,其中列出了可能的修改方案,包括:“Import
Vector”、“Rename in File”以及“Create Class Vector。”您可以在第一条建议上双击,让 Eclipse
为您增加一条 import 语句。
当确认 Vector 已经导入之后,就可以在下一行中输入 names。这时您可以用代码补全功能,为 Vector names
增加适当的方法。
Eclipse 中的代码功能与 JBuilder 中的非常类似,但缺省状态下这里的要慢一些。当您输入 names
之后的点号时,必须等待几秒才能出现一个方法名的清单。(这是因为如果您输入的很快,Eclipse 将试图等到您输入完毕。您可以通
过从主菜单中选择 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">Windows > Preferences
> Java > Editor,改变自动激活延迟的毫秒数。)如果您需要系统的建议,并且不想等待,还可以按
Ctrl-Space,这样就可以立即看到选项清单。如果您忘记了所需方法是什么名字,那么代码补全就十分有用,您不用再想到底是
put() 还是 add()?
当然,您需要的是 add(),当您从清单中选择单个参数的版本时,您会注意到 Eclipse
不仅仅补全了方法的名称,还添加了开始和结束两个括号,并将光标置于括号之间,在结束括号后面画了一条绿线(与光标类似)。当
您在 Eclipse
中输入代码的时候,会经常看到这条绿线。虽然您可以忽略它,它似乎也没有明显的作用,但是它还是值得我们花几分钟来解释一下的
。如果您稍后编写自己的代码补全模板(这在
Eclipse 中是十分容易的东西),您就可能用到这个特性。
在 names Vector 中加入硬编码的字符串“Moe”。当您输入第一个引号时,Eclipse
立即提供了后一个引号,并将光标置于两个引号之间,还在第二个引号之后提供了一个插入点。当输入完 Moe 之后,按 Tab
键就可以越过第二个引号。第二个括号之后的第一个插入点现在又重新出现了。再次按 Tab
键,可移到语句的末尾,输入一个分号。
与此类似,可以为 names Vector 再增加两个名字,Curly 和 Larry。这时的代码如下:
border=1>
public static void main(String[] args) {
Vector names = new Vector();
names.add("Moe");
names.add("Curly");
names.add("Larry");
}
}
|
Eclipse 代码补全机制中最好的功能之一就是它能够感知代码所在的上下文。看这儿,如果您输入 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">for,再按
Ctrl-Space,就能看到若干条选项,其中一个是在一组数据上进行迭代。选择该选项,names 向量的迭代代码就插入进来了,如图 5
所示。
图 5: 在一组数据上迭代的 for 循环
alt="图 5: 在一组数据上迭代的 for 循环"
src="http://www-900.ibm.com/developerworks/cn/opensource/os-ecjbuild/5-forloop.gif"
width=600 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">
请注意,Eclipse 所加入的每个标识符的第一个实例都由一个框包围起来。如果您改变了其中一个,Eclipse
就会改变这个标识符的每一次出现。如果您将 iter 改为
i,另一个实例也会自动随之改变。在这里您唯一需要修改的东西就是输入 String,但是您也可以将
xmlns:dw="http://www.ibm.com/developerWorks/">element 改成 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">name。按下 Tab 和 Shift-Tab
可在每一个实例之间切换。修改完毕之后的代码如下所示,其中还调用了一个尚未出现的方法 greet():
border=1>
for (Iterator i = names.iterator(); i.hasNext();) {
String name = (String) i.next();
greet(name);
}
|
接下来,用 Eclipse 的 QuickFix 为 greet() 生成一个方法存根,然后为存根加入代码。方法是在
greet 上点击,并按 Ctrl-1,如下所示:
border=1>
private static void greet(String name) {
System.out.println("Hello, " + name);
}
|
这时,代码中应该没有错误。用右键点击编辑器,然后从弹出菜单中选择 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">Save。
class=atitle3>程序的运行及调试 前面提到过,Eclipse 使用的是增量编译器,所以没必要显式地编译您的
Java 文件。当您保存 Java 文件时,就会同时保存编译后的类文件。若要执行程序,可从编辑器中或在 Package Explorer 中选择
Java 文件,然后从 Eclipse 主菜单中选择 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">Run > Run As > Java
Application。(请注意,它与 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">Run > Run...
的菜单选项不同,下面将看到后一个选项。)这样应该会在编辑器下面的控制台视图中产生如下的输出信息:
border=1>
Hello, Moe
Hello, Curly
Hello, Larry
|
在调试器中运行简单程序的方法也类似。首先,双击(不是 JBuilder 中的单击)左边的边框,在 main()
方法调用 greet() 的地方设置断点。如果您想设置条件断点(即在 i==2
为真这类条件成立时,或是当运行特定次数之后停下的断点),可用右键点击断点,然后从上下文菜单中选择 Breakpoint 属性。
要开始调试,可从主菜单中选择 xmlns:dw="http://www.ibm.com/developerWorks/">Run > Debug As > Java
Application。由于 Eclipse 有一个调试视角,它比 Java
视角更适合进行调试,因此系统会问您是否需要切换到该视角中。选中“Remember my decision”选项,然后点击 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">Yes。如图 6 所示。
图 6. Debug 视角
alt="Debug 视角"
src="http://www-900.ibm.com/developerworks/cn/opensource/os-ecjbuild/6-debugperspective.gif"
width=600 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">
您将看到,调试视角中的视图与 JBuilder 中类似,但由于在这个视角中,整个 Eclipse
工作台都是专门进行调试工作,因此您不需要为了查看变量、调用堆栈和输出终端等信息而在不同的标签页之间切换。
还要注意,调用堆栈是在一个称为调试(Debug)的视图中显示的(不要与包含这个视图的调试视角相混淆),其中的工具条上有工
具按钮(如 step
over、step into
等),可控制执行的过程。这些控件和调用堆栈一起放在这儿的理由是,如果您同时调试的不止一个程序(或一个程序的多个实例),
或是这个程序由多个线程组成,那么您就可以通过在调用堆栈中选择不同的程序或线程来实现控制。如果您喜欢,也可以再次启动例子程序,
不必终止第一个实例。
有时候您不想(或不能)用从 xmlns:dw="http://www.ibm.com/developerWorks/">Run > Run As > Java
Application 菜单中选择的方法简单地运行程序。如果您需要给程序传入参数,或是选择它运行的虚拟机,那么就应该使用 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">Run > Run...
菜单项。这样将打开一个对话框,供您设置运行选项,如图 7 所示。
图 7. Java 启动配置
alt="Java 启动配置"
src="http://www-900.ibm.com/developerworks/cn/opensource/os-ecjbuild/7-launchconfig.gif"
width=600 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">
class=atitle2>再论资源视角 视角的好处之一在于它能使您的屏幕不陷入混乱。您可能已经注意到了,Java
视角的 Package Explorer 中不包含类文件。假设 Eclipse 能够编译您的 Java
文件(如果不能也会告诉您的),那么您不需做任何工作就可以完成程序的构建、运行和调试。但是一旦上述工作结束,您还要把类文
件拷贝到另一个目录中,或进行压缩,通过邮件发送给其他人。
一种实现方法是在 Eclipse 外部进行,因为您知道 workspace
目录在何处,这个目录,以及您的项目文件所在的 Hello 子目录没有任何特别之处。但是您也可以在 Eclipse
内部实现,方法是从主菜单中选择 xmlns:dw="http://www.ibm.com/developerWorks/">File >
Export。但是首先,您需要返回资源视角,这样才能看到全部的文件。最简单的切换方法是点击工作台右上角的资源视角按钮(请
参见图
8)。
图 8. 切换回资源视角
src="http://www-900.ibm.com/developerworks/cn/opensource/os-ecjbuild/8-openresourcepersp.gif"
width=292 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">
在这里您将看到 Java 视角中隐藏起来的一些文件,包括:类文件 HelloObject.obj 以及两个
Eclipse 用于保存项目信息的元数据文件 .project 和
.classfile。压缩类文件的方法是:
xmlns:dw="http://www.ibm.com/developerWorks/">
- 在
HelloObject.class 上点击并选中。
- 从主菜单中选择 File > Export。
- 选择 ZIP 文件作为导出目的地,然后点击 Next。
- 下一屏幕中应该已经选中了要压缩的文件;在题为“To zip file:”的字段中浏览或输入路径,以及要创建的压缩文件的名字,
然后点击
Finish。
重构 Eclipse 与 JBuilder
类似,其中一个最强大的特性就是对代码的重构能力。虽然 Eclipse 的重构功能比 JBuilder 更多,JBuilder 也有一两个
Eclipse 不具备的特性,但两者都具备了最重要的重构特性。有关 Eclipse 中(以及一般意义上)重构功能的更多信息,请参阅 href="http://www-900.ibm.com/developerworks/cn/opensource/os-ecjbuild/#resources"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/"
trackclick="no">参考资料中列出的“Refactoring for everyone”。
如果您熟悉了 JBuilder 中的重构,就会发现 Eclipse 中的重构从本质上说也是相同的,只是 Eclipse
用了一个向导来指引您完成重构过程。使用了这个向导,您就有机会用 Eclipse 中最强大的比较对话框,看看 Eclipse
将要作出哪些变更,对每一项变更都可以接纳或否决。
我们将很快地介绍一个相对简单的重构功能:改变方法的签名(Change Method Signature)。我们将用这项功能来改变例子程序的
greet() 方法中 String 参数的类型,将其变成 Object,并新增加一个
String 类型的参数,供 greet 打印。实现方法如下:
xmlns:dw="http://www.ibm.com/developerWorks/">
- 先在编辑器或大纲视图中用右键点击方法名称,选择
greet() 方法。
- 从上下文菜单中选择 Refactor > Change Method Signature...。(请参见图 9)
- 在题为 Parameters 的表格中,点击
String 类型,并将其更改为
Object。
- 将参数的名称改为
object。
- 在右边的 Add 按钮上点击;这样将在已有的参数中增加新的一项。将其类型改为 String,名称为
greeting,缺省值为“Welcome”。
- 我们希望新的 greeting 参数是第一个参数;确认它依然是选中的参数,然后点击 Up 按钮。(还可以选择原来的参数,然后点
击
Down 按钮。)
图 9. 改变方法的签名
src="http://www-900.ibm.com/developerworks/cn/opensource/os-ecjbuild/9-methodsig.gif"
width=445 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">
像 Eclipse 中所有的重构一样,这时您面临两个选择。第一个您可称为“Just Do It”。通常 Eclipse
的重构都是正确的,只有少数情况不对,这时您总是可以通过 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">Refactor > Undo
菜单将重构操作取消。(这项功能只在重构之后一段时间内有效。如果您改变了其中任一文件,就不能再取消重构了。)如果您觉得这
样不错,就可以点击 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">OK。通常情况下这是最简单的方法,不过现在不是。
第二个选择可称为“I want to micromanage”,让我们来看看这个有趣的选项。通过点击 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">Preview,Eclipse
将向您展示一个对话框,您可以在对话框顶部所有受影响的文件中选择特定的变更,然后并排、前后对比所选的文件。(在本例中当然
只有一个文件。)这时您可以逐个文件、逐项变更检验将要进行的重构,并分别批准或拒绝每一项变更。请参见图
10。选中所有的变更,然后点击 xmlns:dw="http://www.ibm.com/developerWorks/">OK。
图 10. 源代码比较对话框:重构前后
alt=源代码比较对话框:重构前后
src="http://www-900.ibm.com/developerworks/cn/opensource/os-ecjbuild/10-refactoringdiff.gif"
width=600 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">
下面是重构之后代码的情况:
border=1>
public static void main(String[] args) {
int x = 100;
Vector names = new Vector();
names.add("Moe");
names.add("Curly");
names.add("Larry");
for (Iterator i = names.iterator(); i.hasNext();) {
String name = (String) i.next();
greet("Welcome, ", name);
}
}
/**
* @param greeting TODO
* @param object
*/
private static void greet(String greeting, Object object) {
System.out.println("Hello, " + object);
}
|
注意到重构过程除了改变方法本身,还更新了 main() 方法中的 greet()
调用,并且第一个参数使用了缺省值 “Welcome,” "。如果项目中有其他文件也调用了
greet(),那么就应该以相同方式改变。
如果您现在运行这个程序,得到的结果与以前完全一样,这一点所有正确的重构都应该做到。我们所获得的是打印信息,以及在每一
次调用
greet() 方法时使用不同问候语的能力,但是后者需要我们自己实现功能代码,可将
System.out.println() 改成下面这样:
border=1>
System.out.println(greeting + object);
|
稍后我们可能还想改变打印对象的方式,要根据对象类型进行打印。这对于字符串很容易,但如果是其他类型,该对象首先应该用对
象的
toString() 方法转换成字符串。有时这样做的结果不是我们所期望的。
CVS 尽管 JBuilder 和
Eclipse 都支持 CVS 及其他版本控制系统,但 Eclipse 通过两种独立的视角提供了更加详尽的接口。第一种是 CVS
库浏览视角,可选择链接哪个 CVS 库和模块,并浏览其中包含的文件。第二种是组同步视角,可将变更合并到库中。尽管这样使得 CVS
最初较难使用,但是这种方法鼓励人们建立有序的结构化工作流。
另一个不同之处在于 Eclipse 对于所支持的 CVS 库类型限制非常严格。首先,它不支持本地库;也就是说,它不能直接访问磁盘上
的 CVS
库,而必须通过客户机服务器连接(尤其是使用 pserver 或 ssh 协议)访问。当然,ssh 是推荐的协议,因为它比 pserver
更加安全,而后者是用明文传输口令的。顺便说一下,Eclipse 为这两种协议提供了一个内置客户机。
开始时,您需要访问 CVS 库,并获取连接这个库所需的信息。从 Eclipse 主菜单中选择 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">Window > Open Perspective
> Other,打开 CVS 库浏览视角。这个视角中有一些有趣的视图,但是最重要的一个在左上方,即 CVS
库视图。在其中点击右键,并选择 xmlns:dw="http://www.ibm.com/developerWorks/">New > Repository
Location,这时可输入连接 CVS 服务器所必需的信息(参见图 11)。您可以看到,如果使用 ssh,您需要选择 Eclipse 的
extssh 连接类型。
图 11: 连接 CVS 库
alt="连接 CVS 库"
src="http://www-900.ibm.com/developerworks/cn/opensource/os-ecjbuild/11-addrepository.gif"
width=438 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">
您可以从 Eclipse 项目中创建一个新的 CVS 模块,如下所示:
xmlns:dw="http://www.ibm.com/developerWorks/">
- 切换到 Java 或资源视角。
- 右键点击项目名称,从上下文菜单中选择 Team > Share Project...。
- 这时将出现一个对话框,其中包含使用已有库位置的选项。在这个选项下面,悬着了您前面输入的库。点击 Next。
- 在接下来的对话框中,接受将项目名称作为模块名称的选项,点击 Next。
- 下一个对话框中您将预览检入的内容;如果没有问题,可点击 Finish。
- 最后一个对话框将提醒您尚未提交变更,并询问您是否提交。点击 Yes。
现在,您将被告知有六项资源不在版本控制范围内。可根据需要回答 Yes,但是如果您想知道这些资源是什么,可先选择 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">Details。您将看到其中有两个
Eclipse 元数据文件:.project 和 .classpath,Java
源文件、HelloObject.java,以及保存 Java
源文件的嵌套文件夹(与其包相对应):/Hello/com、/Hello/com/example、和Hello/com/example/hello
。
xmlns:dw="http://www.ibm.com/developerWorks/">
- 如果没有了,可选择 Yes。
- 让您输入注释;输入“Initial version”。
您将这些文件检入或检出
CVS,并已经对其进行深入操作之后,您需要确保您所做的变更与其他人的不发生冲突,然后才能检入;事实上,如果存在冲突,CVS 将
不允许您检入。
有两种方法可以解决冲突,并将代码合并到库中。最简单的方法是用 CVS 库中的变更更新本地文件,方法是点击您的项目,然后从
上下文菜单中选择 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">Team >
Update。如果有任何变更,将用差别格式(即为那些在本地代码中而不在库中的行加上大量增加或删除的标记,反之亦然)自动合
并到本地文件。弄清楚这些文件是很枯燥的,也容易引起错误。
更好的方法是使用 Eclipse
的组同步视角,它可以将改变过的文件并排展示出来,您可以预览其中的变更,并在每一个文件中接受或拒绝变化。实现方法是:
xmlns:dw="http://www.ibm.com/developerWorks/">
- 右键点击项目名称,并从上下文菜单中选择 Team > Synchronize with Repository。
- 系统将通知您该任务与组同步视角相关,问您是否需要切换到该视角。选中“Remember my decision”,然后点击
Yes。
像大多数其他视角一样,您想要查看的第一个视图也在工作台的左上角,这里是同步视图。上面是若干工具按钮,包括 Incoming
Mode、Outgoing Mode、Incoming/Outgoing Mode 和 Conflicts
Mode。最初所选择的模式依赖于库中、本地代码中是否存在变更,还是两者都有。听起来挺混乱,不过实际上您并不需要关心其中细节
;重要的是它能够过滤掉不必要的信息。您只会看到需要预览的文件,然后根据这些信息库更新源代码
假设您向 HelloObject 中增加了一些代码(以便使之用与其他对象不同的方法处理
String),同时其他人检出代码,进行了另一些修改(比如说修改了 main()
方法)。您也许不必知道这一点,但是在检入您的文件之前,您应该用右键点击这个文件,并选择 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">Team > Synchronize with
Repository...。这样将打开库同步视角(当然是在您的许可之下),并将本地文件和库中的文件并排对比出来,如图 12 所示。
图 12: 将本地的变更与库中的代码合并
alt=将本地的变更与库中的代码合并
src="http://www-900.ibm.com/developerworks/cn/opensource/os-ecjbuild/12-cvsmerge.gif"
width=600 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">
这时您可以预览每一个文件中的每一项变更,您可以通过 Java 源代码比较视图中的 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dw="http://www.ibm.com/developerWorks/">Copy Right to Left
工具按钮将变更拷贝到本地文件中,也可以手工编辑本地文件。当您对合并结果满意之后,就在同步视图中的文件名上用右键点击将该
文件,然后从上下文菜单中选择
xmlns:dw="http://www.ibm.com/developerWorks/">Mark as
Merged,将该文件标记为已合并。
一旦您解决了所有的冲突,并在同步视图中合并了所有的文件,您就应该返回 Java
视图,验证项目是否能够构建并运行,然后检入代码。检入代码的方法如下:
xmlns:dw="http://www.ibm.com/developerWorks/">
- 右键点击项目名称(如果提交单个文件,则点击文件名),然后从项目菜单中选择 Team > Commit。
- 当系统要求确认时,输入一条注释。(请注意,如果您检入的是整个项目,并且有多个文件发生变更,那么该注释将适用于所有
文件。如果您想为每个文件单独输入注释,则需要分别检入每个文件。)
结束语 Eclipse 3.0 和
Borland's JBuilder X Foundation 版本都具有非常丰富的特性,这两种 Java IDE 都
提供了语法检查、代码提示以及为编码自动生成代码等方面的功能,另外这两种工具都还提供了对重构、Ant、单元测试以及 CVS 的支
持。很快,使用
AWT/Swing 或 SWT 来构建 GUI 的 Eclipse Visual Editor 1.0
就会发布了。但是这两种工具之间也存在一些重要的区别。
一点重要的区别是 Eclipse 用户界面的设计方式使用了视角的概念,执行一项特定的任务可以使用一组视图、编辑器以及其他一些
UI
元素。这样可以简化任务的实现,因为手头随时都有适用的工具(而且只能使用这些适用的工具)。
另外一点重要的区别是 Eclipse 是一个开源项目。这种开源特性已经吸引了很多开发者社区为 Eclipse
开发一些插件,其中既有免费的插件,也有商业插件。如果您需要某种特性 -- 面向方面的开发支持,或者内嵌的 MP3 播放器 --
都可能会找到一种免费的插件,可以扩展 Eclipse 来支持这种特性。
参考资料
|