FeaturesPluginsDocs & SupportCommunityPartners

异步 JAX-WS Web 服务客户端端对端方案

本文档向您介绍了通过 IDE 开发采用异步方式使用实时 Web 服务的 JAX-WS Web 服务客户端的相关基础知识。这种实时 Web 服务是指 eSynaps Web 服务搜索服务。它将返回指向 Web 服务的 URL,其中,该服务包含了给定的搜索字符串。例如,如果您将字符串 "weather" 发送到 Web 服务,则会返回有关提供天气信息的 Web 服务 URL 的列表。在本教程中,我们将使用 Java SE 应用程序中的一个简单 Java 类作为客户端。

异步 Web 服务客户端通过“轮询”或“回调”方法来使用 Web 服务。在“轮询”方法中,您将调用一个 Web 服务方法并反复请求结果。轮询是一种阻止操作,因为它会阻止调用线程,所以这就是不在 GUI 应用程序中使用它的原因。在“回调”方法中,您在 Web 服务方法调用期间传递回调处理程序。当结果有效时,将调用该处理程序的 handleResponse() 方法。这种方法适用于 GUI 应用程序,因为您不必等待响应。例如,从 GUI 事件处理程序发出调用并立即返回控制权,这样用户界面就可以随时保持响应了。轮询方法的缺点是,即使是在捕获后使用响应,也必须对其进行轮询来查明已将其捕获。因此,我们将使用回调方法,在响应返回之前,这种方法始终保持正常状态。处理程序随后会接收响应,并对其进行处理。在我们的方案中,将使用这种方法来处理 Web 服务找到的 URL。首先,我们将解析这些 URL 以删除 XML 标记,然后在 JTextArea 中显示它们。

当我们建立了一个工作应用程序后,需要将其迁移到 NetBeans 平台中,这样我们就可以继承 NetBeans 平台的模块化体系结构并且可以在 IDE 中开发功能丰富的客户端应用程序的 GUI 功能。

预计持续时间:45 分钟

安装和配置工作环境

安装 NetBeans 5.5 并运行 IDE。由于本方案是在 Java SE 项目中使用 Web 服务客户端,因此您无需安装 Sun Java System Application Server 9.0。

创建 Java SE 应用程序和 Web 服务客户端

要创建 Web 服务客户端,首先需要 Java SE 应用程序、EJB 模块或 Web 模块。在此,我们将使用 Java SE 应用程序。

  1. 选择“文件”>“新建项目”(Ctrl-Shift-N)。从“常规”类别中,选择“Java 应用程序”。单击“下一步”。
  2. 将项目命名为 AsyncWSClient。取消选中“创建主类”复选框。单击“完成”。
  3. 在“项目”窗口中,右键单击 "AsyncWSClient" 项目节点,然后选择“新建”>“文件/文件夹”(Ctrl-N)。在“新建文件”向导中,从“类别”列表中选择“Web 服务”,然后从“文件类型”列表中选择“Web 服务客户端”。单击“下一步”。
  4. 选择 "WSDL URL",然后键入或粘贴以下 WSDL URL:

    http://www.esynaps.com/WebServices/SearchWS.asmx?WSDL

  5. 在“包”中键入 org.me.wsc。单击“完成”。

    将在“项目”窗口的“Web 服务引用”节点下显示新的 Web 服务客户端:

  6. 右键单击 "SearchWS",然后选择“编辑 Web 服务属性”。将显示编辑 Web 服务属性编辑器。
  7. 在该编辑器中,展开 "Search"。选中“启用异步客户端”复选框,如下所示:

  8. 单击“确定”。

    现在,将显示以下对话框:

  9. 单击“确定”。

    观察“输出”窗口,您会注意到 IDE 正在调用 Ant 目标来生成所需的 JAX-WS 客户端工件。

与 Web 服务之间的异步交互

