blob: b1d939e3c8ec20a26ae1caef7f125f02a2b2a622 [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 Ant Command Line Tutorial</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 guide to getting started on the Ant
command line with the NetBeans Platform."/>
<!-- Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
<!-- Use is subject to license terms.-->
</head>
<body>
<h1>NetBeans Platform Ant Command Line Tutorial</h1>
<p>This document shows you how to use Ant and the command line to
set up and deploy NetBeans Platform applications.
</p>
<p>
You will start by setting up a folder and file structure for
deploying a NetBeans Platform application. The structure will
consist of folders, together with Ant scripts and property files.
For example, one of the Ant targets will download the NetBeans Platform, while
another will run it. Next, you will create a new folder and file structure
for adding a new module to the application. Finally, you will add
code that will enable your module to provide new components, such as
a new menu item, to the application.
</p>
<p>Once you have gone through this simple scenario, you should not <i>need</i> to
use NetBeans IDE at all when creating NetBeans Platform applications.
On the other hand, you might still <i>want</i> to use NetBeans IDE, since
it provides many wizards, templates, and other tools for generating
code and visualizing module structures, which are features
that no other IDE currently provides. Simultaneously, the instructions
below provide all the NetBeans-specific information needed for someone to create a plugin
for a different IDE enabling developers to use other IDEs to provide
the folder structures and file contents outlined below.
</p>
<p><b>Contents</b></p>
<ul class="toc">
<li><a href="#rcp">Downloading the NetBeans Platform</a></li>
<li><a href="#application">Setting Up a NetBeans Platform Application</a></li>
<li><a href="#module">Setting Up a NetBeans Module</a></li>
<li><a href="#menu">Adding a Menu Item</a></li>
<li><a href="#window">Adding a Window</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://ant.apache.org/">Ant</a></td>
<td class="tbltd1"></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 6 or above</td>
</tr>
</tbody>
</table>
<p>The tutorial assumes you have set up Ant and that you know how to use it.</p>
<!-- ===================================================================================== -->
<p></p>
<h2><a name="rcp"></a>Downloading the NetBeans Platform</h2>
<p>In this section, you begin to set up a folder structure
for your NetBeans Platform work, focusing on an Ant script
to download the NetBeans Platform.</p>
<ol>
<li><p>Create a new folder with a name of your choosing (here referred to as <code>ABC</code>) and, within it, create a folder
named <code>myapp</code> (or any other name), containing a file named <code>build.xml</code>. At this
point the structure of your application should be as follows:</p>
<p><img style="border: 1px solid" src="../../images/tutorials/ant/ant-structure-0.png" alt="structure 1"/></p>
</li>
<li>Read <a href="http://wiki.netbeans.org/AutoUpdateTask">http://wiki.netbeans.org/AutoUpdateTask</a>.</li>
<li><p>Define the content of the <code>build.xml</code> file as follows:</p>
<pre class="examplecode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project name="myapp" basedir="."&gt;
&lt;description&gt;Builds, tests, and runs the project "myapp".&lt;/description&gt;
&lt;!-- change this: --&gt;
&lt;property name="netbeans"
value="/home/geertjan/NetBeansProjects/ABC/nbrcp"/&gt;
&lt;property name="bootstrap.url"
value="http://deadlock.netbeans.org/hudson/job/nbms-and-javadoc/lastStableBuild/artifact/nbbuild/netbeans/harness/tasks.jar"/&gt;
&lt;property name="netbeans.updatecenter.url"
value="http://updates.netbeans.org/netbeans/updates/7.0/uc/final/distribution/catalog.xml.gz"/&gt;
&lt;target name="download-netbeans-rcp"&gt;
&lt;mkdir dir="${netbeans}/harness"/&gt;
&lt;get src="${bootstrap.url}" dest="${netbeans}/harness/tasks.jar" usetimestamp="true" verbose="true"/&gt;
&lt;taskdef name="autoupdate" classname="org.netbeans.nbbuild.AutoUpdate" classpath="${netbeans}/harness/tasks.jar"/&gt;
&lt;autoupdate installdir="${netbeans}" updatecenter="${netbeans.updatecenter.url}"&gt;
&lt;modules includes=".*" clusters="harness[0-9]*"/&gt;
&lt;modules includes=".*" clusters="platform[0-9]*"/&gt;
&lt;/autoupdate&gt;
&lt;/target&gt;
&lt;/project&gt;
</pre>
</li>
<li><p>On the command line, go to the "ABC/myapp" folder and run this:</p>
<pre class="examplecode">ant download-netbeans-rcp</pre>
<p>You now see the NetBeans Platform downloading:</p>
<p><img style="border: 1px solid" src="../../images/tutorials/ant/ant-download.png" alt="structure 1"/></p>
<p>In your ABC folder, you now have a folder named "nbrcp", as shown below:</p>
<p><img style="border: 1px solid" src="../../images/tutorials/ant/ant-structure-1.png" alt="structure 1"/></p>
<p>Read <code>harness/README</code> for a lot of tips, configuration data, and advice.</p>
<p>The folder "myapp" is where you will create your application,
on top of the NetBeans Platform, which is in the folder "nbrcp".</p>
</li>
</ol>
<p><b>Note:</b> Instead of using the Ant target above, you can simply download the ZIP
files for <code>harness</code> and <code>platform</code>:</p>
<ul>
<li><p>platform: <a href="https://netbeans.org/downloads/start.html?filename=zip/moduleclusters/netbeans-7.0-201104080000-ml-platform.zip&amp;pagelang=" rel="nofollow">http://netbeans.org/downloads/start.html?filename=zip/moduleclusters/netbeans-7.0-201104080000-ml-platform.zip&amp;pagelang=</a></p></li>
<li><p>harness: <a href="https://netbeans.org/downloads/start.html?filename=zip/moduleclusters/netbeans-7.0-201104080000-ml-harness.zip&amp;pagelang=" rel="nofollow">http://netbeans.org/downloads/start.html?filename=zip/moduleclusters/netbeans-7.0-201104080000-ml-harness.zip&amp;pagelang=</a></p></li>
</ul>
<p>Now that you have the NetBeans Platform, you can start creating
an application on top of it.</p>
<!-- ===================================================================================== -->
<p></p>
<h2><a name="application"></a>Setting Up a NetBeans Platform Application</h2>
<p>In this section, you set up a minimal folder and file structure for a new
NetBeans Platform application.</p>
<p>At the end of this section, you will have a source structure
on disk, as follows:</p>
<p><img style="border: 1px solid" src="../../images/tutorials/ant/ant-structure.png" alt="structure 1"/></p>
<ol>
<li><p>Within the "myapp" folder, create a folder named "nbproject".
This folder will, from now onwards, be referred to as
the "application project folder", while "myapp" will be referred to
as the "application root folder".</p></li>
<li><p>Within the application project folder, create a file named
<code>build-impl.xml</code>, with the following content.</p>
<pre class="examplecode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project name="myapp-impl" basedir=".." xmlns:sproject="https://netbeans.org/ns/nb-module-suite-project/1"&gt;
&lt;property file="nbproject/platform.properties"/&gt;
&lt;macrodef name="property" uri="https://netbeans.org/ns/nb-module-suite-project/1"&gt;
&lt;attribute name="name"/&gt;
&lt;attribute name="value"/&gt;
&lt;sequential&gt;
&lt;property name="@{name}" value="${@{value}}"/&gt;
&lt;/sequential&gt;
&lt;/macrodef&gt;
&lt;macrodef name="evalprops" uri="https://netbeans.org/ns/nb-module-suite-project/1"&gt;
&lt;attribute name="property"/&gt;
&lt;attribute name="value"/&gt;
&lt;sequential&gt;
&lt;property name="@{property}" value="@{value}"/&gt;
&lt;/sequential&gt;
&lt;/macrodef&gt;
&lt;sproject:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir"/&gt;
&lt;sproject:property name="nbplatform.active.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir"/&gt;
&lt;sproject:evalprops property="cluster.path.evaluated" value="${cluster.path}"/&gt;
&lt;import file="${harness.dir}/suite.xml"/&gt;
&lt;/project&gt;</pre>
</li>
<li>Import the <code>build-impl.xml</code> file into the <code>build.xml</code> file,
as follows:
<pre class="examplecode">&lt;import file="nbproject/build-impl.xml"/&gt;</pre>
<p>The <code>build-impl.xml</code> file gives you access to the NetBeans Platform
infrastructure, such as its "run" target. You will never need to change
the <code>build-impl.xml</code> file. On the other hand, the <code>build.xml</code> file
is the Ant script where you will customize, where necessary, your application's
build process.</p></li>
<li><p>Within the application project folder, create a file named
<code>platform.properties</code>, with the following content.</p>
<pre class="examplecode">run.args.extra=--laf Nimbus
nbplatform.active=default
nbplatform.active.dir=/home/geertjan/NetBeansProjects/ABC/nbrcp
harness.dir=${nbplatform.active.dir}/harness
cluster.path=${nbplatform.active.dir}/platform
disabled.modules=</pre>
<p>As you can see, the <code>platform.properties</code> file
configures your NetBeans Platform application, pointing to
its <code>harness</code> and the <code>platform</code> folders,
as well as a placeholder for the modules you will disable, later
in your development work. Make sure to
change <code>nbplatform.active.dir</code> above to point to
your "nbrcp" folder.</p>
</li>
<li><p>Within the application project folder, create a file named
<code>project.properties</code>, with the following content.</p>
<pre class="examplecode">app.name=myapp
branding.token=${app.name}
modules=</pre>
<p>As you can see, the <code>project.properties</code> file
is focused on the application. In this case, you have added
keys in the file for the name
of the application and the custom modules that the
application will provide.</p>
</li>
<li><p>On the command line, go to the "ABC/myapp" folder and run this:</p>
<pre class="examplecode">ant run</pre>
</li>
</ol>
<p>The NetBeans Platform starts up and you see a main window, with
a menu bar and a tool bar, as shown below:</p>
<p><img src="../../images/tutorials/ant/70/ant-first-run.png" alt="structure 1"/></p>
<p>Try out some of the toolbar buttons
and menu items, to see what the NetBeans Platform provided by default.</p>
<!-- ===================================================================================== -->
<p></p>
<h2><a name="module"></a>Setting Up a NetBeans Module</h2>
<p>In this section, you set up a minimal folder and file structure for a new
NetBeans module in your NetBeans Platform application. In the process,
you also register the module with the application so that, when the application
starts up, it will load the module together with the default NetBeans
Platform modules making
up the application.</p>
<ol>
<li><p>Start by creating some folders:</p>
<ul><li><p>Within the "myapp" folder, create a folder named "mymodule".
This folder will, from now onwards, be referred to as
the "module root folder". </p></li>
<li><p>Within the module root folder,
create a new folder named "nbproject", which will,
from now onwards, be referred to
as the "module project folder".</p></li>
<li><p>Within the module root folder,
create a new folder structure "src/org/demo/mymodule", which will
be the main package.</p></li></ul>
<p>Check that the structure you have created
is now as follows:</p>
<p><img style="border: 1px solid" src="../../images/tutorials/ant/ant-structure-2.png" alt="structure 1"/></p>
</li>
<li><p>In the module project folder, create the following:</p>
<ul><li><p>A file named <code>suite.properties</code>, with this content:</p>
<pre class="examplecode">suite.dir=${basedir}/..</pre>
<p>The above points to the "myapp" folder, specifying that
it is the application that owns this module.</p>
</li>
<li><p>A file named <code>project.properties</code>, with this content:</p>
<pre class="examplecode">javac.source=1.6
javac.compilerargs=-Xlint -Xlint:-serial</pre>
</li>
<li><p>A file named <code>project.xml</code>, with this content:</p>
<pre class="examplecode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project xmlns="https://netbeans.org/ns/project/1"&gt;
&lt;type&gt;org.netbeans.modules.apisupport.project&lt;/type&gt;
&lt;configuration&gt;
&lt;data xmlns="https://netbeans.org/ns/nb-module-project/3"&gt;
&lt;code-name-base&gt;org.demo.mymodule&lt;/code-name-base&gt;
&lt;suite-component/&gt;
&lt;module-dependencies&gt;
&lt;/module-dependencies&gt;
&lt;public-packages/&gt;
&lt;/data&gt;
&lt;/configuration&gt;
&lt;/project&gt;</pre>
</li>
<li><p>A file named
<code>build-impl.xml</code>, with this content:</p>
<pre class="examplecode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project name="org.demo.mymodule-impl" basedir=".."&gt;
&lt;property file="nbproject/suite.properties"/&gt;
&lt;property file="${suite.dir}/nbproject/platform.properties"/&gt;
&lt;macrodef name="property" uri="https://netbeans.org/ns/nb-module-project/2"&gt;
&lt;attribute name="name"/&gt;
&lt;attribute name="value"/&gt;
&lt;sequential&gt;
&lt;property name="@{name}" value="${@{value}}"/&gt;
&lt;/sequential&gt;
&lt;/macrodef&gt;
&lt;macrodef name="evalprops" uri="https://netbeans.org/ns/nb-module-project/2"&gt;
&lt;attribute name="property"/&gt;
&lt;attribute name="value"/&gt;
&lt;sequential&gt;
&lt;property name="@{property}" value="@{value}"/&gt;
&lt;/sequential&gt;
&lt;/macrodef&gt;
&lt;nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="https://netbeans.org/ns/nb-module-project/2"/&gt;
&lt;nbmproject2:property name="nbplatform.active.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="https://netbeans.org/ns/nb-module-project/2"/&gt;
&lt;nbmproject2:evalprops property="cluster.path.evaluated" value="${cluster.path}" xmlns:nbmproject2="https://netbeans.org/ns/nb-module-project/2"/&gt;
&lt;import file="${harness.dir}/build.xml"/&gt;
&lt;/project&gt;</pre>
</li>
</ul></li>
<li><p>In the module root folder, that is, within the "mymodule" folder,
create the following:</p>
<ul><li><p>A file named <code>build.xml</code>, with the
following content:</p>
<pre class="examplecode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project name="org.demo.mymodule" default="netbeans" basedir="."&gt;
&lt;description&gt;Builds, tests, and runs the project org.demo.mymodule.&lt;/description&gt;
&lt;import file="nbproject/build-impl.xml"/&gt;
&lt;/project&gt;</pre>
</li>
<li><p>A file named <code>manifest.mf</code>, with the
following content:</p>
<pre class="examplecode">Manifest-Version: 1.0
OpenIDE-Module: org.demo.mymodule
OpenIDE-Module-Specification-Version: 1.0</pre>
</li></ul></li>
<li><p>Check that the "mymodule" structure you have created
is now as follows:</p>
<p><img style="border: 1px solid" src="../../images/tutorials/ant/ant-structure-3.png" alt="structure 1"/></p></li>
<li><p>In the application project folder, that is, "myapp/nbproject",
change the "modules" key in "project.properties" to the following, to register the
module with the application:</p>
<pre class="examplecode">modules=${project.org.demo.mymodule}
project.org.demo.mymodule=mymodule</pre></li>
<li><p>On the command line, go to the "ABC/myapp" folder and run this:</p>
<pre class="examplecode">ant run</pre>
</li>
<li><p>The application starts up and, since you didn't add any code
to the module, you see no changes in the application.
Nevertheless, looking at the output, you can see that the module loaded successfully:</p>
<p><img style="border: 1px solid" src="../../images/tutorials/ant/ant-result-1.png" alt="structure 1"/></p></li>
</ol>
<p>In the next section, you add a new feature to the application.</p>
<!-- ===================================================================================== -->
<p></p>
<h2><a name="menu"></a>Adding a Menu Item</h2>
<p>In this section, you add a menu item to the module you created in the
previous section. All the files
described below are assumed to be created in the main package, which is
<code>org.demo.mymodule</code>.</p>
<ol>
<li><p>Add a new Action class, in a file named "HelloWorldAction.java",
to the module:</p>
<pre class="examplecode">package org.demo.mymodule;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
import org.openide.awt.ActionRegistration;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionReferences;
import org.openide.awt.ActionID;
import org.openide.util.NbBundle.Messages;
@ActionID(category = "Window",
id = "org.demo.mymodule.HelloWorldAction")
@ActionRegistration(displayName = "#CTL_HelloWorldAction")
@ActionReferences({
@ActionReference(path = "Menu/Window", position = -100)
})
@Messages("CTL_HelloWorldAction=Hello World")
public final class HelloWorldAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "hello...");
}
}</pre>
</li>
<li><p>In the module project folder, add
the list of
module dependencies to the "project.xml"
file, as shown below:</p>
<pre class="examplecode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project xmlns="https://netbeans.org/ns/project/1"&gt;
&lt;type&gt;org.netbeans.modules.apisupport.project&lt;/type&gt;
&lt;configuration&gt;
&lt;data xmlns="https://netbeans.org/ns/nb-module-project/3"&gt;
&lt;code-name-base&gt;org.demo.mymodule&lt;/code-name-base&gt;
&lt;suite-component/&gt;
<b>&lt;module-dependencies&gt;
&lt;dependency&gt;
&lt;code-name-base&gt;org.netbeans.modules.settings&lt;/code-name-base&gt;
&lt;build-prerequisite/&gt;
&lt;compile-dependency/&gt;
&lt;run-dependency&gt;
&lt;release-version&gt;1&lt;/release-version&gt;
&lt;specification-version&gt;1.29&lt;/specification-version&gt;
&lt;/run-dependency&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;code-name-base&gt;org.openide.awt&lt;/code-name-base&gt;
&lt;build-prerequisite/&gt;
&lt;compile-dependency/&gt;
&lt;run-dependency&gt;
&lt;specification-version&gt;6.7.1&lt;/specification-version&gt;
&lt;/run-dependency&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;code-name-base&gt;org.openide.util&lt;/code-name-base&gt;
&lt;build-prerequisite/&gt;
&lt;compile-dependency/&gt;
&lt;run-dependency&gt;
&lt;specification-version&gt;8.1&lt;/specification-version&gt;
&lt;/run-dependency&gt;
&lt;/dependency&gt;
&lt;/module-dependencies&gt;</b>
&lt;public-packages/&gt;
&lt;/data&gt;
&lt;/configuration&gt;
&lt;/project&gt;</pre>
</li>
<li><p>On the command line, go to the "ABC/myapp" folder and run this:</p>
<pre class="examplecode">ant run</pre>
</li>
<li><p>The application starts up and shows a new menu item under the Window menu:</p>
<p><img src="../../images/tutorials/ant/70/ant-second-run.png" alt="structure 1"/></p>
</li>
</ol>
<!-- ===================================================================================== -->
<p></p>
<h2><a name="window"></a>Adding a Window</h2>
<p>In this section, you use the NetBeans TopComponent class
to add a window to the module you created previously. All the files
described below are assumed to be created in the main package, which is
<code>org.demo.mymodule</code>.</p>
<ol>
<li><p>Add a new TopComponent class to the module, including
some code for initializing and
persisting the TopComponent:</p>
<pre class="examplecode">package org.demo.mymodule;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.windows.TopComponent;
import org.openide.util.NbBundle.Messages;
import static org.demo.mymodule.Bundle.*;
@TopComponent.Description(preferredID = "HelloTopComponent",
persistenceType = TopComponent.PERSISTENCE_ALWAYS)
@TopComponent.Registration(mode = "editor", openAtStartup = true)
@ActionID(category = "Window", id = "org.demo.mymodule.HelloTopComponent")
@ActionReference(path = "Menu/Window" /*, position = 333 */)
@TopComponent.OpenActionRegistration(displayName = "#CTL_HelloAction",
preferredID = "HelloTopComponent")
@Messages(
{"CTL_HelloAction=Open Hello Window",
"NAME_Hello=Hello Window"
})
public class HelloWorldTopComponent extends TopComponent {
public HelloWorldTopComponent() {
setDisplayName(NAME_Hello());
}
@Override
public void componentOpened() {
}
@Override
public void componentClosed() {
}
}</pre>
</li>
<li><p>In the module project folder,
add the following
module dependencies in the <code>project.xml</code>
file:</p>
<pre class="examplecode">&lt;module-dependencies&gt;
&lt;dependency&gt;
&lt;code-name-base&gt;org.netbeans.modules.settings&lt;/code-name-base&gt;
&lt;build-prerequisite/&gt;
&lt;compile-dependency/&gt;
&lt;run-dependency&gt;
&lt;release-version&gt;1&lt;/release-version&gt;
&lt;specification-version&gt;1.29&lt;/specification-version&gt;
&lt;/run-dependency&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;code-name-base&gt;org.openide.awt&lt;/code-name-base&gt;
&lt;build-prerequisite/&gt;
&lt;compile-dependency/&gt;
&lt;run-dependency&gt;
&lt;specification-version&gt;6.7.1&lt;/specification-version&gt;
&lt;/run-dependency&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;code-name-base&gt;org.openide.util&lt;/code-name-base&gt;
&lt;build-prerequisite/&gt;
&lt;compile-dependency/&gt;
&lt;run-dependency&gt;
&lt;specification-version&gt;8.1&lt;/specification-version&gt;
&lt;/run-dependency&gt;
&lt;/dependency&gt;
<b>&lt;dependency&gt;
&lt;code-name-base&gt;org.openide.util.lookup&lt;/code-name-base&gt;
&lt;build-prerequisite/&gt;
&lt;compile-dependency/&gt;
&lt;run-dependency&gt;
&lt;specification-version&gt;8.6.1&lt;/specification-version&gt;
&lt;/run-dependency&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;code-name-base&gt;org.openide.windows&lt;/code-name-base&gt;
&lt;build-prerequisite/&gt;
&lt;compile-dependency/&gt;
&lt;run-dependency&gt;
&lt;specification-version&gt;6.39.1&lt;/specification-version&gt;
&lt;/run-dependency&gt;
&lt;/dependency&gt;</b>
&lt;/module-dependencies&gt;</pre>
</li>
<li><p>On the command line, go to the "ABC/myapp" folder and run this:</p>
<pre class="examplecode">ant run</pre>
</li>
<li><p>The application starts up and shows a new window, which can also be
opened from the Window menu.</p>
<p><img src="../../images/tutorials/ant/70/ant-third-run.png" alt="structure 1"/></p>
</li>
</ol>
<p>Congratulations, you've successfully set up a pure Ant-based application structure
for working with the NetBeans Platform.</p>
<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20Ant%20Command%20Line%20Tutorial">Send Us Your Feedback</a></div>
</body>
</html>