blob: 40769e4bff5251f071885b6d72bb47326b9f5f07 [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>NetBeans Platform Quick Start Using Maven</title>
<link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css"/>
<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 create a simple
NetBeans Platform application and module and use Maven for the build framework."/>
<!-- Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
<!-- Use is subject to license terms.-->
<style type="text/css">
.examplecode {overflow:auto;width:680px; }
</style>
</head>
<body>
<h1>NetBeans Platform Quick Start Using Maven</h1>
<p>Welcome to the <a href="https://platform.netbeans.org/"><b>NetBeans Platform</b></a>!</p>
<p>This document is a quick demonstration of how to create a simple
NetBeans Platform application on top of the Maven build framework.
After using Maven archetypes to create the NetBeans Platform application build structure,
you use the Swing UI toolkit and "Matisse" GUI Builder to create a window
component. The modular aspect of the NetBeans Platform enables you to
expand the functionality
of your application by adding new features
during development or at runtime.
</p>
<p>This document is based on the Ant-based <a href="nbm-quick-start.html">NetBeans Platform Quick Start for NetBeans Platform</a>.
and illustrates some of the differences between using Ant and Maven to develop NetBeans Platform applications.
After you understand how Maven is different from Ant, you can easily proceed through other
tutorials on the <a href="https://netbeans.org/kb/trails/platform.html">NetBeans Platform Learning Trail</a>.</p>
<p><strong class="notes">Note: </strong>This document uses NetBeans Platform 7.2 and
NetBeans IDE 7.2. If you
are using an earlier version, see <a href="71/nbm-maven-quickstart.html">the previous version
of this document</a>.</p>
<p class="tips">If you are new to the NetBeans Platform, you might want to watch the screencast series
<a href="https://platform.netbeans.org/tutorials/nbm-10-top-apis.html">Top 10 NetBeans APIs</a>.</p>
<p><b>Contents</b></p>
<p><img src="../images/articles/74/netbeans_stamp_74_73_72.png" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 7.2" title="Content on this page applies to NetBeans IDE 7.2"/></p>
<ul class="toc">
<!-- <li><a href="#config">Configuring Maven</a></li>-->
<li><a href="#01">Creating a Maven Based NetBeans Platform Application Project</a></li>
<li><a href="#02">Creating Your First Maven Based NetBeans Module</a></li>
<li><a href="#04">Creating a Module that Defines a Service</a></li>
<li><a href="#05">Creating a Module that Implements a Service</a></li>
<li><a href="#06">Publishing Content into the Selection</a></li>
<li><a href="#07">Listening to the Selection</a></li>
<li><a href="#08">Running the Application</a></li>
</ul>
<p><b>To follow this tutorial, you need the software and resources listed in the following table.</b></p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">Software or Resource</th>
<th class="tblheader" scope="col">Version Required</th>
</tr>
<tr>
<td class="tbltd1"><a href="http://download.netbeans.org/">NetBeans IDE</a></td>
<td class="tbltd1">version 7.2</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">version 7 or above</td>
</tr>
</tbody>
</table>
<p><strong class="notes">Note:</strong> You do not need to download Maven because it
is bundled with the IDE. Optionally, use your own download of Maven, in which
case use the Options window to configure your Maven settings.</p>
<p>Before starting this tutorial you may want to familiarize yourself with
the following documentation:</p>
<ul>
<li><a href="http://wiki.netbeans.org/MavenBestPractices">Best Practices for Maven in NetBeans IDE</a></li>
<li><a href="http://www.sonatype.com/books/maven-book/reference/introduction.html">Chapter 1. Introducing Apache Maven</a>
(from <a href="http://www.sonatype.com/books/maven-book/reference/public-book.html">Maven: The Definitive Guide</a>)</li>
<li><a href="https://platform.netbeans.org/tutorials/nbm-maven-commandline.html">NetBeans Platform Command Line Tutorial</a></li>
</ul>
<!-- =================================================================== -->
<!-- +++++++++++++++ Configuring Maven +++++++++++++++++++++++++++++++++
<h2><a name="config"></a>Configuring Maven</h2>
<p>If this is your first Maven project you will want to check the Maven configuration settings in the Options window.
To complete this tutorial you must have Maven installed on your local system.
You can download the installer from the <a href="http://maven.apache.org/">Maven site</a>.</p>
<ol>
<li>Select the Miscellaneous category in the Options window and click the Maven tab.</li>
<li>Specify the location of your local Maven installation (requires 2.0.9 or newer).</li>
<li>Check that the location of the local Maven repository is correct.</li>
<li>Click OK.</li>
</ol>
<p>In most cases, if your Maven configuration is typical the information in the Options window should already be correct.</p>
<p class="notes"><strong>Note.</strong> Maven support is activated as part of the Java SE feature set.
If the Maven tab is not available in the Options window, confirm that Java SE is activated by creating a Java application.</p>
<p>The IDE uses Maven SCM to checkout Maven artifacts.
You might want to check that any clients necessary for checking out sources are installed on your local machine and configured correctly.</p>
<p class="tips">For details on Maven SCM, see the
<a href="http://maven.apache.org/scm/index.html">Maven SCM page</a>.</p>
<div class="indent">
<h3><a name="config1"></a>Viewing the Maven Repositories</h3>
<p>The artifacts that are used by Maven to build all your projects are stored in your local Maven repository.
When an artifact is declared as a project dependency, the artifact is downloaded to your local repository
from one of the registered remote repositories.</p>
<p>The NetBeans repository and several well-known indexed Maven repositories are registered and listed in the Repository Browser window by default.
The NetBeans repository contains most of the public artifacts necessary for you to build your project.
You can use the Maven Repository Browser to view the contents of your local and remote repositories.
You can expand the Local Repository node to see the artifacts that are present locally.
The artifacts listed under the NetBeans repository nodes can be added as project dependencies, but not all of
them are present locally. They are only added to the Local Repository when they are declared as project
dependencies.</p>
<p>To open the Maven Repository Browser:</p>
<ul>
<li>Choose Window &gt; Other &gt; Maven Repository Browser from the main menu.<br/>
<img src="../images/tutorials/maven-quickstart68/maven-nbm-netbeans-repo.png" alt="Screenshot of Maven Repository Browser" title="Screenshot of Maven Repository Browser" class="margin-around b-all" />
</li>
</ul>
<p>When your cursor is over an artifact, the IDE displays a tooltip with the artifact's coordinates.
You can view additional details about an artifact by double-clicking the artifact's JAR file in the browser.</p>
<p class="tips">You can search for an artifact by clicking the Find button in the toolbar of the Maven Repository Browser
or by using the Quicksearch textfield in the main toolbar.</p>
<p class="tips">For more about managing Maven classpath dependencies and working with Maven repositories in the IDE,
see the <a href="http://wiki.netbeans.org/MavenBestPractices#Dependency_management">Dependency Management</a>
section of <a href="http://wiki.netbeans.org/MavenBestPractices">Best Practices for Apache Maven in NetBeans 6.x</a>.
</p>
<p class="tips">To see a demonstration of using the Artifact Viewer, see the <a href="https://netbeans.org/kb/docs/java/maven-dependencies-screencast.html"> Working with Maven Dependencies</a> screencast.</p>
</div>-->
<!-- =================================================================== -->
<!-- +++++++++++++++ Creating the Platform Application +++++++++++++++++ -->
<h2><a name="01"></a>Creating a Maven Based NetBeans Platform Application Project</h2>
<p>In this section you use the New Project wizard to create a
NetBeans Platform Application from a Maven archetype.
The wizard creates the Maven module projects that you need to develop an application on the NetBeans Platform.
The wizard also provides the option of creating a NetBeans module in
the application project, but in this tutorial
you create each module individually.</p>
<div class="indent">
<h3>Creating the Project</h3>
<p>Perform the following steps to create the NetBeans Platform application using the New Project wizard.</p>
<div class="indent">
<ol>
<li>Choose File &gt; New Project (Ctrl-Shift-N) to open the New Project wizard.</li>
<li><p>Select NetBeans Application from the Maven category: </p>
<p><img src="../images/tutorials/maven-quickstart/72/new-project-1.png" alt="Screenshot of New Project wizard" title="Screenshot of New Project wizard" class="margin-around b-all" /></p>
<p>Click Next.</p></li>
<li><p>Type <strong>MavenPlatformWordApp</strong> for the Project Name and set the
Project Location to an appropriate folder on your system. For purposes
of this tutorial, keep the default values of the Maven
settings, such as the group ID, as shown below:
</p>
<p><img src="../images/tutorials/maven-quickstart/72/new-project-2.png" alt="Screenshot of New Project wizard" title="Screenshot of New Project wizard" class="margin-around b-all" /></p>
<p>Click Next.</p>
</li>
<li><p>Select the version of the NetBeans APIs you want to use:
</p>
<p><img src="../images/tutorials/maven-quickstart/72/new-project-3.png" alt="Screenshot of New Project wizard" title="Screenshot of New Project wizard" class="margin-around b-all" /></p>
<p>As you can see, you can create a module together with your application,
which we won't do in this tutorial. In this tutorial, we create
all the modules separately.</p>
<p>Click Finish.</p>
</li>
</ol>
</div>
<p class="notes"><strong>Note.</strong> If this is your first NetBeans Platform application using Maven,
it can take some time to create the projects because the IDE needs to download any necessary artifacts
from the NetBeans Maven repository.</p>
<p>When you click Finish, by default the IDE creates the following Maven project types:</p>
<p><img src="../images/tutorials/maven-quickstart/72/new-project-4.png" alt="Screenshot of New Project wizard" title="Screenshot of New Project wizard" /></p>
<ul>
<li><strong>app.</strong>
The app project enumerates included modules; permits interactive runs;
produces various kinds of packaging, such as ZIP by default, but optionally
JNLP, NBMs, and in the future perhaps OSGi; holds functional tests.
Each module project specifies its own compile dependencies, while
the app project's dependencies are anything additional that should be present at
runtime. For example, that includes, by default, the whole platform cluster, that is,
the set of modules constituting the "platform" cluster. The app project could
include other clusters, or subsets of clusters, or whatever plugins you want
included in your app which are not used as compilation dependencies. At a minimum,
core.startup and its transitive dependencies are included. </li>
<li><strong>branding.</strong>
This project contains the global resources used for branding the application, such as the splash screen. </li>
<li><strong>parent.</strong>
This project is a Maven reactor project for the NetBeans Platform application, which lists the modules to include and the location of the project's repositories. This project does not contain any sources.
The IDE generates the modules containing the sources and resources in sub-directories of this project.</li>
</ul>
<p>For all Maven projects, the <tt>pom.xml</tt> file (POM) is located under the Project Files node in the Projects window.
If you look at the POM for the parent project,
you can see that the two other modules created by the wizard are
listed as modules in the application:</p>
<pre class="examplecode">&lt;modules&gt;
&lt;module&gt;branding&lt;/module&gt;
&lt;module&gt;application&lt;/module&gt;
&lt;/modules&gt;</pre>
<h3><a name="01a"></a>Modifying the Branding Elements</h3>
<p>The branding module provides the customization information, such
as splash screens and icons, used throughout the NetBeans Platform application.
The IDE's Branding Editor enables you to easily modify
the branding properties of the application, giving you a centralized location
for changing the name,
splash screen, and values of various text elements.</p>
<p>When you create the NetBeans Platform application,
the default name for the application is the artifactId of the application.
In this exercise, you use the Branding Editor to modify the name of the application and
replace the default image for the splash screen.</p>
<div class="indent">
<ol>
<li>Right-click the <strong>branding</strong> module and choose Branding, which
is a menu item near the end of the right-click popup menu. Wait a moment
while the required JARs are downloaded, before continuing.</li>
<li>In the Basic tab, modify the Application Title to <strong>My Maven Platform Word App</strong>.<br/>
<img src="../images/tutorials/maven-quickstart/72/brand-1.png" alt="Screenshot of New Project wizard" title="Screenshot of New Project wizard" class="margin-around b-all" />
</li>
<li>Click the Splash Screen tab and click the Browse
button next to the default splash screen image to locate a different image. Click OK.</li>
<!--<li>Click the Resource Bundles tab and expand the <strong>org/netbeans/core/startup/Bundle.properties</strong> node.</li>
<li>Double-click <strong>CTL_About_Title</strong> and type a new title for the About dialog window. Click OK.<br/>
<img src="../images/tutorials/maven-quickstart/maven-branding2.png" alt="Screenshot of New Project wizard" title="Screenshot of New Project wizard" class="margin-around b-all" />
</li>-->
</ol>
</div>
</div>
<!-- =================================================================== -->
<!-- +++++++++++++++ Creating the MavenWordEngine Module +++++++++++++++ -->
<h2><a name="02"></a>Creating Your First Maven Based NetBeans Module</h2>
<p>In this section, you create a new module named MavenWordEngine.
You then modify the module to add a window component and a button and text area.</p>
<div class="indent">
<h3><a name="02a"></a>Creating the Module</h3>
<p>In this exercise, you create a new module project in the same directory that contains the branding module and application module.</p>
<div class="indent">
<ol>
<li>Choose File &gt; New Project from the main menu. Select NetBeans Module from the Maven category:</p>
<p><img src="../images/tutorials/maven-quickstart/72/new-module-1.png" alt="Screenshot of New Project wizard" title="Screenshot of New Project wizard" class="margin-around b-all" />
</p>
<p>Click Next.</p></li>
<li><p>Type <strong>MavenWordEngine</strong> as the Project Name. Click Browse and locate the MavenPlatformWordApp directory
as the Project Location:</p>
<p><img src="../images/tutorials/maven-quickstart/72/new-module-2.png" alt="Screenshot of New Project wizard" title="Screenshot of New Project wizard" class="margin-around b-all" />
</p>
</li>
<li><p>Click Next and select the NetBeans APIs you want to use:</p>
<p><img src="../images/tutorials/maven-quickstart/72/new-module-3.png" alt="Screenshot of New Project wizard" title="Screenshot of New Project wizard" class="margin-around b-all" />
</p>
<p>Click Finish.</p>
</li>
</ol>
</div>
<p>If you look at the POM for the new MavenWordEngine module you see
that the <tt>artifactId</tt> of the project is <strong>MavenWordEngine</strong>:</p>
<pre class="examplecode">&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
&lt;parent&gt;
&lt;artifactId&gt;MavenPlatformWordApp-parent&lt;/artifactId&gt;
&lt;groupId&gt;com.mycompany&lt;/groupId&gt;
&lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
&lt;/parent&gt;
&lt;groupId&gt;com.mycompany&lt;/groupId&gt;
&lt;artifactId&gt;<b>MavenWordEngine</b>&lt;/artifactId&gt;
&lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
&lt;packaging&gt;nbm&lt;/packaging&gt;
&lt;name&gt;MavenWordEngine&lt;/name&gt;</pre>
<p>To build a NetBeans module you need to use the <tt>nbm-maven-plugin</tt>.
If you look at the POM for the module, you can see that the IDE automatically
specified <tt>nbm</tt> for the <tt>packaging</tt> and that the <strong>nbm-maven-plugin</strong>
is specified as a build plugin:</p>
<pre class="examplecode">&lt;plugin&gt;
&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
&lt;artifactId&gt;<strong>nbm-maven-plugin</strong>&lt;/artifactId&gt;
&lt;version&gt;3.7&lt;/version&gt;
&lt;extensions&gt;true&lt;/extensions&gt;
&lt;/plugin&gt;</pre>
<p>If you look at the POM for the parent project,
you can see that <strong>MavenWordEngine</strong> was added
to the list of modules:</p>
<pre class="examplecode">&lt;modules&gt;
&lt;module&gt;branding&lt;/module&gt;
&lt;module&gt;application&lt;/module&gt;
&lt;module&gt;<strong>MavenWordEngine</strong>&lt;/module&gt;
&lt;/modules&gt;</pre>
<h3><a name="02b"></a>Making the Module a Dependency of NetBeans Platform Application</h3>
<p>In this exercise, you declare the MavenWordEngine module as a dependency of the
<b>app</b> project
by adding the dependency in the POM.
If you expand the Libraries node for the <b>app</b> you can see that there is a dependency on
the branding module and on some other libraries that are dependencies of the cluster
required to build the application. You can expand the list of non-classpath dependencies
to see the full list of dependencies.</p>
<p>To add the dependency to the <b>app</b> project's POM, you can edit the POM directly
in the editor or, as done below, use the Add Dependency dialog from the Projects window.</p>
<div class="indent">
<ol>
<li><p>Expand the <strong>app</strong> in the Projects window,
right-click the Dependencies node, and choose Add Dependency:</p>
<img src="../images/tutorials/maven-quickstart/72/add-dep-1.png" alt="Screenshot of Add Dependency dialog" title="Screenshot of Add Dependency dialog" />
</li>
<li><p>Click the Open Projects tab and select <strong>MavenWordEngine</strong>:</p>
<p><img src="../images/tutorials/maven-quickstart/72/add-dep-2.png" alt="Screenshot of Add Dependency dialog" title="Screenshot of Add Dependency dialog" /></p>
<p>Click OK.</p>
</li>
<li><p>If you expand the <b>app</b> in the Projects window,
you can see that MavenWordEngine is now listed as a dependency:</p>
<p><img src="../images/tutorials/maven-quickstart/72/add-dep-3.png" alt="Screenshot of Add Dependency dialog" title="Screenshot of Add Dependency dialog" /></p>
</li>
</ol>
</div>
<h3><a name="02c"></a>Adding a Window Component to the Module</h3>
<p>In this exercise, you use a wizard to add a Window Component to the MavenWordEngine module.</p>
<div class="indent">
<ol>
<li>Right-click <strong>MavenWordEngine</strong> in the Projects window
and choose New &gt; Window. Select <strong>output</strong> in Window Position:</p>
<p>
<img src="../images/tutorials/maven-quickstart/72/new-win-1.png" alt="Screenshot of window component page in New File wizard" title="Screenshot of window component page in New File wizard" />
</p>
</li>
<li><p>Type <strong>Text</strong> in the Class Name Prefix:</p>
<img src="../images/tutorials/maven-quickstart/72/new-win-2.png" alt="Screenshot of window component page in New File wizard" title="Screenshot of window component page in New File wizard" />
<p>Click Finish.</p>
</li>
<li><p>When you click Finish, in the Projects window you can see that the IDE
generated the class <tt>TextTopComponent.java</tt> in <tt>com.mycompany.mavenwordengine</tt>
under Source Packages:</p>
<img src="../images/tutorials/maven-quickstart/72/add-dep-4.png" alt="Screenshot of window component page in New File wizard" title="Screenshot of window component page in New File wizard" />
</li>
</ol>
</div>
<h3><a name="02d"></a>Modifying the Window Component</h3>
<p>In this exercise, you add a text area and a button to the window component.
You then modify the method invoked by the button to change the
letters in the text area to upper case letters.</p>
<div class="indent">
<ol>
<li><p>Click the Design tab of <tt>TextTopComponent.java</tt> in the editor.
Drag and drop a button and a text area from the Palette (Ctrl-Shift-8)
onto the window. Right-click the text area and choose
Change Variable Name, and then type <strong>text</strong> as the name.
You use the name when accessing the component from your code.
Set the text of the button to "<strong>Filter!</strong>". You
should now see the following:</p>
<p><img src="../images/tutorials/maven-quickstart/72/new-win-3.png" alt="Screenshot of window component page in New File wizard" title="Screenshot of window component page in New File wizard" class="margin-around b-all" />
</p>
</li>
<li>Double-click the Filter! button in the Design view to open the event handler method for the button in the source code editor.
The method is created automatically when you double-click the button element
and the Source view opens.
Modify the body of the method to add the following code.
<pre class="examplecode">
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
<strong>String s = text.getText();
s = s.toUpperCase();
text.setText(s);</strong>
}</pre>
<p>Save your changes.</p>
</li>
</ol>
</div>
<h3><a name="02e"></a>Trying Out the Application</h3>
<p>To try out the application, to make sure that everything is working correctly,
right-click the project node of the
<strong>application</strong> and choose Build with Dependencies:</p>
<p><img src="../images/tutorials/maven-quickstart/72/try-1.png" alt="Screenshot of Reactor build order in Output window" title="Screenshot of Reactor build order in Output window" class="margin-around b-all" /></p>
<p>The action mapped to "Build with Dependencies" builds the project using the Reactor plugin.
When you build a project using the Reactor plugin, the dependencies of the
sub-projects are built before the containing project is built.
The Output window displays the build order:</p>
<pre class="examplecode">Reactor Build Order:
MavenPlatformWordApp-parent
MavenPlatformWordApp-branding
MavenWordEngine
MavenPlatformWordApp-app</pre>
<p>The results of the build are also displayed in the Output window.</p>
<pre class="examplecode">Reactor Summary:
MavenPlatformWordApp-parent ....................... SUCCESS [0.720s]
MavenPlatformWordApp-branding ..................... SUCCESS [4.427s]
MavenWordEngine ................................... SUCCESS [5.845s]
MavenPlatformWordApp-app .......................... SUCCESS [22.644s]
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 34.679s
Finished at: Tue Sep 18 11:29:33 CEST 2012
Final Memory: 15M/134M
------------------------------------------------------------------------</pre>
<p>To run the project, in the Projects window, right-click the project node of
the <strong>application</strong>, and choose Run.</p>
<p><img src="../images/tutorials/maven-quickstart/72/try-2.png" alt="Screenshot of Reactor build order in Output window" title="Screenshot of Reactor build order in Output window" class="margin-around b-all" /></p>
<p>After the application launches, you can try out
the application by performing the following steps.</p>
<ol>
<li>Choose Window &gt; Text from the main menu of the platform application to open the Text window.</li>
<li>Type some lower case letters in the text area and click Filter! When
you click Filter!, the letters that you typed are changed to upper case and displayed in the text area.</li>
</ol>
</div>
<p>In the next sections, you decouple the user interface from the
business logic in your application. You start by creating a module
that provides an API. Then you create a module that implements
the API. Finally, you change the window defined above so that
implementations of the API are loaded at runtime into the application.
In that way, the GUI is able to load multiple filters without
needing to care about any of the implementation details.
</p>
<!-- =================================================================== -->
<!-- +++++++++++++ Creating the TextFilter Module ++++++++++++++++++++++ -->
<h2><a name="04"></a>Creating a Module that Defines a Service</h2>
<p>In this exercise, you create a module named <b>TextFilter</b>
and add the module as a dependency to the application.
The TextFilter module provides an API and only contain an interface.
You can then access the service from your other modules by using the
NetBeans Lookup mechanism.</p>
<div class="indent">
<h3><a name="04a"></a>Setting Up the Module</h3>
<p>In this exercise, you perform the following steps to create the TextFilter module.
These steps are the same as you did previously to create the WordEngine module above.</p>
<div class="indent">
<ol>
<li><p>Choose File &gt; New Project (Ctrl-Shift-N).
As explained in the previous section,
select NetBeans Module from the Maven category. Click Next.
Type <b>TextFilter</b> for the Project Name.
Click Browse to set the Project Location and
locate the directory of the parent project.
Click Next, choose the version of the NetBeans APIs you want
to use, and click Finish.</p>
<p>When you click Finish, the IDE creates the module and opens the module project
<b>TextFilter</b> in the Projects window.
The IDE modifies <tt>pom.xml</tt> of the <b>parent</b> project
to add the new module to the list of modules to include in the project.</p>
<pre class="examplecode">&lt;modules&gt;
&lt;module&gt;branding&lt;/module&gt;
&lt;module&gt;application&lt;/module&gt;
&lt;module&gt;MavenWordEngine&lt;/module&gt;
&lt;module&gt;TextFilter&lt;/module&gt;
&lt;/modules&gt;</pre></li>
<li><p>After you create the module you need to add the module as a dependency of
the <b>app</b> project.
Right-click the Dependencies node of the <strong>app</strong>
project and choose Add Dependency. Click the Open Projects tab
in the Add Dependency dialog. Select the <strong>TextFilter</strong>
module. Click OK.</p>
<p>When you click OK, the IDE adds the module as a dependency of the project.
If you expand the Libraries node, you can see that the module is added to the list of dependencies.
In the POM for <strong>application</strong>,
you can see that the IDE added the following lines inside the <tt>dependencies</tt> element:</p>
<pre class="examplecode">&lt;dependency&gt;
&lt;groupId&gt;${project.groupId}&lt;/groupId&gt;
&lt;artifactId&gt;TextFilter&lt;/artifactId&gt;
&lt;version&gt;${project.version}&lt;/version&gt;
&lt;/dependency&gt;</pre>
</li>
</ol>
</div>
<h3><a name="04c"></a>Adding an Interface to the TextFilter Module</h3>
<p>In this exercise, you add a simple interface to the TextFilter module.</p>
<div class="indent">
<ol>
<li> Right-click the <strong>TextFilter</strong> module and choose New &gt; Java Interface.</li>
<li> Type <strong>TextFilter</strong> as the Class Name.</li>
<li> Select <b>com.mycompany.textfilter</b> in the Package dropdown list. Click Finish.</li>
<li> Modify the class to add the following code:
<pre class="examplecode">package com.mycompany.textfilter;
public interface TextFilter {
<strong>String process(String s);</strong>
}</pre>
</li>
</ol>
</div>
<h3><a name="04d"></a>Making the TextFilter Interface Public</h3>
<p>In this exercise, you make the contents of the <tt>com.mycompany.textfilter</tt> package
public so that other modules can access its public classes and interfaces.
To declare a package as public, you modify
the <tt>configuration</tt> element of <tt>nbm-maven-plugin</tt> in the POM to specify the packages that are exported as public by the plugin.
You can make the changes to the POM in the editor or by selecting the packages to be
made public in the project's Properties dialog box, as explained in the steps below.
</p>
<div class="indent">
<ol>
<li> Right-click the <strong>TextFilter</strong> module and choose Properties.</li>
<li> Select the Public Packages category in the Project Properties dialog.</li>
<li><p>Select the <strong>com.mycompany.textfilter</strong> package.</p>
<p><img src="../images/tutorials/maven-quickstart/72/public-1.png" alt="Screenshot of Properties dialog" title="Screenshot of Properties dialog" class="margin-around b-all" />
</p>
<p>Click OK.</p></li>
</ol>
</div>
<p>When you click OK, the IDE modifies the project POM to modify the <tt>configuration</tt> element
of the <tt>nbm-maven-plugin</tt> artifact to add the following entries:</p>
<pre>&lt;plugin&gt;
&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
&lt;artifactId&gt;nbm-maven-plugin&lt;/artifactId&gt;
&lt;version&gt;3.7&lt;/version&gt;
&lt;extensions&gt;true&lt;/extensions&gt;
&lt;configuration&gt;
<b>&lt;publicPackages&gt;
&lt;publicPackage&gt;com.mycompany.textfilter&lt;/publicPackage&gt;
&lt;/publicPackages&gt;</b>
&lt;/configuration&gt;
&lt;/plugin&gt;</pre>
<p class="tips">For more information, see <a href="http://mojo.codehaus.org/nbm-maven-plugin/manifest-mojo.html#publicPackages" class="external text" title="http://mojo.codehaus.org/nbm-maven-plugin/manifest-mojo.html#publicPackages" rel="nofollow">nbm-maven-plugin manifest</a>.</p>
</div>
<!-- =================================================================== -->
<!-- +++++++++++++ Creating the MyFilter Module ++++++++++++++++++++++++ -->
<h2><a name="05"></a>Creating a Module that Implements the Service</h2>
<p>In this exercise, you create the module <b>MyFilter</b> and set a dependency on
the <b>TextFilter</b> module.
In the <b>MavenWordEngine</b> you
can then use methods from <b>MyFilter</b> by looking up the <b>TextFilter</b> service.
At that point, <b>MyFilter</b> is decoupled from <b>MavenWordEngine</b>.</p>
<div class="indent">
<h3><a name="05a"></a>Setting Up the Module</h3>
<p>In this exercise, you create a module named <strong>MyFilter</strong>.
To create the module, you perform the
same steps that you performed when you created the TextFilter module.</p>
<div class="indent">
<ol>
<li>Choose File &gt; New Project (Ctrl-Shift-N).
As explained in the previous section, select
NetBeans Module from the Maven category. Click Next.
Type <b>MyFilter</b> for the Project Name.
Click Browse to set the Project Location and locate the
application directory. Click Finish.</li>
<li>As described previously, add the MyFilter module as a dependency of
the <b>app</b> project. Right-click the Dependencies node of the <strong>app</strong>
project and choose Add Dependency. Click the Open Projects tab
in the Add Dependency dialog. Select the <strong>MyFilter</strong>
module. Click OK.
</li>
</ol>
</div>
<h3><a name="05b"></a>Making Code from the TextFilter Module Accessible to the MyFilter Module</h3>
<p>In this exercise you add the TextFilter module as a dependency of the MyFilter module.</p>
<div class="indent">
<ol>
<li><p>Right-click the Libraries node of the <b>MyFilter</b> project and choose Add Dependency:</p>
<p><img src="../images/tutorials/maven-quickstart/72/add-dep-5.png" alt="Screenshot of Properties dialog" title="Screenshot of Properties dialog" />
</p>
</li>
<li><p>Click the Open Projects tab in the Add Dependency dialog.
Select the <strong>TextFilter</strong> module:</p>
<p><img src="../images/tutorials/maven-quickstart/72/add-dep-6.png" alt="Screenshot of Properties dialog" title="Screenshot of Properties dialog" />
</p>
<p>Click OK.</p></li>
</ol>
</div>
<h3><a name="05c"></a>Implementing the TextFilter Interface</h3>
<p>In this exercise, you add a Java class with a single method that is named <tt>process</tt>
that converts a string to upper case.
You also specify that the class implements the TextFilter interface.
You use an <tt>@ServiceProvider</tt> annotation to specify that TextFilter is a service
that is registered at compile time.</p>
<div class="indent">
<ol>
<li>Right-click the <b>MyFilter</b> module and choose New &gt; Java Class.</li>
<li>Type <b>UpperCaseFilter</b> as the Class Name.</li>
<li>Select <b>com.mycompany.myfilter</b> in the Package dropdown list. Click Finish.</li>
<li><p>Modify the class to add the following code.</p>
<pre>package com.mycompany.myfilter;
import com.mycompany.textfilter.TextFilter;
import org.openide.util.lookup.ServiceProvider;
<strong>@ServiceProvider(service=TextFilter.class)</strong>
public class UpperCaseFilter <strong>implements TextFilter {
@Override
public String process(String s) {
return s.toUpperCase();
}</strong>
}</pre>
<p class="tips">To use the <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/lookup/ServiceProvider.html">@ServiceProvider</a></tt> annotation, you need
to set a dependency in your module on the NetBeans Lookup API. When
the module is compiled, a NetBeans annotation processor will create
a META-INF/services folder with a file named after the interface, containing
the name of the implementing class. Via <tt>Lookup.getDefault</tt>, in the
next section in this tutorial, the file will be found and, from there, the class
implementing the requested interface will be loaded.</p>
</li>
</ol>
</div>
<h3><a name="05d"></a>Loading Implementations of the TextFilter Interface</h3>
<p>In this exercise, you modify the event handler in the JButton in the WordEngine to load implementations of the
TextFilter interface.
Before adding the code that uses the TextFilter interface in the WordEngine, you need to declare a dependency on the
TextFilter module.</p>
<div class="indent">
<ol>
<li>Right-click the Dependencies node of the <strong>MavenWordEngine</strong> module and add a dependency on the TextFilter module.</li>
<li>Expand the Source Packages of the <strong>MavenWordEngine</strong> module and open
the <tt>TextTopComponent</tt> in the source editor.
Modify the <tt>jButton1ActionPerformed</tt> button handler method to add the following code.
<pre>private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String s = text.getText();
<strong>for (TextFilter filter : Lookup.getDefault().lookupAll(TextFilter.class)) {
s = filter.process(s);
} </strong>
text.setText(s);
}</pre>
</li>
</ol>
</div>
<p>At this point you can run your application. It should look and behave exactly as before, with the
difference that the user interface is now decoupled from the business logic.</p>
<p><img src="../images/tutorials/maven-quickstart/72/try-2.png" alt="Screenshot of Reactor build order in Output window" title="Screenshot of Reactor build order in Output window" class="margin-around b-all" /></p>
<p>In the next sections, you publish content whenever the "Filter!" button is clicked.
You will then create another new NetBeans module with a window that listens to the selection
and displays the content published there.</p>
</div>
<!-- =================================================================== -->
<!-- ++++++++++++++++++ Adding a LookupListener ++++++++++++++++++++++++ -->
<h2><a name="06"></a>Publishing Content into the Selection</h2>
<p>In this exercise, you publish the contents of the text area when
the "Filter!" button is clicked.</p>
<div class="indent">
<ol>
<li><p>In the <strong>MavenWordEngine</strong> module, add an <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/lookup/InstanceContent.html">InstanceContent</a></tt> object
to the <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/Lookup.html">Lookup</a></tt> of the TopComponent.</p>
<p class="tips">For details on <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/Lookup.html">Lookup</a></tt>, <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/lookup/InstanceContent.html">InstanceContent</a></tt>, and
related concepts, see <a href="http://wiki.netbeans.org/NetBeansDeveloperFAQ#Lookup">NetBeans Lookup</a> in the <a href="http://wiki.netbeans.org/NetBeansDeveloperFAQ">NetBeans Developer Wiki</a>.</p>
<pre class="examplecode">public final class TextTopComponent extends TopComponent {
<b>private InstanceContent content;</b>
public TextTopComponent() {
initComponents();
setName(Bundle.CTL_TextTopComponent());
setToolTipText(Bundle.HINT_TextTopComponent());
<b>content = new InstanceContent();
associateLookup(new AbstractLookup(content));</b>
}
...
...
...</pre>
</li>
<li>Modify the <tt>jButton1ActionPerformed</tt> method to add the old
value of the text to the <tt>InstanceContent</tt> object when the button is clicked.
<pre>private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String s = text.getText();
for (TextFilter filter : Lookup.getDefault().lookupAll(TextFilter.class)) {
<b>content.add(s);</b>
s = filter.process(s);
}
text.setText(s);
}</pre>
</li>
</ol>
</div>
<p>Now a String is published whenever the button is clicked. The String
is published into the Lookup of the TopComponent. When the TopComponent is
selected, the content of its Lookup is available throughout the
application.</p>
<p>In the next section, we create a new module that listens to the
Lookup and displays objects found there.</p>
<!-- =================================================================== -->
<!-- ++++++++++++++ Creating the History Module ++++++++++++++++++++++++ -->
<h2><a name="07"></a>Listening to the Selection</h2>
<p>In this section, you create a module named <strong>History</strong> that
displays Strings
found in the Lookup of the selected TopComponent.
To create the module, you perform the same steps that you performed when
you created the TextFilter and MyFilter modules.</p>
<div class="indent">
<h3><a name="07p"></a>Setting Up the Module</h3>
<div class="indent">
<ol>
<li>As done in previous sections, choose File &gt; New Project (Ctrl-Shift-N).
Select NetBeans Module from the Maven category. Click Next.
Type <strong>History</strong> for the Project Name.
Click Browse to set the Project Location to the parent directory. Click Finish.</li>
<li>As done in previous sections, add the History module as a dependency of the <b>app</b> project.</li>
<li>As done in previous sections, right-click the <b>History</b> module in the Projects window and
choose New &gt; Window. Select <b>editor</b> in Window Position. Click Next.
Type <b>History</b> in Class Name Prefix. Click Finish.</li>
</ol>
</div>
<p>You now have a new NetBeans module, registered in the <b>app</b> project,
with a new TopComponent named HistoryTopComponent.</p>
<h3><a name="07b"></a>Using the History Window to Listen to the Selection</h3>
<p>You now add a text area element to the window component that displays the filtered strings.</p>
<div class="indent">
<ol>
<li>Click the Design tab of <tt>HistoryTopComponent.java</tt> in the editor.
Drag and drop a text area from the Palette onto the window.</li>
<li>Right-click the text area and choose Change Variable Name
and then type <b>historyText</b> as the name.</li>
<li>Implement the <tt>LookupListener</tt> class and
add the following code to the <tt>HistoryTopComponent</tt>.
The window listens to the Lookup for the String class whenever
the <tt>HistoryTopComponent</tt> opens
and displays all retrieved String objects in the text area.
<pre class="examplecode">...
...
...
public final class HistoryTopComponent extends TopComponent <b>implements LookupListener</b> {
<b>Result&lt;String&gt; stringsInSelectedWindow;</b>
public HistoryTopComponent() {
initComponents();
setName(Bundle.CTL_HistoryTopComponent());
setToolTipText(Bundle.HINT_HistoryTopComponent());
}
<b>@Override
public void resultChanged(LookupEvent le) {
StringBuilder sb = new StringBuilder();
for (String string : stringsInSelectedWindow.allInstances()) {
sb.append(string).append('\n');
}
historyText.setText(sb.toString());
}
@Override
public void componentOpened() {
stringsInSelectedWindow = Utilities.actionsGlobalContext().lookupResult(String.class);
stringsInSelectedWindow.addLookupListener(this);
}
@Override
public void componentClosed() {
stringsInSelectedWindow.removeLookupListener(this);
}</b>
...
...
...
</pre>
</li>
</ol>
</div>
</div>
<h2><a name="08"></a>Running the Application</h2>
<p>You can now try out the application.</p>
<div class="indent">
<ol>
<li>Right-click the project node of the <strong>parent</strong> and choose Clean.</li>
<li>Right-click the project node of the <strong>app</strong> and choose Build with Dependencies.</li>
<li>Right-click the project node of the <strong>app</strong> and choose Run.</li>
</ol>
</div>
<p>When you click Run, the IDE launches the NetBeans Platform application.
You can open the Text window and the History window from the Window menu. You should
see the following:</p>
<p><img src="../images/tutorials/maven-quickstart/72/result-1.png" alt="Screenshot of final NetBeans Platform application" title="Screenshot of final NetBeans Platform application" class="margin-around b-all" />
</p>
<p>When you type text in the Text window and click the Filter! button, the text is converted to upper case letters
and the text is added to the content of the History window.</p>
<p>This tutorial demonstrated the fundamental pieces of NetBeans Platform
applications. Creating a NetBeans Platform application using Maven
is not very different from creating an application using Ant.
The major difference is understanding how the Maven POM controls how the application is assembled.
For more examples on how to build NetBeans Platform applications and modules,
see the tutorials listed in the <a href="https://netbeans.org/kb/trails/platform.html">NetBeans Platform Learning Trail</a>.</p>
<!-- ======================================================================================== -->
<div class="feedback-box"><a name="feedback"></a>
<a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20NetBeans%20Platform%20Quick%20Start%207.2%20Using%20Maven">
Send Us Your Feedback</a></div>
<p>&nbsp;</p>
<!-- ======================================================================================== -->
<h2><a name="nextsteps"></a>See Also</h2>
<p>For more information about creating and developing applications, see the following resources.</p>
<ul>
<li><a href="https://netbeans.org/kb/trails/platform.html">NetBeans Platform Learning Trail</a></li>
<li><a href="http://bits.netbeans.org/dev/javadoc/">NetBeans API Javadoc</a></li>
</ul>
<p>If you have any questions about the NetBeans Platform, feel free
to write to the mailing list, dev@platform.netbeans.org, or view the
<a href="https://netbeans.org/projects/platform/lists/dev/archive">NetBeans Platform mailing list archive</a>.</p>
<!-- ======================================================================================== -->
</body>
</html>