深入探究NetBeans 6.0中新的核心功能

来源:互联网 发布:lurker是什么软件 编辑:程序博客网 时间:2024/04/28 02:49

对于所有开发人员来说,NetBeans 下一个版本中的新功能和改进使其成为更好的 IDE 选择。从编辑到浏览、版本控制、构建、调试、性能分析或可视化设计,对于所有人来说,新版本的 NetBeans 将面貌一新。

新版本又快问世了。不久以后 —— 5.0 版本问世以来大约一年半的时间 —— 就可以使用新的NetBeans 首发版了。NetBeans 5.0 版中引入了重要的新功能(如 Matisse GUI builder),并在 CVS 集成、web services和模块开发方面进行了大量改进。与之相比,5.5 版的重点在核心 IDE 以外,它支持一些新 Pack,大大提升了 NetBeans 的整体功能,其他任何开源 IDE 都难以与之抗衡。现在,NetBeans 6.0 能够取代主版本号的位置吗?当然可以,本文将着眼于核心 IDE 中的某些最重要且感兴趣的新功能。

增强的 Javac

我们将不考虑终端用户功能,而是着眼于为其他增强提供基础的核心 IDE 技术。像其他编程工具一样,以前版本的 NetBeans 中包含了定制代码,用于解析 Java 源并为代码理解和操作任务(如重构、提示和修补、概述)提供帮助。有时得到的结果是受限的功能:简单的高亮显示、并非无懈可击的重构、不支持某些功能(比如并非所有出现 Java 代码的地方都支持代码完成)。

显而易见的解决方案是重用成熟的 javac 编译器技术来完成所有 Java 源处理。但是 javac 不支持当代 IDE 的要求:javac 是按照批执行的要求进行编写和调整的,而且接受完全编译单元作为输入、执行完全编译并生成 .class 文件作为输出。

IDE 的要求是完全不同的,其中最关键的是仅在内存中运行。假定每次键入一个字符后,IDE 希望再次分析整个类,以便能够更新语法错误指示、执行高亮显示并提供取决于代码结构的其他功能。一种选择是将编辑器的当前内容写入一个临时文件中,调用 javac 并解析所得到的 .class 文件。但是这种做法的效率是非常低的。

更好的解决方案是在同一个过程(如本地库)中调用 javac,然后将当前源作为内存参数进行传递,并接收包含了类文件中所呈现信息的数据结构(类文件不必进行创建)。直到 Java SE 5,这种解决方案都是可以接受的,但是仅使用了 Java 编译器的专用的(通常不稳定的)内部 API

