本文档快速演示了如何创建一个简单的 NetBeans 平台应用程序和模块,并在生成框架中使用 Maven。在本文档中,您将使用 Maven 原型来创建 NetBeans 平台应用程序和模块。您将使用 Swing UI 工具包和 "Matisse" GUI 生成器来在模块中创建一个窗口组件。利用 NetBeans 平台的模块化特性,您可以简单地通过添加新模块来开发和扩展应用程序的功能。
本文档根据基于 Ant 的
针对 NetBeans 平台的 NetBeans 平台快速入门
而编写,阐述了使用 Ant 和 Maven 开发 NetBeans 平台应用程序的一些不同之处。在了解 Maven 与 Ant 之间的不同之处后,您便可以轻松地继续学习
NetBeans 平台学习资源
上的其他教程。
如果您使用的是 NetBeans IDE 6.8,请参见
在 NetBeans 平台 6.8 中使用 Maven 的快速入门
。
如果您不熟悉 NetBeans 平台,则可能需要观看截屏视频系列
最主要的 10 个 NetBeans API
。
*注意:*为开发适用于 NetBeans 平台的应用程序,您无需下载该平台的独立版本。通常,您是在 NetBeans IDE 中开发应用程序和模块,并且只包含运行 NetBeans 平台和您的应用程序所需的模块。
在开始本教程之前,您可以先阅读下面这些文档。
Chapter 1. Introducing Apache Maven
(第 1 章. Apache Maven 简介,来自
Maven: The Definitive Guide
(Maven:权威指南))
生成 GUI 应用程序简介
*注意:*Maven 支持是作为 Java SE 功能集的一部分被激活的。如果“选项”窗口中的 "Maven" 标签不可用,请通过创建一个 Java 应用程序来确认 Java SE 已被激活。
IDE 使用 Maven SCM 签出 Maven 工件。您可能希望检查本地计算机上是否安装了签出源文件所需的任何客户端,并对它们进行了正确配置。
有关 Maven SCM 的详细信息,请参见
Maven SCM 页
。
查看 Maven 资源库
Maven 用于生成所有项目的工件均存储在本地 Maven 资源库中。如果某一工件被声明为项目依赖关系,则会将其从已注册的某个远程资源库下载到您的本地资源库中。
缺省情况下,已注册 NetBeans 资源库和一些常见的索引 Maven 资源库,并将它们列在资源库浏览器窗口中。NetBeans 资源库包含生成项目所需的大多数公共工件。您可以使用“Maven 资源库”浏览器查看本地和远程资源库的内容。您可以展开“本地库”节点以查看本地存在的工件。NetBeans 资源库节点下列出的工件可以添加为项目依赖关系,但并非所有这些工件都在本地存在。仅当这些工件被声明为项目依赖关系时,才会将其添加到“本地库”。
打开“Maven 资源库”浏览器:
有关管理 Maven 类路径依赖关系和在 IDE 中使用 Maven 资源库的详细信息,请参见
Best Practices for Apache Maven in NetBeans 6.x
(NetBeans 6.x 中 Apache Maven 的最佳做法)的
Dependency Management
(依赖关系管理)部分。
要观看使用工件查看器的演示,请参见
处理 Maven 依赖关系
截屏视频。
在此部分,您将使用“新建项目”向导来通过 Maven 原型创建 NetBeans 应用程序。该向导会创建您在 NetBeans 平台上开发应用程序所需的 Maven 模块项目。该向导还提供了在应用程序项目中创建 NetBeans 模块的选项,但在本教程中,您将单独创建每个模块。
请执行下列步骤,以使用“新建项目”向导创建 NetBeans 平台应用程序。
*注意:*如果这是您第一次使用 Maven 创建 NetBeans 平台应用程序,则创建项目可能会耗费一些时间,因为 IDE 需要从 NetBeans 资源库中下载所有必需的工件。
单击“完成”后,缺省情况下 IDE 会创建以下 Maven 项目类型。
*NetBeans 平台应用程序。*此项目是平台应用程序的容器项目,它列出了要包含的模块和项目资源库的位置。此项目不包含任何源文件。IDE 在此项目的子目录中生成包含源文件和资源的模块。
*基于 NetBeans 平台的应用程序。*此项目指定编译应用程序所需的工件(源文件)。在此项目的
pom.xml
文件中,指定了必需的依赖关系(IDE 工件和模块工件)。如果展开“库”节点,可以看到 NetBeans 平台应用程序所需的库。
*平台应用程序标记资源。*此项目包含用于标记应用程序的资源。
<groupId>com.mycompany</groupId>
<artifactId>MavenPlatformWordApp</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.mycompany</groupId>
<artifactId>*MavenWordEngine*</artifactId>
<packaging>nbm</packaging>
<version>1.0-SNAPSHOT</version>
<name>MavenWordEngine NetBeans Module</name>
要生成 NetBeans 模块,您需要使用
nbm-maven-plugin
。如果查看该模块的 POM,可以看到 IDE 自动为
packaging
指定了
nbm
,并将
nbm-maven-plugin
指定为生成插件。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>*nbm-maven-plugin*</artifactId>
<version>3.2-SNAPSHOT</version>
<extensions>true</extensions>
</plugin>
如果查看 NetBeans 平台应用程序的 POM,可以看到
MavenWordEngine
已被添加到应用程序的模块列表中。
<modules>
<module>branding</module>
<module>application</module>
<module>*MavenWordEngine*</module>
</modules>
<groupId>org.netbeans.cluster</groupId>
<artifactId>platform</artifactId>
<version>${netbeans.version}</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>branding</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
如果展开基于 NetBeans 平台的应用程序的“库”节点,可以看到其中包含对标记模块和其他一些库的依赖关系,这些库是生成应用程序所需的群集依赖关系。
单击“完成”后,可以在“项目”窗口中看到 IDE 在“源包”下面的
com.mycompany.mavenwordengine
中生成了
TextTopComponent.java
类。IDE 还在“其他源”下面的
com.mycompany.mavenwordengine
中生成了其他资源文件。在本练习中,您将仅编辑
TextTopComponent.java
。
可以在“文件”窗口中查看项目的结构。要编译 Maven 项目,“源包”(“文件”窗口中的
src/main/java
目录)下只能放置源文件。其他资源(例如,XML 文件)需要置于“其他源”(“文件”窗口中的
src/main/resources
目录)下面。
修改窗口组件
在本练习中,您将在窗口组件中添加一个文本区域和一个按钮。然后,您将修改由按钮调用的方法,以将文本区域中的字母更改为大写字母。
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
*String s = text.getText();
s = s.toUpperCase();
text.setText(s);*
可以在编辑器中使用代码完成功能来帮助键入代码。
如果您希望测试应用程序是否可以正常运行,可以右键单击 "MavenPlatformWordApp - NetBeans Platform based application" 项目节点,然后选择“使用依赖关系生成”。
映射到“使用依赖关系生成”的缺省操作为使用 Reactor 插件生成项目。在使用 Reactor 插件生成项目时,首先将生成子项目的依赖关系,然后再生成包含项目。“输出”窗口将显示生成顺序。
在本练习中,您将创建一个名为 TextFilter 的模块,并将该模块作为依赖关系添加到应用程序中。TextFilter 模块将提供一个服务,且仅包含一个接口。然后,可以通过使用 lookup 来访问其他模块中的服务。
在本练习中,您将执行下列步骤来创建 TextFilter 模块。
<groupId>${project.groupId}</groupId>
<artifactId>TextFilter</artifactId>
<version>${project.version}</version>
</dependency>
<groupId>org.codehaus.mojo</groupId>
<artifactId>nbm-maven-plugin</artifactId>
<version>3.2</version>
<extensions>true</extensions>
<configuration>
<publicPackages>
<publicPackage>com.mycompany.textfilter</publicPackage>
</publicPackages>
</configuration>
</plugin>
有关详细信息,请参见
nbm-maven-plugin 清单
。
在本练习中,您将创建
MyFilter
模块,然后将该模块添加为 TextFilter 的依赖关系。然后,可以通过查找 TextFilter 服务来调用 MyFilter 中的方法。
在本练习中,您将创建一个名为
MyFilter
的模块。要创建此模块,您需要执行与创建 TextFilter 模块相同的步骤。
import com.mycompany.textfilter.TextFilter;
import org.openide.util.lookup.ServiceProvider;
*@ServiceProvider(service=TextFilter.class)*
public class UpperCaseFilter *implements TextFilter {
public String process(String s) {
return s.toUpperCase();
请注意是如何使用标注来指定服务提供器的。有关
@ServiceProvider
标注以及 ServiceLoader 机制在 JDK 6 中的行为的详细信息,请参见《实用程序 API》文档。
修改 MavenWordEngine 模块
在本练习中,您将修改 Text 窗口组件中的事件处理程序,以使用 lookup 来调用 TextFilter 接口并访问 MyFilter 中的方法。在事件处理程序中添加代码之前,您需要声明对 TextFilter 模块的依赖关系。
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String s = text.getText();
*TextFilter filter = Lookup.getDefault().lookup(TextFilter.class);
if (filter != null) {
s = filter.process(s);
text.setText(s);
可以使用代码完成功能来帮助您完成代码。
此时,可以检查您的应用程序是否可以正常运行。接下来,您将添加一个新的窗口组件,该组件会显示您使用过滤器处理过的文本的历史记录。
public final class TextTopComponent extends TopComponent {
*private InstanceContent content;*
public TextTopComponent() {
initComponents();
setName(NbBundle.getMessage(TextTopComponent.class, "CTL_TextTopComponent"));
setToolTipText(NbBundle.getMessage(TextTopComponent.class, "HINT_TextTopComponent"));
// setIcon(Utilities.loadImage(ICON_PATH, true));
*content = new InstanceContent();
associateLookup(new AbstractLookup(content));*
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String s = text.getText();
TextFilter filter = Lookup.getDefault().lookup(TextFilter.class);
if (filter != null) {
*content.add(s);*
s = filter.process(s);
text.setText(s);
*result = org.openide.util.Utilities.actionsGlobalContext().lookupResult(String.class);
result.addLookupListener(new LookupListener() {
public void resultChanged(LookupEvent e) {
historyText.setText(result.allInstances().toString());
Licensed under the Apache license, version 2.0
Apache, Apache NetBeans, NetBeans, the Apache feather logo and the Apache NetBeans logo are trademarks of The Apache Software Foundation.
Oracle and Java are registered trademarks of Oracle and/or its affiliates.
The Apache NetBeans website conforms to the Apache Software Foundation Privacy Policy