blob: 798e26b45f566e8392957721c76a31f64badf3c8 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>使用 Maven 创建 NetBeans 模块套件</title>
<link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="AUDIENCE" content="NBUSER"/>
<meta name="TYPE" content="ARTICLE"/>
<meta name="EXPIRES" content="N"/>
<meta name="indexed" content="y"/>
<meta name="description" content="A short demonstration of how to use Maven to create and run a NetBeans Platform Module Suite."/>
<!-- Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
<!-- Use is subject to license terms.-->
</head>
<body>
<h1>使用 Maven 创建 NetBeans 模块套件</h1>
<p>本文档演示了如何通过 Maven 原型创建 NetBeans 平台模块套件,并在 IDE 安装中生成和安装此套件。在本教程中,您将创建一个 Maven 模块套件项目,其中包含三个 NetBeans 模块作为子项目。包含子项目的 Maven 项目是一个简单的 POM 项目,该项目声明了套件的编译方式和安装目标。
</p>
<p>本文档根据基于 Ant 的 <a href="https://platform.netbeans.org/tutorials/nbm-selection-1.html">NetBeans 选择管理教程</a>而编写,阐述了使用 Ant 和 Maven 开发 NetBeans 平台模块套件的一些不同之处。在了解其中的一些不同之处后,您便可以轻松地继续学习 <a href="https://netbeans.org/kb/trails/platform_zh_CN.html">NetBeans 平台学习资源</a>上的其他教程。</p>
<p class="tips">如果您不熟悉 NetBeans 平台,则可能需要观看截屏视频系列<a href="https://platform.netbeans.org/tutorials/nbm-10-top-apis.html">最主要的 10 个 NetBeans API</a></p>
<p><b>目录</b></p>
<p><img src="../../images/articles/69/netbeans-stamp69.png" class="stamp" width="114" height="114" alt="本页上的内容适用于 NetBeans IDE 6.5、6.7、6.8" title="本页上的内容适用于 NetBeans IDE 6.5、6.7、6.8" /></p>
<ul class="toc">
<li><a href="#config">在 IDE 中使用 Maven</a>
<ul>
<li><a href="#config1">配置 Maven 选项</a></li>
<li><a href="#config2">查看 Maven 资源库</a></li>
</ul></li>
<li><a href="#01">创建 NetBeans 平台模块套件</a></li>
<li><a href="#02">修改 MyAPI 模块</a>
<ul>
<li><a href="#02a">创建类</a></li>
<li><a href="#02b">指定公共包</a></li>
</ul>
</li>
<li><a href="#03">创建 MyViewer 模块</a>
<ul>
<li><a href="#03b">创建窗口组件</a></li>
</ul>
</li>
<li><a href="#04">创建 MyEditor 模块</a>
<ul>
<li><a href="#04b">添加操作</a></li>
<li><a href="#04c">添加编辑器组件</a></li>
</ul>
</li>
<li><a href="#05">生成和运行模块套件</a>
<ul>
<li><a href="#05a">声明直接依赖关系</a></li>
<li><a href="#05b">指定 NetBeans 安装的位置</a></li>
<li><a href="#05c">运行应用程序</a></li>
</ul>
</li>
<li><a href="#06">动态修改 Lookup</a></li>
</ul>
<p><b>要学习本教程,您需要具备下表中列出的软件和资源。</b></p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">软件或资源</th>
<th class="tblheader" scope="col">要求的版本</th>
</tr>
<tr>
<td class="tbltd1"><a href="http://download.netbeans.org/netbeans/6.9/beta/">NetBeans IDE</a></td>
<td class="tbltd1">版本 6.9</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Java Developer Kit (JDK)</a></td>
<td class="tbltd1">版本 6</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://maven.apache.org/">Maven</a></td>
<td class="tbltd1">版本 2.0.9 或更高</td>
</tr>
</tbody>
</table>
<p><strong class="notes">注意:</strong>为开发适用于 NetBeans 平台的应用程序,您无需下载该平台的独立版本。通常,您是在 NetBeans IDE 中开发应用程序和模块,并且只包含运行 NetBeans 平台和您的应用程序所需的模块。</p>
<p>在开始本教程之前,您可以先阅读下面这些文档。</p>
<ul>
<li><a href="http://wiki.netbeans.org/NetBeansDeveloperFAQ">NetBeans 开发者常见问题解答</a></li>
<li><a href="http://wiki.netbeans.org/MavenBestPractices">Best Practices for Apache Maven in NetBeans 6.x</a>(NetBeans 6.x 中 Apache Maven 的最佳做法)</li>
<li><a href="http://www.sonatype.com/books/maven-book/reference/introduction.html">Chapter 1. Introducing Apache Maven</a>(第 1 章. Apache Maven 简介,来自 <a href="http://www.sonatype.com/books/maven-book/reference/public-book.html">Maven: The Definitive Guide</a>(Maven:权威指南))</li>
<li><a href="https://netbeans.org/kb/docs/java/gui-functionality_zh_CN.html">生成 GUI 应用程序简介</a></li>
</ul>
<!-- =================================================================== -->
<!-- +++++++++++++++ Configuring Maven +++++++++++++++++++++++++++++++++ -->
<h2><a name="config"></a>在 IDE 中使用 Maven</h2>
<p>如果这是您第一次创建 Maven 项目,则您会希望了解 Maven 配置设置和 Maven 资源库浏览器。</p>
<div class="indent">
<a name="config1"></a>
<h3>配置 Maven 选项</h3>
<p>您可以使用“选项”窗口中的 &quot;Maven&quot; 标签来在 IDE 中配置 Maven 的行为,并检查您的配置是否正确。</p>
<ol>
<li>在“选项”窗口中选择“其他”类别,然后单击 &quot;Maven&quot; 标签。</li>
<li>指定 Maven 在本地的安装位置(要求为 2.0.9 或更高版本)。</li>
<li>确认本地 Maven 资源库的位置正确无误。</li>
<li>单击“确定”。</li>
</ol>
<p>在大多数情况下,如果您执行了典型的 Maven 配置,则“选项”窗口中的信息应该已经是正确的。</p>
<p class="notes"><strong>注意:</strong>Maven 支持是作为 Java SE 功能集的一部分被激活的。如果“选项”窗口中的 &quot;Maven&quot; 标签不可用,请通过创建一个 Java 应用程序来确认 Java SE 已被激活。</p>
<h3><a name="config2"></a>查看 Maven 资源库</h3>
<p>Maven 用于生成所有项目的工件均存储在本地 Maven 资源库中。如果某一工件被声明为项目依赖关系且尚未安装,则会将其从已注册的某个远程资源库下载到您的本地资源库中。</p>
<p>缺省情况下,已注册 NetBeans 资源库和一些常见的索引 Maven 资源库,并将它们列在资源库浏览器窗口中。NetBeans 资源库包含生成项目所需的大多数公共工件。您可以使用“Maven 资源库”浏览器查看本地和远程资源库的内容。您可以展开“本地库”节点以查看本地存在的工件。NetBeans 资源库节点下列出的工件可以添加为项目依赖关系,但并非所有这些工件都在本地存在。仅当这些工件被声明为项目依赖关系时,才会将其添加到“本地库”。</p>
<p>打开“Maven 资源库”浏览器:</p>
<ul>
<li>从主菜单中选择“窗口”&gt;“其他”&gt;“Maven 资源库浏览器”。<br/>
<img src="../../images/tutorials/maven-quickstart68/maven-nbm-netbeans-repo.png" alt="“Maven 资源库”浏览器的屏幕快照" title="“Maven 资源库”浏览器的屏幕快照" class="margin-around b-all" />
</li>
</ul>
</div>
<!-- =================================================================== -->
<!-- +++++++++++++++++++ Creating the Module Suite +++++++++++++++++++++ -->
<h2><a name="01"></a>创建 NetBeans 平台模块套件</h2>
<p>在此部分,您将使用“新建项目”向导来通过 Maven 原型创建 NetBeans 平台模块套件。此向导将创建一个包含模块项目的 POM 项目。在此向导中,您还将创建一个模块作为套件的子项目。
</p>
<ol>
<li>打开“新建项目”向导,然后在 &quot;Maven&quot; 类别中选择“Maven NetBeans 模块套件”。单击“下一步”。</li>
<li>在“项目名称”中键入 <strong>MavenSelectionSuite</strong>。单击“下一步”。</li>
<li>选择“创建模块项目”,然后键入 <strong>MyAPI</strong> 作为模块名称。单击“完成”。</li>
</ol>
<p>单击“完成”后,IDE 会创建 MavenSelectionSuite 项目以及子项目 &quot;MyAPI NetBeans Module&quot;。<br/>
<img src="../../images/tutorials/maven-suite/maven-suite-projectswindow.png" alt="“项目”窗口的屏幕快照" title="“项目”窗口的屏幕快照" class="margin-around b-all" />
</p>
<p>MavenSelectionSuite 是一个 POM 项目,它是一个用来包含子项目(在本例中为 NetBeans 模块项目)的容器。POM 项目不包含任何源文件。此项目的 POM 包含用于编译套件的说明;如果您查看此项目的 POM,则可以看到对于 packaging 指定了 <tt>pom</tt></p>
<pre class="examplecode"> &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
&lt;groupId&gt;com.mycompany&lt;/groupId&gt;
&lt;artifactId&gt;MavenSelectionSuite&lt;/artifactId&gt;
<strong>&lt;packaging&gt;pom&lt;/packaging&gt;</strong>
&lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
&lt;name&gt;MavenSelectionSuite Netbeans Module Suite&lt;/name&gt;
...
&lt;properties&gt;
&lt;netbeans.version&gt;RELEASE69&lt;/netbeans.version&gt;
&lt;/properties&gt;
<strong>&lt;modules&gt;
&lt;module&gt;MyAPI&lt;/module&gt;
&lt;/modules&gt;</strong>
&lt;/project&gt;</pre>
<p>POM 还包含一个模块列表,当生成 POM 项目时,将包含这些模块。您可以看到 MyAPI 项目已被列为一个模块。</p>
<p>如果在“项目”窗口中展开“模块”节点,则会看到 MyAPI 项目已被列为一个模块。在“文件”窗口中,可以看到 MyAPI 项目目录位于 <tt>MavenSelectionSuite</tt> 目录中。当在 POM 项目的目录中创建新项目时,IDE 会自动将该项目添加到 POM 的模块列表中,在生成和运行 POM 项目时将包含这些模块。</p>
<!--<p>The project also contains other XML files containing metadata about the project such as <tt>profiles.xml</tt>.
The <tt>profiles.xml</tt> file specifies the path to the NetBeans installation and is used by the IDE when running the project.
-->
<p class="tips">当通过 Maven 原型创建 NetBeans 平台模块套件时,您不需要像使用 Ant 时那样在“新建项目”向导中指定目标 NetBeans 平台安装。要设置 NetBeans 平台安装,则需要修改 POM 项目的 <tt>profiles.xml</tt> 文件中的 <tt>&lt;netbeans.installation&gt;</tt> 元素,并明确指定 NetBeans 平台安装的路径。有关详细信息,请参见本教程中的<a href="#05b">指定 NetBeans 安装的位置</a>部分。</p>
<!--see https://netbeans.org/bugzilla/show_bug.cgi?id=185941.-->
<!-- =================================================================== -->
<!-- ++++++++++++++++++ Adding Class to MyAPI Module +++++++++++++++++++ -->
<h2><a name="02"></a>修改 MyAPI 模块</h2>
<p>在创建模块套件时,您创建了 MyAPI 模块,但现在,您需要在该模块中创建一个类,并向其他模块公开该类。</p>
<div class="indent">
<a name="02a"></a>
<h3>在 MyAPI 模块中创建类</h3>
<p>在本练习中,您将创建一个名为 <tt>APIObject</tt> 的简单类。<tt>APIObject</tt> 的每个实例都将是唯一的,因为每创建一个 <tt>APIObject</tt> 的新实例,字段 <tt>index</tt> 都会递增 1。</p>
<ol>
<li>在“项目”窗口中展开 MyAPI 项目。</li>
<li>右键单击“源包”节点,然后选择“新建”&gt;“Java 类”。</li>
<li>在“类名”中键入 <strong>APIObject</strong>,然后从“包”下拉列表中选择 <tt>com.mycompany.mavenselectionsuite</tt>。单击“完成”。</li>
<li>修改该类以声明一些字段,并添加以下简单方法。
<pre class="examplecode">
public final class APIObject {
private final Date date = new Date();
private static int count = 0;
private final int index;
public APIObject() {
index = count++;
}
public Date getDate() {
return date;
}
public int getIndex() {
return index;
}
public String toString() {
return index + &quot; - &quot; + date;
}
}</pre>
</li>
<li>修复导入并保存更改。</li>
</ol>
<a name="02b"></a>
<h3>指定公共包</h3>
<p>在本教程中,您将创建其他模块,这些模块需要访问 <tt>APIObject</tt> 中的方法。在本练习中,您将公开 MyAPI 模块的内容,以便其他模块可以访问其中的方法。要将 <tt>com.mycompany.mavenselectionsuite</tt> 包声明为公共包,则需要在 POM 中修改 <tt>nbm-maven-plugin</tt><tt>configuration</tt> 元素,以指定将作为公共包导出的包。您可以在编辑器中更改 POM,也可以通过在项目的属性窗口中选择要公开的包进行更改。</p>
<ol>
<li>右键单击项目节点,然后选择“属性”以打开属性窗口。</li>
<li>在“公共包”<strong></strong>类别中选择 &quot;com.mycompany.mavenselectionsuite&quot;<strong></strong> 包。单击“确定”。<img src="../../images/tutorials/maven-suite/maven-suite-publicpackages.png" alt="属性窗口中“公共包”的屏幕快照" title="属性窗口中的“公共包”" class="margin-around b-all" />
<p>在选择要导出的包之后,IDE 会修改 POM 中的 <tt>nbm-maven-plugin</tt> 元素以指定该包。</p>
<pre class="examplecode">&lt;plugin&gt;
&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
&lt;artifactId&gt;nbm-maven-plugin&lt;/artifactId&gt;
&lt;extensions&gt;true&lt;/extensions&gt;
&lt;configuration&gt;
&lt;publicPackages&gt;
<strong>&lt;publicPackage&gt;com.mycompany.mavenselectionsuite&lt;/publicPackage&gt;</strong>
&lt;/publicPackages&gt;
&lt;/configuration&gt;
&lt;/plugin&gt;</pre></li>
<li>右键单击项目,然后选择“生成”。</li>
</ol>
<p>在生成项目时,<tt>nbm-maven-plugin</tt> 将在 JAR 的 <tt>MANIFEST.MF</tt> 中生成一个清单头,用于指定公共包。</p>
<p class="tips">有关详细信息,请参见 <a href="http://mojo.codehaus.org/nbm-maven-plugin/manifest-mojo.html#publicPackages">nbm-maven-plugin 清单文档</a></p>
</div>
<!-- =================================================================== -->
<!-- ++++++++++++++++++ Creating the MyViewer Module +++++++++++++++++++ -->
<h2><a name="03"></a>创建 MyViewer 模块</h2>
<p>在此部分,您将创建一个名为 MyViewer 的新模块,然后添加一个窗口组件和两个文本字段。该组件将实现 <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/LookupListener.html">LookupListener</a></tt> 以侦听对 <a href="http://wiki.netbeans.org/DevFaqLookup">Lookup</a> 的更改。</p>
<div class="indent">
<h3><a name="03a"></a>创建模块</h3>
<p>在本练习中,您将在 <tt>MavenSelectionSuite</tt> 目录中创建 MyViewer NetBeans 模块。</p>
<ol>
<li>从主菜单中选择“文件”&gt;“新建项目”(Ctrl-Shift-N)。</li>
<li>从 &quot;Maven&quot; 类别中选择“Maven NetBeans 模块”。单击“下一步”。</li>
<li>在“项目名称”中键入 <strong>MyViewer</strong></li>
<li>确认“项目位置”为 <tt>MavenSelectionSuite</tt> 目录。单击“完成”。</li>
<li>右键单击“项目”窗口中的“库”节点,然后选择“添加依赖关系”。</li>
<li>在“打开的项目”标签中选择 &quot;MyAPI NetBeans Module&quot;。单击“确定”。<br/>
<img src="../../images/tutorials/maven-suite/maven-suite-addapi.png" alt="属性窗口中“公共包”的屏幕快照" title="属性窗口中的“公共包”" class="margin-around b-all" />
</li>
</ol>
<p>单击“确定”后,IDE 会将工件添加到 POM 的依赖关系列表中,并在“库”节点下显示该工件。</p>
<p>如果查看 MyViewer 模块的 POM,则会看到该模块的父项目是 MavenSelectionSuite,对于 <tt>packaging</tt> 指定了 <tt>nbm</tt>,并且将使用 <strong>nbm-maven-plugin</strong> 将该项目生成为 NetBeans 模块。</p>
<pre class="examplecode">
&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
<strong>&lt;parent&gt;
&lt;groupId&gt;com.mycompany&lt;/groupId&gt;
&lt;artifactId&gt;MavenSelectionSuite&lt;/artifactId&gt;
&lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
&lt;/parent&gt;</strong>
&lt;groupId&gt;com.mycompany&lt;/groupId&gt;
&lt;artifactId&gt;MyViewer&lt;/artifactId&gt;
<strong>&lt;packaging&gt;nbm&lt;/packaging&gt;</strong>
&lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
&lt;name&gt;MyViewer NetBeans Module&lt;/name&gt;
</pre>
<a name="03b"></a>
<h3>创建窗口组件</h3>
<p>在本练习中,您将创建一个窗口组件,并添加两个文本字段。</p>
<ol>
<li>右键单击 MyViewer 项目,然后选择“新建”&gt;“窗口”。</li>
<li>从下拉列表中选择 &quot;navigator&quot;<strong></strong>,然后选择“在应用程序启动时打开”。单击“下一步”。</li>
<li>在“类名前缀”中键入 <strong>MyViewer</strong>。单击“完成”。</li>
<li>将两个标签从“组件面板”拖至该组件中,然后将顶部标签的文本更改为 <tt>&quot;[nothing selected]&quot;</tt><br/>
<img src="../../images/tutorials/maven-suite/maven-suite-myviewertopcomponent.png" alt="窗口组件的屏幕快照" title="窗口组件中的文本字段" class="margin-around b-all" />
</li>
<li>单击“源”标签,然后修改类签名以实现 <tt>LookupListener</tt>
<pre class="examplecode">public class MyViewerTopComponent extends TopComponent <strong>implements LookupListener</strong> {</pre></li>
<li>通过将插入光标置于代码行中并按 Alt-Enter 组合键来实现抽象方法。</li>
<li>添加以下 <tt>private</tt> 字段 <tt>result</tt> 并将初始值设置为 null。
<pre class="examplecode">private Lookup.Result result = null;</pre></li>
<li><tt>componentOpened()</tt><tt>componentClosed()</tt><tt>resultChanged()</tt> 方法进行以下更改。
<pre class="examplecode">
public void componentOpened() {
<strong>result = Utilities.actionsGlobalContext().lookupResult(APIObject.class);
result.addLookupListener(this);</strong>
}
public void componentClosed() {
<strong>result.removeLookupListener (this);
result = null;</strong>
}
public void resultChanged(LookupEvent le) {
<strong>Lookup.Result r = (Lookup.Result) le.getSource();
Collection c = r.allInstances();
if (!c.isEmpty()) {
APIObject o = (APIObject) c.iterator().next();
jLabel1.setText (Integer.toString(o.getIndex()));
jLabel2.setText (o.getDate().toString());
} else {
jLabel1.setText(&quot;[no selection]&quot;);
jLabel2.setText (&quot;&quot;);
}</strong>
}</pre>
<p>通过使用 <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#actionsGlobalContext%28%29">Utilities.actionsGlobalContext()</a></tt>,每当打开一个组件时,该类都可以全局侦听具有焦点的组件的 Lookup 对象。当关闭组件时,Lookup 即会被删除。<tt>resultChanged()</tt> 方法实现了 <tt>LookupListener</tt>,以便根据具有焦点的 <tt>APIObject</tt> 来更新窗体中的 JLabel。</p>
</li>
<li>修复导入,并确保添加了 <strong><tt>org.openide.util.Utilities</tt></strong>。保存所做的更改。</li>
</ol>
</div>
<!-- =================================================================== -->
<!-- ++++++++++++++++++ Creating the MyEditor Module +++++++++++++++++++ -->
<h2><a name="04"></a>创建 MyEditor 模块</h2>
<p>在此部分,您将创建一个名为 MyEditor 的新模块。该模块将包含一个 <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.html">TopComponent</a></tt>,该组件将通过 Lookup 提供 <tt>APIObject</tt> 的实例。您还将创建一个操作,用于打开 MyEditor 组件的新实例。</p>
<div class="indent">
<a name="04a"></a>
<h3>创建模块</h3>
<p>在本练习中,您将在 <tt>MavenSelectionSuite</tt> 目录中创建一个 NetBeans 模块,并添加对 MyAPI 模块的依赖关系。</p>
<ol>
<li>从主菜单选择“文件”&gt;“新建项目”。</li>
<li>从 &quot;Maven&quot; 类别中选择“Maven NetBeans 模块”。单击“下一步”。</li>
<li>在“项目名称”中键入 <strong>MyEditor</strong></li>
<li>确认“项目位置”为 <tt>MavenSelectionSuite</tt> 目录。单击“完成”。</li>
<li>在“项目”窗口中右键单击该项目的“库”节点,然后选择“添加依赖关系”。</li>
<li>在“打开的项目”标签中选择 &quot;MyAPI NetBeans Module&quot;。单击“确定”。</li>
</ol>
<a name="04b"></a>
<h3>添加操作</h3>
<p>在本练习中,您将创建一个类,该类用于在“文件”菜单中添加一个菜单项,以便打开名为 &quot;MyEditor&quot; 的组件。在下一个练习中,您将创建该组件。</p>
<!-- issue: https://netbeans.org/bugzilla/show_bug.cgi?id=186876
In this section you need to create the action first, then the component.
If the component is created first, the New Action wizard will choke on what looks like
a lockedFile exception on the bundle.properties and the entries for the action are not generated in layer.xml.-->
<ol>
<li>右键单击 MyEditor 项目,然后选择“新建”&gt;“操作”以打开“新建操作”对话框。</li>
<li>选择“始终启用”。单击“下一步”。</li>
<li>保留“GUI 注册”页中的缺省设置。单击“下一步”。</li>
<li>在“类名”中键入 <strong>OpenEditorAction</strong></li>
<li>在“显示名称”中键入 <strong>Open Editor</strong>。单击“完成”。
<p>IDE 在编辑器中打开 <tt>OpenEditorAction</tt> 类,并在 <tt>layer.xml</tt> 文件中添加以下内容。</p>
<pre class="examplecode">
&lt;filesystem&gt;
&lt;folder name=&quot;Actions&quot;&gt;
&lt;folder name=&quot;Build&quot;&gt;
&lt;file name=&quot;com-mycompany-myeditor-OpenEditorAction.instance&quot;&gt;
&lt;attr name=&quot;delegate&quot; newvalue=&quot;com.mycompany.myeditor.OpenEditorAction&quot;/&gt;
&lt;attr name=&quot;displayName&quot; bundlevalue=&quot;com.mycompany.myeditor.Bundle#CTL_OpenEditorAction&quot;/&gt;
&lt;attr name=&quot;instanceCreate&quot; methodvalue=&quot;org.openide.awt.Actions.alwaysEnabled&quot;/&gt;
&lt;attr name=&quot;noIconInMenu&quot; boolvalue=&quot;false&quot;/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;/folder&gt;
&lt;folder name=&quot;Menu&quot;&gt;
&lt;folder name=&quot;File&quot;&gt;
&lt;file name=&quot;com-mycompany-myeditor-OpenEditorAction.shadow&quot;&gt;
&lt;attr name=&quot;originalFile&quot; stringvalue=&quot;Actions/Build/com-mycompany-myeditor-OpenEditorAction.instance&quot;/&gt;
&lt;attr name=&quot;position&quot; intvalue=&quot;0&quot;/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;/folder&gt;
&lt;/filesystem&gt;</pre></li>
<li>修改 <tt>OpenEditorAction</tt> 类中的 <tt>actionPerformed</tt> 方法。
<pre class="examplecode">public void actionPerformed(ActionEvent e) {
MyEditor editor = new MyEditor();
editor.open();
editor.requestActive();
}</pre></li>
</ol>
<a name="04c"></a>
<h3>添加编辑器组件</h3>
<p>在本练习中,您将创建 MyEditor 组件,当 <tt>OpenEditorAction</tt> 调用该组件时,会在编辑器区域中将其打开。不能使用“窗口”组件模板,因为您需要的是组件的多个实例,而“窗口”组件用于创建单个组件。但是,您可以使用“JPanel 窗体”模板,然后对类进行修改以扩展 <tt>TopComponent</tt></p>
<ol>
<li>右键单击“源包”,然后选择“新建”&gt;“其他”,并从“Swing GUI 窗体”类别中选择“JPanel 窗体”。单击“下一步”。</li>
<li>在“类名”中键入 <strong>MyEditor</strong>,然后选择 &quot;com.mycompany.myeditor&quot;<tt></tt> 包。单击“完成”。</li>
<li>将两个文本字段拖至该组件中。</li>
<li>通过取消选择每个文本字段的 <tt>editable</tt> 属性来使这些文本字段成为只读字段。<br/>
<img src="../../images/tutorials/maven-suite/maven-suite-editableprop.png" alt="标签 editable 属性的屏幕快照" title="标签的 editable 属性" class="margin-around b-all" />
</li>
<li>单击“源”标签,然后修改类签名以扩展 <tt>TopComponent</tt> 而不是 <tt>javax.swing.JPanel</tt>
<pre class="examplecode">public class MyEditor extends <strong>TopComponent</strong></pre></li>
<li>将插入光标置于签名中,然后按 Alt-Enter 组合键以修复代码中的错误,方法是搜索 Maven 资源库,然后添加对 <tt>org.openide.windows</tt> 工件的依赖关系。修复导入。<br/>
<img src="../../images/tutorials/maven-suite/maven-suite-add-topcomponent.png" alt="标签 editable 属性的屏幕快照" title="标签的 editable 属性" class="margin-around b-all" />
</li>
<li>修改构造函数,以便每次调用 <tt>APIObject</tt> 类时都会创建该类的新实例。
<pre class="examplecode">
public MyEditor() {
initComponents();
<strong>APIObject obj = new APIObject();
associateLookup(Lookups.singleton(obj));
jTextField1.setText(&quot;APIObject #&quot; + obj.getIndex());
jTextField2.setText(&quot;Created: &quot; + obj.getDate());
setDisplayName(&quot;MyEditor &quot; + obj.getIndex());</strong>
}</pre>
<p>构造函数中的 <tt>associateLookup(Lookups.singleton(obj));</tt> 一行将创建一个 Lookup,其中包含 <tt>APIObject</tt> 的新实例。</p></li>
<li>修复导入并保存更改。</li>
</ol>
<p>组件中的文本字段仅显示 <tt>APIObject</tt> 中的索引值和日期。这样,您便可以看到每个 MyEditor 组件都是唯一的,并且 MyViewer 显示了具有焦点的 MyEditor 组件的详细信息。</p>
<p class="notes"><strong>注意:</strong><tt>OpenEditorAction</tt> 中的错误会在您保存对 <tt>MyEditor</tt> 所做的更改之后得以解决。 </p>
</div>
<!-- =================================================================== -->
<!-- ++++++++++++++++ Building and Running the Module +++++++++++++++++ -->
<h2><a name="05"></a>生成和运行模块套件</h2>
<p>此时,您几乎已经做好运行此套件的一切准备,以查看它是否可以正确生成、安装和运行。</p>
<div class="indent">
<a name="05a"></a>
<h3>声明直接依赖关系</h3>
<p>在生成和运行此套件之前,您需要首先修改 MyEditor 项目的一个依赖关系。如果您现在尝试生成模块套件,则“输出”窗口中的生成输出会通知您无法编译套件,因为 MyEditor 模块要求 <tt>org.openide.util-lookup</tt> 工件在运行时可用。</p>
<p>如果右键单击项目节点,然后选择“显示依赖关系图形”,则可以借助依赖关系图形查看器以可视方式查看模块依赖关系。</p>
<img src="../../images/tutorials/maven-suite/maven-suite-dependency-graph.png" alt="工件依赖关系图形的屏幕快照" title="工件依赖关系图形" class="margin-around b-all" />
<p>您可以看到 MyEditor 对 <tt>org.openide.util-lookup</tt> 不具有直接依赖关系。依赖关系是传递的,并且该工件在编译时对于项目可用,但如果要使该工件在运行时可用,则依赖关系必须是直接的。您需要修改 POM 以将该工件声明为直接依赖关系。</p>
<p>通过手动编辑 POM,或者使用“项目”窗口中的弹出式菜单项,可以使该工件成为直接依赖关系。</p>
<ol>
<li>展开 MyEditor 模块的“库”节点。</li>
<li>右键单击 <tt>org.openide.util-lookup</tt> 工件,然后选择“声明为直接依赖关系”。
<p>选择“声明为直接依赖关系”后,IDE 便会修改 POM 以将该工件添加为依赖关系。</p>
</li>
</ol>
<p class="notes"><strong>注意:</strong><tt>org.openide.util-lookup</tt> 工件已经是 MyViewer 模块的直接依赖关系。</p>
<a name="05b"></a>
<h3>指定 NetBeans 安装的位置</h3>
<p>缺省情况下,当使用 Maven 原型创建 NetBeans 平台模块套件时,不会指定任何目标 NetBeans 安装。要在 IDE 安装中安装并运行模块套件,您需要指定安装目录的路径,方法是编辑 POM 项目中的 <tt>profiles.xml</tt> 文件。</p>
<ol>
<li>展开 MavenSelectionSuite 应用程序下的“项目文件”节点,然后双击 <tt>profiles.xml</tt> 以在编辑器中打开该文件。</li>
<li>修改 <tt>&lt;netbeans.installation&gt;</tt> 元素以指定目标 NetBeans 平台的路径,然后保存更改。
<pre class="examplecode">
&lt;profile&gt;
&lt;id&gt;netbeans-ide&lt;/id&gt;
&lt;properties&gt;
&lt;netbeans.installation&gt;/home/me/netbeans-6.9&lt;/netbeans.installation&gt;
&lt;/properties&gt;
&lt;/profile&gt;</pre>
<p class="notes"><strong>注意:</strong>此路径需要指定包含可运行文件的 <tt>bin</tt> 目录所在的目录。</p>
<p>例如,在 OS X 上,您的路径可能与下面的内容类似。</p>
<pre class="examplecode">&lt;netbeans.installation&gt;/Applications/NetBeans/NetBeans6.9.app/Contents/Resources/NetBeans&lt;/netbeans.installation&gt;</pre>
</li>
</ol>
<a name="05c"></a>
<h3>运行应用程序</h3>
<p>现在,您已经指定了 IDE 的目标安装,接下来便可以对套件项目使用“运行”命令。</p>
<ol>
<li>右键单击 MavenSelectionSuite,然后选择“运行”。</li>
</ol>
<p>选择“运行”后,将会启动安装了模块套件的 IDE 实例。</p>
<img src="../../images/tutorials/maven-suite/maven-suite-run1.png" alt="MyViewer 和 MyEditor 窗口的屏幕快照" title="My Viewer 和 MyEditor 窗口" class="margin-around b-all" />
<p>MyViewer 窗口会在应用程序启动时打开,并将显示两个文本标签。现在,您可以从“文件”菜单中选择 &quot;Open Editor&quot;,以在编辑器区域中打开一个 MyEditor 组件。MyViewer 窗口将显示具有焦点的 MyEditor 组件的详细信息。</p>
<p>缺省情况下,模块套件项目的“运行”操作会被配置为使用 Reactor 插件以递归方式对指定为套件组成部分的模块执行生成和打包操作。您可以打开项目的属性窗口以查看被映射到 IDE 中的操作的 Maven 目标。
</p>
<img src="../../images/tutorials/maven-suite/maven-suite-run-action.png" alt="MyViewer 和 MyEditor 窗口的屏幕快照" title="My Viewer 和 MyEditor 窗口" class="margin-around b-all" />
<p>在属性窗口的“操作”类别中,可以看到被映射到“运行”操作的目标。</p>
</div>
<!-- =================================================================== -->
<!-- ++++++++++++++++ Modifying the Lookup with Button +++++++++++++++++ -->
<h2><a name="06"></a>动态修改 Lookup</h2>
<p>目前,每当您打开一个新的 MyEditor 组件时,都会创建一个新的 <tt>APIObject</tt>。在此部分,您将在 MyEditor 组件中添加一个按钮,以便将组件当前的 <tt>APIObject</tt> 替换为一个新对象。您将修改代码以使用 <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/lookup/InstanceContent.html">InstanceContent</a></tt> 动态处理对 Lookup 内容所做的更改。</p>
<ol>
<li>展开 MyEditor 项目,然后在编辑器的“设计”视图中打开 <tt>MyEditor</tt> 窗体。</li>
<li>将一个按钮拖至该窗体上,然后将该按钮的文本设置为 &quot;Replace&quot;。</li>
<li>右键单击该按钮,然后选择“事件”&gt; &quot;Action&quot; &gt; &quot;actionPerformed&quot; 来为该按钮创建事件处理程序方法,接着在源代码编辑器中打开该窗体。</li>
<li>将下面的 <tt>final</tt> 字段添加到类中。
<pre class="examplecode">public class MyEditor extends TopComponent {
<strong>private final InstanceContent content = new InstanceContent();</strong></pre>
<p>要利用 <tt>InstanceContent</tt>,您需要在构造函数中使用 <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/lookup/AbstractLookup.html#AbstractLookup%28org.openide.util.lookup.AbstractLookup.Content%29">AbstractLookup</a></tt> 而不是 <tt>Lookup</tt></p>
</li>
<li>通过复制类构造函数中的代码行并添加对 <tt>content.set</tt> 的调用,修改 <tt>jButton1ActionPerformed</tt> 事件处理程序方法的主体,使其与以下内容类似。
<pre class="examplecode">private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
<strong>APIObject obj = new APIObject();
jTextField1.setText (&quot;APIObject #&quot; + obj.getIndex());
jTextField2.setText (&quot;Created: &quot; + obj.getDate());
setDisplayName (&quot;MyEditor &quot; + obj.getIndex());
content.set(Collections.singleton (obj), null);</strong>
}</pre>
</li>
<li>修改构造函数以删除您复制到事件处理程序中的代码行,然后将 <tt>associateLookup</tt> 更改为使用 <tt>AbstractLookup</tt> 并添加 <tt>jButton1ActionPerformed(null);</tt>。现在,该构造函数应如下所示。
<pre class="examplecode">public MyEditor() {
initComponents();
<strong>associateLookup(new AbstractLookup(content));
jButton1ActionPerformed(null);</strong>
}</pre>
<p>您已将 <tt>jButton1ActionPerformed(null);</tt> 添加到构造函数中,以确保组件在创建时被初始化。</p></li>
<li>修复导入并保存更改。</li>
</ol>
<p>当再次运行模块套件项目时,便会在每个 MyEditor 组件中看到新按钮。单击该按钮时,文本字段中的索引编号将会增加。MyViewer 窗口中的标签也将更新以与新值相对应。</p>
<p>本教程演示了如何创建和运行您通过 Maven 原型创建的 NetBeans 平台模块套件。您看到了如何构建模块套件以及如何配置模块 POM 以指定公共包。还学习了如何修改父 POM 项目以指定目标 NetBeans 安装,这样 IDE 中的“运行”命令就可以安装该套件并启动平台的新实例。有关如何生成 NetBeans 平台应用程序和模块的更多示例,请参见 <a href="https://netbeans.org/kb/trails/platform_zh_CN.html">NetBeans 平台学习资源</a>中所列的教程。</p>
<!-- ======================================================================================== -->
<h2><a name="nextsteps"></a>另请参见</h2>
<p>有关在 NetBeans 平台上进行创建和开发的更多信息,请参见以下资源。</p>
<ul>
<li><a href="https://netbeans.org/kb/trails/platform_zh_CN.html">NetBeans 平台学习资源</a></li>
<li><a href="http://wiki.netbeans.org/NetBeansDeveloperFAQ">NetBeans 开发者常见问题解答</a></li>
<li><a href="http://bits.netbeans.org/dev/javadoc/">NetBeans API Javadoc</a></li>
</ul>
<p>如果您有任何有关 NetBeans 平台的问题,可随时写信至邮件列表 dev@platform.netbeans.org,或查看 <a href="https://netbeans.org/projects/platform/lists/dev/archive">NetBeans 平台邮件列表归档</a></p>
<!-- ======================================================================================== -->
</body>
</html>