现在,我们已通过 IDE 生成了使用 SearchWS Web 服务的 Web 服务客户端,现在将执行后续操作。严格地来讲,SearchWS Web 服务只有一个操作,即 Search,它依据我们为其提供的搜索词作为请求参数,在 Web 上搜索 URL。然而,执行此操作需要花费一些时间。因此,如果以标准同步的方式使用该结果,并静静地等待响应,我们的工作流将会中断。因此,我们需要采用异步的方式使用该结果,这就是本教程的目的所在。

现在,我们已完成了第一步,即启用了 Web 服务客户端以允许异步操作调用。如果展开 "SearchWS" 节点,您现在会看到三个操作(如下所示):

正如简介中所述,我们将使用上面屏幕快照中显示的 Search [异步回调] 操作。有关这两种异步方法之间差异的更多详细信息,请参见 https://jax-ws.dev.java.net/jax-ws-20-fcs/docs/asynch.html

设计用户界面

要允许用户指定搜索字符串、并将其发送到 Web 服务然后查看结果,我们需要创建一个用户界面。NetBeans GUI 生成器(也称为 Matisse)可以轻松地创建此应用程序部分。

  1. 右键单击 "AsyncWSClient" 项目节点,然后选择“新建”>“文件/文件夹”(Ctrl-N)。在“Java GUI 窗体”类别中选择“JFrame 窗体”,然后单击“下一步”。将窗体命名为 MainForm,然后在“包”中键入 org.me.forms。单击“完成”。
  2. 从组件面板 (Ctrl-Shift-8) 中添加以下控件,并按照下表列出的内容更改其属性:
    组件 属性
    JLabel text Enter seach text:
    JTextField text
    变量名称 tfWord
    JButton text Search
    变量名称 btSearch
    JProgressBar stringPainted 启用
    变量名称 pgProgress
    JLabel text URLs found:
    JTextArea background [204,204,204]
    editable 不启用
    lineWrap 启用
    变量名称 taResults

    注意:您可以使用“属性”窗口 (Ctrl-Shift-7) 来更改上面的属性。可以在“属性”窗口的“属性”标签中更改上面的所有属性,但变量名称除外,它们是在“代码”标签中设置的。还可以使用更简单的方法来修改变量名称,即右键单击组件,然后使用“更改变量名称”菜单项。

    另请注意,即使将 JTextArea 直接放在窗体上,GUI 生成器也会将 JTextArea 放在 JScrollPane 中。

  3. 对组件重新排序并调整其大小,直至用户界面如下所示:

添加业务逻辑