该解决方案因 Java SE 6 的问世而发生改变,Java SE 6 引入了 JSR 199 (Java Compiler API JSR 269 (Pluggable Annotation Processing API)Java Compiler API 能够与 javac(以及其他 Java 源编译器)紧密有效地集成,而 JSR 269 —— 尽管最初是为注释处理而设计的 —— 能从源代码完全反射元数据。同时使用这些新的 API 将使得 IDE 和其他工具可以深入挖掘 javac 从源代码中提取出来的结构化信息。另外,增强并调整了 javac 的实现,可以用于嵌入和交互式使用。

NetBeans 进行了大量更新以集成这些新功能,并在 IDE 中进行了很多改进(见下文)。这些更改还预示了未来的受益:随着带有新语言增强集的 Java SE 7 的问世,NetBeans 的工具套件很快就能满足需要。

新编辑器

一般说来,没有任何产品是十全十美的,但是 NetBeans 正日趋完美。该 IDE 覆盖了全部 Java 平台(从 ME EE)、支持有效的 GUI 构建、具有直观 UI 和开放架构,为此 NetBeans 用户曾经引以为豪。另一方面,NetBeans IDE 在某些领域是比较落后的,例如在代码编辑器或重构方面。这可能会使非常重视源代码的程序员分心…毫无疑问他们将选择 emacs 取代可视化设计器。但是,NetBeans 6.0 中不再存在这些问题。

基于 AST 的选择

对于文本编辑器说来,选择几个词语或几行代码就够用了;但是使用源时,通常需要使用(组成连贯代码片段的)一系列文本。假定您想要复制一个 for 循环体内的全部代码,以便将它粘贴到具有相同逻辑的另一个循环中。那么只需要将鼠标放在循环体内的任何空白位置上,然后按下 Alt+Shift+Up 即可。编辑器将选择包含了鼠标所在位置的最内部的系列文本,并定义源的抽象语法树 (Abstract Syntax Tree) 节点。

注意:Java 编译器(像大多数编译器一样)将源代码解析到中间表示形式中,中间表示形式采用树状结构。这个数据结构(被称为 Abstract Syntax Tree)中的每个节点代表一个代码元素,如类、方法、语句、块、标识符、操作符、文字等等。虽然代码处理工具通常将程序作为 AST 进行处理,但是多数工具将使用只产生基本树的简单解析器。“完整”AST 是由完全编辑器(如 javac)产生的,完全编辑器能够进行语义分析和代码生成,因此“完整”AST将包含非常详细且可靠的节点信息。例如,标识符节点不仅包含它的名称,还包含它的类型及“明确赋值”状态(如果可用)。运行在完整 AST 上的工具将更加强大并且更加可靠。这种差别在简单选择功能上并不显著,但是对于重构这样的高级功能来说是非常重要的。

再次按下 Alt+Shift+Up将选择下一个外部节点,本例中全部是 for 语句;然后,重复上述按键操作,将选择整个方法,以此类推。按下 Alt+Shift+Down 会将选择缩小到内部节点。 1 展示了使用该功能方便准确地选择多行语句。我敢打赌您很快就会着迷于该功能,从而忘记所有其他选择快捷方式!没有什么能比得上能够全面理解代码(而不是文本)的代码编辑器。

 

1. 一些使用中的新编辑器功能。

语义高亮组件

编辑器的语义高亮组件升级为语义感知高亮组件。它不仅可以基于标记类型(如标识符、操作符或注释)来应用样式,还可以基于类似标记的不同含义来应用样式 —— 例如,标识符可以是类名或本地变量名、参数、常量字段等。

语义高亮显示的一个好处在于协助您格外注意 static 字段的赋值(因为很多线程安全和内存泄露错误将涉及到静态值)。 1 展示了语义高亮显示;请注意 static 字段(以及对它们的引用)是以斜体显示的。

新的高亮显示引擎还有其他用途:

§ 识别用法 —— 选择任何标识符,编辑器将在同一个编译单元中高亮显示该标识符的全部用法。同样, 1 也给出了示范:单击方法名称,将高亮显示对该方法的所有调用。

§ 标记“出错代码(Smelly code)” —— 新编辑器将高亮显示未使用的变量和输入,以及不赞成的类和方法。您再也不必执行构建操作或运行代码 lint 工具来检测这些简单(但频繁出现的)问题。

§ 推出和抛出点 —— 如果选择方法的返回类型,则会高亮显示所有 return 语句。如果选择方法的 throws 列表中的异常,则会标记该异常类型的所有 throw还会对可能抛出相同异常的所有其他方法调用进行标记。

更好的代码完成

现在我们不得不使用大量令人迷惑的 API,这使得代码完成成为任何当代代码编辑器的最重要功能之一。NetBeans 6.0 添加了很多新技巧:

§ 关键字完成 —— 例如,如果刚刚在新的源文件中键入 package 声明,则 Alt+Space 将只产生在该位置上合法的关键字:abstractclassenumfinaimportinterface public 1 展示了另一个示例:在方法声明的开始括号之后,首选的关键字完成是所有的基本类型。

§ 基于类型的变量名称 —— 在“ConfigurationFile _”之后,编辑器将提供变量名称 cfconfigurationFile file(我使用“_”表示鼠标位置。)

§ 泛型感知完成 —— 将泛型类型变量赋值给 new 表达式时,编辑器将提供所有兼容类型,包括泛型参数。例如,在“Map m = new _”中,代码完成将列出所有 Map 实现,每个都带有相同的 参数。

§ 注释感知完成 —— 在“@之后,将提供可用于给定范围的所有注释。如果所选的注释需要参数,则编辑器还将提供参数完成。

§ 传递参数 —— 在“x = m(_中,顶部完成将是与 m() 第一个参数兼容的范围内的值。如果方法的参数名是可用的且上述范围内存在具有相同名称的变量,则这用来进一步对完成进行排序。将提供带有(用那些变量填写的)参数列表的完整完成。

§ 普通构造方法 —— 将鼠标放在类成员之间来调用代码完成时,将创建一个不带参数的构造方法和一个接收所有字段初始值的构造方法(如果这些构造方法不存在的话)。

§ 捕获异常 —— catch (_”之后的完成将仅提供那些在相应 try 块中抛出但尚未被前一个 catch 块处理的异常。

新的浏览视图

编辑器引入了一些用于源代码浏览的新视图。Members 视图展示了 Java 类型成员及其 javadoc,可以方便地查找特定方法、字段或内部类。Hierarchy 视图展示了 Java 类型的继承树。 1 演示了该视图;请注意过滤器按钮,它允许在超类或子类之间以及简单类名和完全限定类名之间进行切换。还可以选择是否显示内部类和接口。

Declaration 视图概述了所选择的 Java 元素(类型、方法或字段)的声明。尽管叫做Declaration 视图,但是它还将展示所选择元素的原代码(如果可用)。Declaration 视图在调用仍处于开发中但尚未写成 javadoc 文档的代码时格外有用。最后,Javadoc 视图展示了所选择的 Java 元素的 javadoc

可编辑的 Diff 和内联 Diff

改进的编辑器架构使得各种功能可以方便地操作源代码来集成编辑器功能。这一点在新 Diff 中是显而易见的(例如,通过选择源文件并选择 Subversion>Diff 打开 Diff)。当显示本地文件时,右窗格是可编辑的,其中提供了完整的编辑器功能集 —— 包括语义高亮显示和代码完成。

Diff 增加了其他令人感兴趣的技巧,如单击合并和单词级差别(即如果更改了某行中一个单词,则只会高亮显示该单词)。请在 2 中查看这些改进。

2. Local History 和新的 Diff:编辑功能、语义高亮显示和单词级差别。

 

还可以启用 Inline Diff 功能,它将创建 Diff 侧边栏,高亮显示带版本号的文件的更新部分。侧边栏可以可视化或回滚更改,并打开完整的 Diff 视图。

Javadoc 提示

您总是将所有代码写入文档,对吗?哦,如果不是的话,NetBeans 将提示丢失的 javadoc 标记和错误的 javadoc 标记。IDE 可以协助您使用自动修补程序来添加丢失的标记,您需要的仅仅是填写空白。并且在进行上述操作时,还可以使用新的 Javadoc 视图方便地进行预览。

默认情况下,Javadoc 检查处于启用状态,但它不是侵入式的:编辑器仅报告选定行中丢失的 javadoc 标记;只有错误的标记才在所有行进行报告。可以通过 Tools|Options>Java Code>Hints 来定制这些选项及相关选项。

其他功能

新编辑器及其框架包括其他普通功能,如可重用的编辑器选项卡。它们对于调试器是很有用的,避免环境中堆满杂乱无章的通过断点或进入操作打开的编辑器。还有一个新的 Generate Code 对话框,将自动创建构造方法、获取方法和设置方法、equals() hashCode()、以及委托 (delegate) 方法。

重构和 Jackpot

NetBeans 6.0 大大改进了现有重构的支持范围。新的与语言无关的内部重构 API 可以对常用 .java 源代码(如 XML JSF 文件)之外的代码实现重构。新的 API 还允许 Java 重构准确地更新相关的非 Java 元素。这使得当前重构更加安全并且更易于使用。

然而,最大的看点在于对项目 Jackpot 中新技术的突破,新技术已经可以使用,但是刚刚成熟。在 NetBeans 6.0 中,Jackpot 将升级为标准功能并与 IDE 更加紧密地集成。

您也许听说 Jackpot 是一个新的重构工具,但事实上这种说法并不正确。实际上 Jackpot 是一个用于普通代码理解和操作的综合框架。可以将它用作某些功能的替换或基础:重构支持、高级搜索和浏览、质量检查、复杂编辑任务的类似宏的自动操作以及其他功能。.

使用 Jackpot

在深入研究 Jackpot 之前,我们将展示如何方便地使用它。新的 Query and Refactor 命令将展示一个对话框,如 3 所示,其中可以选择 Jackpot 查询或查询集。一些查询中的选项可以设置为首选值。单击 Query,所选查询的所有匹配都将显示在一个视图中,其中详细描述了每一个匹配。同时,如果查询包含代码更改,则通过单击 Do Refactoring 按钮可以预览并确认这些更改。

3. Jackpot Query and Refactor 对话框。

Jackpot 规则

Jackpot 的所有功能来自于它的开放性。这需要学习一种新语言,当您认识到 Jackpot 的全部潜力时,就会明白学习曲线很快就会带来受益。

例如,下面是一个 Jackpot 查询,将检测低效代码模式—— 使用 equals(“”) 来检查 String 是否为空 —— 并重写相匹配的代码:

$s.equals(“”) => ($s.length() == 0) :: $s instanceof java.lang.String;

语法是 pattern => replacement :: condition,其中 $ 字符用来识别绑定到任何 Java 程序元素(标识符、语句、操作符、文字等)的 meta 变量。下面来分析一下每个子句:

1. 模式 $s.equals(“”) 将匹配对 equals() 方法的调用,将空字符串作为参数进行传递。

2. Jackpot 规则语言中,条件是规则中惟一可以选择的部分,但也是特殊规则 $s instanceof java.lang.String 中的重要部分,它确保仅当 $s String 时才激活规则。这是一个重要的限制,因为该规则是专门用于 java.lang.String.equals() 的,而不是 equals() 的任何实现。

3. 最后,可替换部分 —— ($s.length() == 0) —— 将重写匹配的代码。

这个看似简单的行为背后存在着大量复杂行为。首先,研究一下 Jackpot instanceof 操作符。它看起来像是 Java instanceof,其实并不是同一个事物。Java instanceof 是一个运行时操作符,左边操作数是对象引用。而 Jackpot instanceof 是一个编辑时 (static) 操作符,左边操作数是程序 AST 的任何节点。

因为 Jackpot 像新编辑器一样依赖于 javac 的源分析引擎,它能够分析处理节点中的所有类型。这包括最复杂的情况,如推测的泛型类型。其他代码分析工具通常借助于启发方式来模拟类型,但是可能无法计算某些表达式的类型。

注意:您甚至可以使用普通正则表达式进行重构 (replacing s.equals(“”) by s.length() == 0):搜索 (/w*)/.equals/(/”/”/) 并用 $1.length() == 0 取代它。但正则表达式是严格且非智能的;它们甚至不能删除注释或字符串文字内部的文本,而且一个简单的分行就可以阻止检测操作。这显然是个无足轻重的例子(其他工具如 PMD FindBugs,都比正则表达式更加智能 —— 尽管它们无法达到类似 javac 的精度),不过它体现了智能化工具/功能的价值。

存在不带 Java 操作符的 Jackpot 操作符,包括简单操作符(如匹配布尔表达式的 isTrue(node),可以静态地证实它的值始终是 true)及功能更加强大的操作符(如 isSideEffectFree(node))。后者将匹配(在相应范围之外不修改任何变量的)语句、块或方法。

此类检测类似于现有的代码检查工具,将检测类似“死代码”的问题。但是由于 Jackpot 依赖于完整 javac 技术,所以将带来更少的检测错误和更高安全性的自动替换。

注意:利用 Jackpot API NetBeans 的模块开发功能,也可以在纯 Java 中编写 Jackpot 查询。这对于超出 Jackpot 规则语言能力的复杂规则来说是必要的。但是随着该语言的发展,Java 中需要实现的查询将越来越少。顺便提一句,性能不是问题:采用 Jackpot 规则语言编写的查询将转换为 Java 语言并作为已编译代码执行。

 4 展示了 Jackpot Refactoring Manager。该配置对话框允许您检查所有已安装的查询并将它们组织到查询集中。还可以导入新查询。如果编写了新的查询脚本,则只需单击 ImportQuery and Refactor 对话框中即可得到新查询。

 

4. Jackpot Refactoring Manager

用法和前景

Jackpot 附带了一个预定义查询库,包含很多用于代码清除、检测普通编程错误或者代码反模式、以及迁移废弃 API 用法的规则。

撰写这篇文章时,Jackpot 刚刚被集成到 NetBeans 中。因此我们拥有一个混合系统,Jackpot 与传统的重构和代码操作功能共存。这意味着类似 Rename method 的命令仍以原来的方式实现,即使可以利用 Jackpot 规则实现它们。对于代码确认(“提示”)及其自动修补程序,也存在上述情况。将来肯定会在 Jackpot 上重新实现某些功能。同时,因为 Jackpot 使得开发此类功能变得更加容易,所以可以期待未来将有越来越多的重构、确认和其他代码处理功能添加到 IDE 中。

扩展的 Ant JUnit 支持

NetBeans 6.0 中的 Ant 支持已经升级到 Ant 1.7.0,这个新的主版本添加了对兼容 JSR 223 的脚本语言的支持功能。还有一个用于 Ant 进程的新的进程指示器。

IDE JUnit 支持有所增强,现在可以处理注释驱动的 JUnit 4 测试用例。仍支持旧的 JUnit 3.8 测试用例。同时,就特定于单元测试的类路径条目对项目的属性编辑器进行了改进。

项目和构建功能

编辑代码固然重要,但是对于大多数重要的项目来说,良好的结构以及强大的构建系统也是很重要的。NetBeans 的项目管理和构建系统也进行了改进,增加了很多新功能。

除了支持 Ant 之外,NetBeans 可以打开并了解 Apache Maven 2 项目。尽管新的基于 Maven 的项目支持不希望很快就取代 Ant 项目,但是喜爱 Maven 的或需要构建 Maven 项目的任何人都可以自由使用它。

同时,可以指定从源树中取消的包或类。在处理大型项目时,如果您不希望查看或运行所有项目代码且可以执行局部构建,那么这一点是很有用的。

如果有很多相关的项目,可以将它们组织到 Project Groups 中,这样可以把组当作一个整体,将某些操作(如打开项目)应用于组。如果要编写具有多个入口点(即带有 main() 方法的类)的 Java SE 项目,或具有命令行参数(即要求频繁编辑项目属性)的 Java SE 项目,那么 Run Configurations 功能会使您的工作变得更加简单。项目属性的 Run 页面展示了新的 Configuration 选项。独立于其他配置,每个配置可以定义 main 类、参数和 VM 选项。请参阅  5 中的例子。

5. Project Properties 对话框中 Run 页面上的多个配置及对 Java Web Start 的支持。

另外,新的 Java Web Start 支持将自动创建并维护 JNLP 文件,并且无需使用浏览器就可以方便地运行测试。在 Project Properties 中,勾选 Application>Web Start>Enable WebStart 即可。通过创建 Web Start 配置,Java Web Start支持与 Run Configurations 功能的集成。因此,使用或者不使用 JAW 都可以对项目进行测试。

版本控制

稳定的版本控制是一个重要的特性,即使对于某个开发人员在周末编写的简单项目也同样重要。首先,能够进行“大胆编程”是很重要的,例如毫无顾虑地使用某些技术如重构(手动或自动)。NetBeans 6.0 在这方面也有很多看点。

CVS

NetBeans 通常支持 CVS 版本控制系统,这种支持直到 NetBeans 5.5 仍比较出色。Version 6.0 在可用性方面添加了一些更新,如导出在 Search 视图中所选择的文件的 diff 补丁;一个用于打开特定修补、标记或分支的新命令;改进的历史搜索功能,带有新的 Summary Diff 视图。还有一些新的高级操作,如更改 CVS 根并进行部分合并。

Subversion

虽然,对于很多用户来说,最大的看点是对日益流行的 Subversion 版本控制系统的支持。但是 NetBeans 6.0 是第一个集成了所有一流 SVN 支持的版本。即使目前 NetBeans 5.5 Update Center 中提供了 Subversion 模块,但如果您是 Subversion 用户的话,的确还是希望使用 6.0 版本。

Local History

无论选择哪一种 Version Control System,您都会喜欢上新的 Local History 功能,如 2 所示。NetBeans 6.0 将自动保留对项目资源所作的最新更改的内部历史。每次保存文件时,它将作为新版文件的“提交”注册在本地历史中。因此十分详细地记录了文件更改 —— 有点像持续的取消功能。可以在本地历史中查看“版本”,并根据当前文件来区分它们。

但是,请注意该功能主要用于取消那些超出编辑器撤消能力的错误,如关闭编辑器之后或重新启动 IDE 之后。然后可以回复到上一个尚未提交到比较安全的 VCS 存储库(这样做可能是因为新代码仍很粗略且未经测试)的状态。Local History 功能很强大,有时是一个挽救工具,但是它并不能完全代替实际的 VCS

调试

调试程序当然是最重要的 IDE 功能之一,而且 NetBeans 在这方面已经非常完善。那么 6.0 版中还有哪些改进呢?首先,Java SE 6 版包含两个重要的新 JVM 调试功能,它们需要使用更新的调试器。(NetBeans 5.5 或旧版本中的调试器不会受益于新功能,即使它们运行在 Java SE 6 上)。还有一些不依赖于 JRE 版本的其他调试器改进,所以您还是会获得受益,即使您还在使用某些老式 Java 运行时,如 5.0 1.4.2(但愿不会如此!)。

强制返回值

假定您正处于方法中的某个位置,然后希望立即强制返回并产生特定的返回值。现在 6.0 版调试器支持该操作,可以查看“what-if”方案并且可以更加方便地复制错误。不需要进行删改,如使用 return 语句来修补源代码(并且稍后还必须取消修补)。撰写本文时,该功能尚未实现,不过在最终版之前应该能够实现。

表达式步进

表达式步进是另一个智能化时间节省。在包含方法调用的复杂表达式中,可以进入单独的调用;而且当此类调用返回时,即使没有将该值指定给任何本地变量也可以查看返回值。再也不必为了单纯的协助调试目的,而将表达式分成简单部分并引入临时本地变量。同时,Local Variables 视图展示了所调用方法返回的值。

表达式步进可以在任何 Java 运行时中运行,但是仅在 Java SE 6 中显示所调用方法返回的值。

多线程支持

另一个非常有用的功能是Debug current thread(调试当前线程 ):可以命令调试器只有给定线程才在断点处停止。这一点对于调试并发应用程序是很重要的,并发应用程序拥有多个运行代码的线程。因为我们开发人员并不是多线程的,如果设置一个断点使调试器一次停止二十个线程的话,我们很容易就被摧垮了!

其他功能

还有一些其他功能的改进,如更好地处理中断的断点(例如使用了错误的条件),以及将调用堆栈复制到剪切板的命令等。

新的 Profiler 功能

NetBeans 6.0 中,Profiler 成为核心分发的一部分,进行了一系列重要的改进。

§ 更好的性能 —— 无论在何处性能都很重要,但是它始终是 profiler 中的关键性问题。NetBeans Profiler 源自 Sun JFluid 研究项目,它提倡一种新技术,通过动态测量 (instrumenting) 代码来近乎全速地对应用程序进行性能分析。同时,Profiler 本身应当快速地分析并提供从 JVM 收集的数据 —— 特别是在线数据,当应用程序运行时,在线数据将不断进行更新。新版本对 Live Results 分类和钻取进行了重大改进,因此您会更加频繁地使用该功能。

§ 类加载遥测 —— 现在 VM Telemetry 视图将展示所加载类的数量和线程数据。

§ 内存快照比较 —— 怀疑应用程序中的某个方法存在泄漏?在运行前后进行堆快照,然后对比两个快照的差别。

§ Heap Walker —— 用于泄漏搜索和任何类型内存分配分析的最终工具。可以载入 heap dump 并可视化堆中的完整对象图(参见 6)。

6. Profiler Heap Walker,检查特定的 BigInteger 实例。

 

§ 加载生成 —— Profiler 支持与加载生成工具的集成(目前只支持 Apache JMeter,不过以后会支持更多的加载生成工具)。

§ 性能分析点 —— 它们是 profiler 中的调试器断点。可以在源代码中定义 profiler 启动/停止时钟的位置、重新设置性能分析的位置或获取快照的位置。Profiling Point 功能将消除最官僚的性能分析工作:再也不必进入或暂停代码来获取重要事件中的快照;也不必通过调整代码来调节与完整方法不一致的区域的等待时间。

GUI 和可用性

与任何其他应用程序一样,IDE 应该具有一个美观的、高效的且多产的 GUINetBeans 6.0 在这方面迈出了一大步。

Linux Solaris 用户当然欢迎大大改进的 GTK L&F,目前默认情况下 GTK L&F 在这些平台上是激活的。默认情况下被激活的部分取决于 Sun JRE 6 Update 1(或更好的版本),其中包含了它本身共享的重要的 GTK 更新。NetBeans 将考虑来自现行 GTK 主题的所有设置。

新的 NetBeans Installer (NBI) 可以更加方便且更快地进行安装。在下载页面中,可以选择需要的包(如 EnterpriseMobility)。然后会提供一个包含所选择功能的自定义安装程序,并在一次运行中完成所有内容安装。特别地,NBI 非常便于系统管理员在多个机器上安装相同的 IDE 配置,也为没有做好实验课准备的培训师提供了方便

NetBeans 还涉及了重新设计的图标,并且删除了 SDI windowing 选项(来自旧版 NetBeans 的继承)。现在已经拥有不可停靠/浮动窗口。最后,在 QA 前端,新的 Report Exception 工具简化了将详细错误数据报告给 NetBeans 开发人员的过程,而 UI Gestures Collector 可以提交有关 IDE 使用模式的数据。该数据不仅对研究有所帮助,而且有助于实现一种不基于 Math.random() 的“每日一帖”提示系统。我对此进行了测试,NetBeans Analytics 站点向我提供了一个有关对多线程程序进行性能分析的教程,它与我近期所进行的工作是密切相关的。

Matisse 和可视化 web 开发

在这里我没有涉及到的只有两个核心 IDE 功能。这两个功能都是应获奖的工具,而且是很多开发人员之所以转移到NetBeans 的最重要的原因,它们是 Matisse 可视化编辑器和 Visual Web PackNetBeans 6.0 对二者进行了重大改进。对于 Matisse,请查阅本期的“UI Design in NetBeans 6.0一文,其中可以找到有关新增功能的详细信息。

目前,Visual Web Pack 中最重要的更改涉及到它与 NetBeans 核心的集成。实际上,对于 6.0 版,它不是外部的 Web PackIDE 已经提供了对 web 应用程序开发的支持,因此没有必要在核心包含一部分同时在外部 Pack 中包含其余部分。从历史的角度看,出现这种情况是因为 Web Pack 技术最初是作为独立产品(Sun Java Studio Creator)来开发的,它是基于一个非常旧的 NetBeans 版本的。因此在一定程度上它的实现对于 NetBeans web 工具来说是多余的。现在这种隔阂已经消失,不再需要复制代码或付出努力。这种融合为所有用户(从可视化设计爱好者到标记编写的顽固分子)带来了一个更加简单的 IDE

集成的 web 工具中有很多新功能,不过在撰写本文时,它们仍处于开发中,所以本文无法论及这方面的新功能。但是,不要错过“Visual Web Application Design with NetBeans”一文,以便获取关于最新稳定版的教程。

Plugin Manager

NetBeans 的开发性、可扩展性架构是它的核心优势之一,而且它还非常易于使用和集成。虽然,您可能会对 Tools>Update Manager 的消失感到惊讶。但是再看一下,会发现 Tools>Plugins,如 7 所示。

7. 新的 Plugin Manager

新的 UI 统一并更好地组织了旧的 Update Center(请参阅 UpdatesNew PluginsDownloaded Settings 选项卡),以及原来的模块管理器(参阅 Installed 选项卡)。还有其它新功能,例如,选择插件时(就像 7 JMeter Module 所进行的操作一样),将出现一个 Required Plugins 节点(如果可用);可以展开节点来查看还必须安装的任何依赖关系。

结束语

NetBeans 6.0 带来了大量新功能和改进功能,成为主版本当之无愧。如果说 NetBeans 5.5 很有广度,那么 NetBeans 6.0 具有同样程度的深度。更新到最新版本的开发人员不仅将获得对所有类型 Java 开发的广泛支持,还将拥有每个重要功能区域中的最佳功能集。

很多 NetBeans 用户可能阅读过本文,并发现在以前版本中借助于附加模块可以使用这些功能。从一些编辑器增强到 Run Configurations,直到 Local History,一个 nbm 文件为您的需求提供了某种程度的支持。但是,现在只需安装核心 IDE,即可拥有即开即用的功能 —— 与通过外部模块提供的功能相比,它们更加高级、更加出色且更易于集成。虽然对于所有新版本说来,都会具有这些优势,但是 NetBeans 6.0 取得的成果非常显著,包含了大量改进,它们是作为来自广泛社区的改进产品而首次问世的。这只能被看作是主要看点,是项目开发在满足用户需求方面快速发展的征兆。