正如本教程的简介所述,我们将使用 Java EE 5 中 JAX-WS 提供的异步回调方法与 Web 服务进行交互。在此方案中,将使用异步方法来处理 Web 服务找到的 URL。首先,我们将解析这些 URL 以删除 XML 标记,然后在 JTextArea 中显示它们。

  1. 要添加用于解析返回的 URL 的代码,请单击源代码编辑器左上角的“源”按钮,然后向下滚动至文件的结尾处。在结束类的最后一个花括号的正上方,添加以下方法:
    private String removeTags(String str){
        String text = str;
        text = text.replaceAll("<Results><url>","");
        text = text.replaceAll("</url><url>","/\n");
        text = text.replaceAll("</url></Results>","");
        return text;
    }

    通常,您会使用 XML 解析器来解析结果,但就本教程而言,使用 String.replace() 就足够了。

  2. 其次,添加异步客户端代码。在上一步添加的方法下面,添加以下内容:
    public void callAsyncCallback(String word){
    
    }
  3. 在“项目”窗口中,展开“Web 服务引用”> "SearchWS" > "WebSearchWS" > "WebSearchWSSoap"(如下所示):

  4. 在“项目”窗口中,将 "Search [异步回调]" 节点拖放到上面步骤 2 中创建的 callAsyncCallback 方法中。

    放置该节点后(您无需进行任何额外的编码),就会看到以下内容:

    public void callAsyncCallback(String word) {
    
        try { // Call Web Service Operation(async. callback)
            org.me.wsc.WebSearchWS service = new org.me.wsc.WebSearchWS();
            org.me.wsc.WebSearchWSSoap port = service.getWebSearchWSSoap();
            // TODO initialize WS operation arguments here
            java.lang.String keyWord = "";
            javax.xml.ws.AsyncHandler<org.me.wsc.SearchResponse> asyncHandler = new javax.xml.ws.AsyncHandler<org.me.wsc.SearchResponse>() {
                public void handleResponse(javax.xml.ws.Response<org.me.wsc.SearchResponse> response) {
                    try {
                        // TODO process asynchronous response here
                        System.out.println("Result = "+ response.get());
                    } catch(Exception ex) {
                        // TODO handle exception
                    }
                }
            };
            java.util.concurrent.Future<? extends java.lang.Object> result = port.searchAsync(keyWord, asyncHandler);
            while(!result.isDone()) {
                // do something
                Thread.sleep(100);
            }
        } catch (Exception ex) {
            // TODO handle custom exceptions here
        }
    
    }
                    

    注意:还可以使用另一种方法,让 IDE 生成上述代码片段。在源代码编辑器的 callAsyncCallback 方法内单击鼠标右键,然后选择“Web 服务客户端资源”>“调用 Web 服务操作”。在出现的对话框中,选择 "Search [异步回调]" 操作,然后单击“确定”。

  5. 现在,需要修改生成的代码片段以将 JTextField 中输入的词语传递给 Web 服务,并将结果放在 JTextArea 中。同时,还要确保将 Swing 调用安排在事件分发线程 (Event Dispatching Thread, AWT) 内部执行。在本方案中,不需要使用生成的 try/catch 块。最简便的更改方法是复制/粘贴下面的代码:
    public void callAsyncCallback(String word){
    
        org.me.wsc.WebSearchWS service = new org.me.wsc.WebSearchWS();
        org.me.wsc.WebSearchWSSoap port = service.getWebSearchWSSoap();
        javax.xml.ws.AsyncHandler<org.me.wsc.SearchResponse> asyncHandler = new javax.xml.ws.AsyncHandler<org.me.wsc.SearchResponse>() {
            public void handleResponse(final javax.xml.ws.Response<org.me.wsc.SearchResponse> response) {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        String results = "";
                        try {
                            results = response.get().getSearchResult();
                            results = removeTags(results);
                            taResults.setText(results);
                        } catch(Exception ex) {
                            ex.printStackTrace();
                        }
                        pgProgress.setIndeterminate(false);
                        pgProgress.setString("");
                        btSearch.setEnabled(true);
                    }
                });
            }
        };
        port.searchAsync(word, asyncHandler);
    
    }
  6. 最后,为了引用 javax.swing.Utilities 类,我们需要使用 import 语句。可通过在源代码编辑器中单击鼠标右键并选择“修复导入”(Alft-Shift-F),让 IDE 生成此 import 语句。

将用户界面连接到业务逻辑上

接下来,我们将上一部分提供的逻辑连接到用户界面上。当用户单击 JButton 时,将建立与 Web 服务的连接。在单击该按钮时,将激活进度栏并调用回调方法。

  1. 在“设计”视图中,右键单击 JButton,然后选择“事件”> "Action" > "ActionPerformed"(如下所示):

    编辑器将切换到“源”视图中,并定位到 btSearchActionPerformed 方法中。

  2. 插入下面突出显示的代码:
    private void btSearchActionPerformed(java.awt.event.ActionEvent evt) {
       String word = tfWord.getText();
       pgProgress.setIndeterminate(true);
       pgProgress.setString("waiting for server");
       btSearch.setEnabled(false);
       callAsyncCallback(word);
    }
    我们先将进度栏设置为不确定模式以让其连续运行,再将其文本设置为 "waiting for server"。然后,调用异步回调方法,并将从 JTextField 中检索的词语传递给该方法。

运行应用程序

现在,我们已创建了简单的 Swing 应用程序,可以试用一下。

  1. 右键单击该项目,然后选择“运行项目”。系统会提示您将 "org.me.forms.MainForm" 设置为主类。单击“确定”。

    将生成并运行该应用程序。

  2. JTextField 中写入一个词语(如 "weather"),然后单击 "Search"。将激活进度栏,如下所示:

    几秒钟后,进度栏将停止并在 JTextArea 中显示结果,如下所示:

    如果在进度栏停止后 JTextArea 仍为空,请再次单击 "Search" 以重新执行搜索。存储本方案使用的 Web 服务的 Internet 服务器有时会被来自客户端的请求阻塞。

注意:如果您处于防火墙的保护下,应用程序会自动知道要使用的正确代理服务器和代理端口。在您创建 Web 服务客户端后,系统设置就已写入到 project.properties 文件的 run.jvmargs 属性中了。如果在“项目”窗口中右键单击项目,然后选择“属性”并单击“运行”类别,您还可以在“VM 选项”字段中看到生成的值。如果需要,您可以对其进行更改。

扩展和分发应用程序

现在,我们创建了一个完全能够正常使用的应用程序,该考虑如何快速且有效地对其扩展了。例如,我们可能希望在应用程序中添加 Google 工具栏。完成此操作的一种简便方法是,将应用程序移到 NetBeans 平台上。当它位于 NetBeans 平台上,该应用程序可以具有其自己的更新中心向导(与 IDE 的“工具”菜单下面的更新中心向导相同),我们可以利用该向导来添加外部模块,如 Google 工具栏模块。

我们还需要考虑应用程序的分发策略。在生成 Java 项目时,IDE 将在应用程序的 dist 文件夹中创建一个 JAR 文件。除 JAR 文件外,我们可能还希望提供一个可执行文件。另外,还可以使用 Java Web Start 技术,通过浏览器来启动应用程序。当我们将应用程序移到 NetBeans 平台上时,IDE 可以使用多种方法来支持应用程序,其中包括创建 ZIP 分发和可启动的 Web 应用程序(只需单击一下菜单项即可完成)。

包装基础结构

简单的 Swing 应用程序包含若干个工件,NetBeans 平台可通过“包装”模块来使用这些工件。包装模块不包含任何代码,但可以将库放在应用程序的类路径上。我们需要将几个 JAR 文件放在应用程序的类路径上。首先,需要 IDE 生成的 JAX-WS 客户端工件。其次,需要 JFrame 窗体中引用的 Java EE 5 JAR 文件。将这些 JAR 文件放在类路径上后,我们就可以在 NetBeans 平台应用程序中使用它们了。

  1. 右键单击该项目,然后选择“生成项目”。在“文件”窗口 (Ctrl-2) 中,查看 dist 文件夹,您会注意到一个名为 AsyncWSClient.jar 的 JAR 文件。与其他 JAR 文件相比,该 JAR 文件包含了与前面部分叙述的 Web 服务进行交互的 JAX-WS 客户端工件。

    现在,我们将创建一个模块套件项目以提供功能丰富的新客户端应用程序的框架。

  2. 选择“文件”>“新建项目”(Ctrl-Shift-N),然后从“NetBeans 插件模块”类别中选择“模块套件项目”。单击“下一步”。创建一个名为 WebServiceLocator 的模块套件项目。单击“完成”。

    “项目”窗口中将显示新 WebServiceLocator 应用程序的项目结构。该项目结构表示在 NetBeans 平台上构建的应用程序的框架。

    现在,我们需要将包含 Web 服务客户端工件的 JAR 文件添加到应用程序中。

  3. 在“项目”窗口中,展开 "WebServiceLocator" 项目,右键单击“模块”,选择“添加新库”,然后创建一个库包装模块项目。在“库”文本字段中,浏览至 dist 文件夹,它包含了上面步骤 1 中所述的 JAR 文件。您会看到类似于以下内容的界面:

    选择上面屏幕快照中显示的 AsyncWSClient.jar。此时,不需要考虑许可证文件的问题。单击“下一步”。

  4. 保留缺省名称 AsyncWSClient。单击“下一步”,然后单击“完成”。

    现在,您已提供了 JAR 文件包装模块,并将其放在该应用程序的类路径上,这样 JAX-WS 客户端工件就能够与 Web 服务进行交互了。

  5. 如上一步所述,创建另一个库包装模块项目。此次,将包装上面屏幕快照所显示的 lib 文件夹中的所有 JAR 文件。

    注意:可通过按下 Ctrl 键或 Shift 键的同时单击鼠标,以此来选择 lib 文件夹中找到的所有 JAR 文件。

    之所以需要 lib 文件夹中的 JAR 文件,是因为它们提供了业务逻辑所需的 JAX-WS 基础结构,下面部分将介绍该业务逻辑。

添加用户界面和业务逻辑

在本部分,您将重新创建在本教程的第一部分中生成的用户界面。但是,您是在 TopComponent 中创建用户界面,而不是在 JFrame 窗体中进行创建。TopComponent 是一个属于 NetBeans API 的类。它会在 NetBeans IDE 中或 NetBeans 平台上构建的应用程序中嵌入一个可视组件,例如,您现在要创建的可视组件。在 TopComponent 上创建用户界面与在 JFrame 窗体上提供用户界面一样简便,因为直观的 GUI 生成器(也称为 Matisse)支持这两种创建方法。在具有 TopComponent 后,您需要提供业务逻辑以连接到本部分开头处包装的 JAX-WS 客户端工件。最后,您需要将用户界面连接到业务逻辑上,与前面的操作相同。

  1. 选择“文件”>“新建项目”,然后从“NetBeans 插件模块”类别中选择“模块项目”。单击“下一步”。创建一个名为 AsyncWSClientUI 的模块项目。确保让向导将新模块添加到模块套件中,然后选择“设置为主项目”,如下所示:

    单击“下一步”。

  2. 在“基本模块配置”面板中,键入所需的任何代码名称库,如 org.netbeans.modules.asyncwsclientui。单击“完成”。

    在向导的结尾处单击“完成”后,请右键单击 "AsyncWSClientUI" 项目节点,选择“属性”,然后在“源”标签中将源代码级别设置为 1.5,这是因为我们将在代码中使用通用性。当系统提示您执行此操作时,您可以选择启用警告(如果需要),但是这样做对本教程中的方案无关紧要。

  3. 右键单击 "AsyncWSClientUI" 项目节点,然后选择“新建”>“窗口组件”。创建一个窗口组件,在向导的第一页中指定它位于 "editor" 窗口位置中,并且指定在应用程序启动时打开该组件。为类名前缀指定 AsyncWSClient。无需指定图标。单击“完成”。
  4. Bundle.Properties 文件中,将 CTL_AsyncWSClientTopComponent 键更改为如下内容:

    CTL_AsyncWSClientTopComponent=Window
  5. 参考以下列出的前面子部分的内容以重新创建用户界面和基本业务逻辑:
    • 首先,重新执行上面的设计用户界面子部分所述的步骤 2 和 3。通过执行此操作,您会重新创建用户界面。
    • 接下来,重新执行添加业务逻辑子部分的操作。需要注意的是,不按照该部分的步骤 3 和 4 所述来执行拖放操作,而是按照步骤 5 所述使用完整的代码。
    • 最后,重新执行将用户界面连接到业务逻辑上子部分的操作。

    注意:您会看到几个带有红色下划线的代码行。这说明这些行存在尚未声明的代码依赖关系。在后续步骤中,您将声明所需的依赖关系。

  6. 右键单击 "AsyncWSClientUI" 项目节点,选择“属性”,然后在“项目属性”对话框中选择“库”。单击“添加依赖关系”。如果尚未添加以下依赖关系,请进行添加:AsyncWSClientJAX-WS-JARSSwing 布局扩展集成UI 实用程序 API实用程序 API窗口系统 API。对于 AsyncWSClient 项目,请重复此步骤,但此次仅添加 JAX-WS-JARS
  7. 右键单击 "WebServiceLocator" 项目,然后选择“清理并生成所有”。这将构建整个应用程序,并且“输出”窗口中会显示“生成成功”消息。

调整和运行应用程序

现在,我们已创建了一个完整的应用程序,它包含三个部分:应用程序核心(NetBeans 平台);NetBeans IDE 提供的所有模块;最后是我们自己的模块(两个包装模块以及一个提供用户界面和业务逻辑的模块)。但是,我们并不需要 NetBeans IDE 提供的模块,因此,在继续执行操作之前,需要将从应用程序中排除这些模块。另外,由于希望应用程序尽可能与原始应用程序一致,因此,我们还会删除 NetBeans 平台缺省提供的所有菜单和工具栏。此外,我们还会为应用程序标题栏设置标题。我们将在 NetBeans IDE 中运行应用程序并对其进行测试,结果发现,在本教程第一部分使用的 Web 服务的 Web 服务客户端是一个完全正常使用的应用程序。

  1. 右键单击 "WebServiceLocator" 项目节点,选择“属性”,然后在“项目属性”对话框中单击“应用程序”。选择“创建独立的应用程序”。单击“排除”,如下所示:

    在 "WebServiceLocator" 中添加空格以将应用程序标题更改为 "Web Service Locator"。单击“确定”。

  2. 依次展开 "AsyncWSClientUI"、“重要文件”、“XML 层”、"<上下文中的此层>" 和 "Menu Bar"。选择 Menu Bar 内容(按住 Ctrl 键的同时单击第一项内容,然后按住 Shift 键的同时单击最后一项内容)。单击鼠标右键,然后选择“删除”;当系统提示您确认删除时,请单击“是”。IDE 将在 layer.xml 文件添加标记,请稍等片刻。对 "Toolbars" 文件夹重复执行相同的步骤。在 XML 层文件的 "XML" 视图中,请注意已添加了下列标记:

        <folder name="Menu">
            <file name="Edit_hidden"/>
            <file name="File_hidden"/>
            <file name="GoTo_hidden"/>
            <file name="Help_hidden"/>
            <file name="Tools_hidden"/>
            <file name="View_hidden"/>
            <file name="Window_hidden"/>
        </folder>
        <folder name="Toolbars">
            <file name="Edit_hidden"/>
            <file name="File_hidden"/>
            <file name="Memory_hidden"/>
            <file name="Standard.xml_hidden"/>
        </folder>

    注意:也可以将上面的标记直接粘贴到 layer.xml 文件中,而不是使用此步骤中所述的“删除”菜单项。

  3. 右键单击 Web Service Locator 应用程序,然后选择“运行”。将启动该应用程序,并显示缺省的 NetBeans 平台闪屏,然后显示新的应用程序。

    注意:在第一次运行该应用程序,它显得非常大。这是因为它使用了 NetBeans 平台的缺省分辨率。如果在应用程序运行时调整其大小,则会保存这些设置。但是,如果使用“清理项目”或“清理并生成项目”命令来清理项目,则会丢失这些设置,应用程序的分辨率将恢复为 NetBeans 平台的缺省设置。

    请试用一下该应用程序,您会注意到它与原始应用程序的工作方式相同,不同之处在于:现在它是在 NetBeans 平台上运行的,如下所示:

    如果未自动打开窗口组件,或者在执行后续步骤之前意外关闭,只需将以下内容插入到 layer.xml 文件中,然后在 IDE 中重新启动该应用程序,并从新建的 Client 菜单中打开该窗口组件:

      <folder name="Menu">
          <folder name="Client">
                <file name="org-netbeans-modules-asyncwsclientui-AsyncWSClientAction.shadow">
                   <attr name="originalFile" stringvalue="Actions/Window/org-netbeans-modules-asyncwsclientui-AsyncWSClientAction.instance"/>
                </file>
          </folder>
      </folder>

    然后,从 layer.xml 文件中删除上面的标记并再次运行该应用程序。该菜单将不再存在,但会打开窗口组件,因为在通过菜单项打开该组件时保存了其打开状态。

  4. 在“文件”窗口 (Ctrl-2) 中,依次展开 "Web Service Locator"、"branding" 和 "modules"。展开 "org-netbeans-core-windows.jar" 并继续展开直至找到 "Bundle.properties" 文件为止。打开该文件,您会注意到以下键值对:

       CTL_MainWindow_Title=Web Service Locator {0}
       CTL_MainWindow_Title_No_Project=Web Service Locator {0}

    现在,删除每行中的 {0}。通过执行此操作,您可以删除上面步骤 3 中屏幕快照的标题栏中显示的数字。再次运行并试用一下应用程序,您会看到以下内容:

创建分发

当基本应用程序创建完成后,您可以为其提供分发了。分发可以采用 ZIP 文件形式(如下所述),也可以是可启动的 Web 应用程序。

  1. 右键单击 Web Service Locator 应用程序,然后选择“生成 ZIP 分发”。IDE 将运行 Ant 目标。“输出”窗口将显示 ZIP 文件的创建位置。
  2. 在文件系统中,找到 ZIP 文件并对其进行解压缩。在分发的 etc 文件夹中包含了一个 CONF 文件。打开此文件并设置 JDK。例如,按如下所示对其进行设置:

    jdkhome="C:\Program Files\Java\jdk1.5.0_06"
  3. 接下来,将 -J-Dnb.tabs.suppressCloseButton=true 添加到 default_options 变量中。这会隐藏窗口组件右上角的 "x",这样用户就无法关闭该组件了。

    现在,CONF 文件显示如下,其更改内容将以粗体表示:

    # ${HOME} will be replaced by JVM user.home system property
    default_userdir="${HOME}/.${APPNAME}/dev"
    default_mac_userdir="${HOME}/Library/Application Support/${APPNAME}/dev"
    
    # options used by the launcher by default, can be overridden by explicit
    # command line switches
    default_options="-J-Xms24m -J-Xmx64m -J-Dnetbeans.logger.console=true -J-ea -J-Dnb.tabs.suppressCloseButton=true"
    
    # default location of JDK/JRE, can be overridden by using --jdkhome <dir> switch
    jdkhome="C:\Program Files\Java\jdk1.5.0_06"
    
    # clusters' paths separated by path.separator (semicolon on Windows, colon on Unices)
    #extra_clusters=
  4. 通过 bin 文件夹中的可执行文件来运行应用程序。请注意,标签右上角现在没有 "x" 了:

将 Google 工具栏添加到应用程序中

IDE 提供的一个模块就是将“更新中心”菜单项添加到“工具”菜单中。当用户选择此菜单项时,将打开“更新中心向导”。通过此向导,您可以在应用程序中选择并安装各种模块,这样用户就可以方便并有效地扩展应用程序并扩充其功能了。

  1. 创建 Google 工具栏
  2. 要安装该工具栏或任何其他模块,请右键单击 Web Service Locator 应用程序,然后选择“属性”。在“项目属性”对话框中,单击“库”。展开 "nb5.5",然后选择“更新中心”。
  3. 接下来,展开 "platform6",然后选择“自动更新”。单击“确定”退出“项目属性”对话框。
  4. layer.xml 文件中,删除用于隐藏“工具”菜单的标记:

    <file name="Tools_hidden"/>
  5. 右键单击该项目,然后选择“清理并生成所有”。单击鼠标右键,然后选择“运行项目”。
  6. 在“工具”菜单中,选择“更新中心”,然后使用它来安装模块。例如,如果安装 Google 工具栏并为应用程序提供外部 HTML 浏览器及其相关模块,则应用程序会如下所示:




Bookmark this page

del.icio.us furl simpy slashdot technorati digg
Companion
Projects:
MySQL Database Server   Open JDK: an Open SourceJDK   GlassFish Community: an Open Source Application Server    Mobile & Embedded Community    Open Solaris   java.net - The Source for Java Technology Collaboration   Virtual Box - full virtualizer  Open ESB - The Open Enterprise Service Bus Powered by