//
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

//=============================================== The Title and Metadata (Start)

= Developing General Java Applications
:jbake-type: tutorial
:jbake-tags: tutorials
:jbake-status: published
:reviewed: 2019-02-24
:syntax: true
:source-highlighter: pygments
:icons: font
:toc: left
:toc-title:
:description: Developing General Java Applications - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Developing General Java Applications
:experimental:

//================================================= The Title and Metadata (End)

//============================================================= Preamble (Start)

The following short tutorial takes you through some of the basic steps of developing a Java SE application in  the NetBeans IDE. This tutorial assumes you already have some familiarity with developing Java applications. Along the way, you will see some of the IDE's features that simplify application development.

You will create an application that converts several words into a single word that contains one letter from each of the other words. The resulting word is called an _acrostic_.

This tutorial takes approximately 30 minutes to complete. If you would like to do a quicker *Hello World* tutorial, see the link:quickstart.html[+NetBeans IDE Java Quick Start Tutorial+].

//=============================================================== Preamble (End)

//======================================================== Project Setup (Start)

== Project Setup

The application you create will contain two projects:

* A Java Class Library project, *MyLib*, in which you will create a utility class.
* A Java Application project, *MyApp*, with a main class that implements a method from the library project's utility class.

After you create the projects, you will add the library project, *MyLib*, to the classpath of the application project, *MyApp*. Then you will code the application. The library project will contain a utility class with a method named `acrostic` . The method `acrostic` takes an array of words as a parameter and then generates an acrostic based on those words. The *MyApp* project will contain a class *Main* that calls method `acrostic` and passes the words that are entered as arguments when the application is run.

NOTE: Strictly speaking, two projects are not needed for such a simple application. This tutorial uses two projects to demonstrate features that you might need for a more complex application.

//==============================================================================

=== Creating a Java Class Library Project

To open a new Java project, press:

[cols="1,4"]
|===
|*Windows*(TM)/Linux |kbd:[Ctrl+Shift+N]
|*macOS*(TM) |kbd:[Command+Shift+N]
|===

or, select *File > New Project...* from the menu bar. Then *Choose Project* by selecting *Categories: Java with Ant* and *Projects: Java Class Library*, then click *Next >*.

For *Name and Location*, set *Project Name: MyLib*. Change *Project Location:* to any directory on your computer. From now on, this tutorial refers to this directory as `_NetBeansProjects_`.

The specified path is then shown as *Project Folder: `` /`_NetBeansProjects_`/MyLib ``*

Optionally, select *Use Dedicated Folder for Storing Libraries* checkbox and specify the location for the *libraries Folder:*. See link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG455[+Sharing a Library with Other Users+] in _Developing Applications with NetBeans IDE_ for more information on this option.

Finally, click *Finish*. The MyLib project will be created and opens in the *Projects* window.

//==============================================================================

=== Creating a Java Application Project

Open a new Java Project, as shown above. Then *Choose Project* by selecting *Categories: Java with Ant* and *Projects: Java Application*, then click *Next >*.

for *Name and Location*, set *Project Name: MyApp*. Make sure the Project Location is set to `_NetBeansProjects_`.

Optionally, select the *Use Dedicated Folder for Storing Libraries* checkbox.

Ensure that the *Create Main Class* checkbox is selected and, enter *acrostic.Main* as the main class.

Finally, click *Finish*. The MyApp project is displayed in the *Projects* window and *Main.java* opens in the source editor.

//==============================================================================

=== Configuring the Compilation Classpath

Since class *MyApp* is going to depend on class *MyLib*, you have to add *MyLib* to the classpath of *MyApp*. Doing so also ensures that classes in the *MyApp Project* can refer to classes in the *MyLib Project* without causing compilation errors. In addition, this enables you to use code completion in the *MyApp Project* to fill in code based on the *MyLib Project*. In the IDE, the classpath is visually represented by the *Libraries* node.

*To add the library's utility classes to the project classpath:*

In the *Projects* window, right-click the *Libraries* node for the *MyApp* project and choose *Add Project...* as shown in the image below.

image::images/addproj.png[]

If necessary, in the *Add Project* window browse to `_NetBeansProjects_` and, select the *MyLib* project folder. When you do so, you will see *Project Name: MyLib* and, *Project JAR Files: dist/MyLib.jar* can be added to the project.

Notice that a JAR file is shown for *MyLib* even though you have not actually built one yet. This JAR file will get built when you build and run the *MyApp* project.

Select *Add Project JAR Files* then expand the *Libraries* node of *MyApp* in the *Projects* window and, you will see that *MyLib* project's JAR file has been added to the *MyApp* project's classpath.

//========================================================== Project Setup (End)

//================================ Creating and Editing Java Source Code (Start)

== Creating and Editing Java Source Code

Now you need to create a Java package and, add the method that will construct the acrostic. After that you need to implement the method `acrostic` in class `Main`.

//==============================================================================

=== Creating a Java Package and Class File

In the *Projects* window, right-click the *MyLib* project node and select *New > Java Class...* . Alternatively, regardless of where you are in the project, press:

[cols="1,4"]
|===
|*Windows(TM)*/Linux |kbd:[Ctrl+N]
|*macOS*(TM) |kbd:[Command+N]
|===

or, select *File > New File...* from the menu bar. Then in the *New File* window select: *Project: MyLib*, *Categories: Java* and *File Types: Java Class* then click *Next*.

In the *New Java Class* window, type: *Class Name: LibClass* and *Package: org.me.mylib*. Click *Finish* and *LibClass.java* opens in the source editor.

In `LibClass.java`, place the cursor on the line after the class declaration `public class LibClass {`.

Type or paste in the following method code:

[source,java]
----

    public static String acrostic(String[] args) {
        StringBuffer b = new StringBuffer();
        for (int i = 0; i < args.length; i++) {
            if (args[i].length() > i) {
                b.append(args[i].charAt(i));
            } else {
                b.append('?');
            }
        }
        return b.toString();
    }
----
If the code that you pasted in is not formatted correctly, press:

[cols="1,4"]
|===
|*Windows(TM)*/Linux |kbd:[Alt+Shift+F]
|*macOS*(TM) |kbd:[Ctrl+Shift+F]
|===

or, *Source > Format* from the menu bar or, right-click *Format* to reformat the entire file. Then save your file:

[cols="1,4"]
|===
|*Windows(TM)*/Linux |kbd:[Ctrl+S]
|*macOS*(TM) |kbd:[Command+S]
|===

or, select *File > Save* from the menu bar.

//==============================================================================

=== Editing a Java File

Now you will add some code to class `Main.java`. In doing so, you will see the source editor's code completion and, code template features.

Select the `Main.java` tab in the source editor. If it isn't already open, select the *Projects* window and expand *MyApp > Source Packages > acrostic* and either:  double-click `Main.java` or, right-click and select *Open*.

In the method `main`, delete the comment: `// TODO code application logic here` and, in its place type the following:

[source,java]
----

String result = Li
----

At this point stop typing but leave the cursor immediately after `Li`. Invoke code completion by pressing kbd:[Ctrl+Space], a short list of options appears. However, the class that you want, `LibClass` might not be there. If you press kbd:[Ctrl+Space] again a longer code completion list appears containing `LibClass`, select `LibClass` and press *Enter*. The IDE fills in the rest of the class name and also automatically creates an import statement for the class.

NOTE: The IDE also opens a box above the code completion box that displays Javadoc information for the selected class or package. Since there is no Javadoc information for this package, the box displays a "Cannot find Javadoc" message.

In the main method, type a period ( `.` ) after `LibClass`, the code completion box opens again. Select the `acrostic(String[]args)` method and press *Enter*. The IDE fills in the `acrostic` method and highlights the `args` parameter, press *Enter* again to accept `args` as the parameter, end the line with a semicolon ( `;` ). The line should look, as follows:

[source,java]
----

String result = LibClass.acrostic(args);
----

Press *Enter* to start a new line. Then type `sout` and press *Tab*. The `sout` abbreviation expands to `System.out.println("");` with the cursor positioned between the quotation marks. Type `Result =` inside the quotation marks and `+ result` after the end quotation mark. The final line should look like the following line.


[source,java]
----

System.out.println("Result = " + result);
----

Save the file.

NOTE: `sout` is one of many code templates that are available in the Source Editor. To find out how to edit using code templates see, See link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG455[+Sharing a Library with Other Users+] in _Developing Applications with NetBeans IDE_ for more information on this option.choose Tools > Options > Editor > Code Template.

//================================== Creating and Editing Java Source Code (End)

//================================ Compiling and Running the Application (Start)

== Compiling and Running the Application

Now you need to set the main class and execution arguments so that you can run the project.

NOTE: By default, the projects have been created with the Compile on Save feature enabled, so you do not need to compile your code first in order to run the application in the IDE. For more information, see link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG525[+Compiling a Single Java File+] in _Developing Applications with NetBeans IDE_.

//==============================================================================

=== Setting the Main Class and Execution Arguments

The output of this program is based on arguments that you provide when you run the program. As arguments, you will provide five words, from which the acrostic "Hello" will be generated. The acrostic is assembled from the first letter of the first word, the second letter of the second word, the third letter of the third word, and so on.

*To add the arguments for the IDE to use when running the application:*

From the *Projects* window, right-click the *MyApp* project node and select *Properties*. The *Project Properties* window opens,  select the *Categories: Run* node in the dialog's left-hand pane. In the right-hand pane set *Arguments: However we all feel zealous* and select *OK*.

//==============================================================================

=== Running the Application

Now that you have created the application and provided runtime arguments for the application, you can test run the application in the IDE.

*To run the application in the IDE:*

First, press `F11` to clean and build your project or, in the *Projects* window right-click the *MyApp* project node and choose *Clean and Build* or, select *Run > Clean and Build Project (MyApp)* from the menu bar.

Then, you can press `F6` or, in the *Projects* window right-click the *MyApp* project node and choose *Run* or, select *Run > Run Project (MyApp)* from the menu bar .

In the *Output* window, you should see the output from the program, `Result = Hello`, the acrostic of the phrase that was passed as an argument to the program.

//================================ Compiling and Running the Application (Start)

//================================ Testing and Debugging the Application (Start)

== Testing and Debugging the Application

Now you will create and run a test for the project using JUnit and then run the application in the IDE's debugger to check for errors. In the JUnit test, you will test the LibClass by passing a phrase to the `acrostic` method and using an assertion to indicate what you think the result should be.

//==============================================================================

=== Creating JUnit Tests

To create a JUnit test, from the *Projects* window select the `LibClass.java` node and press:

[cols="1,4"]
|===
|*Windows(TM)*/Linux |kbd:[Ctrl+Shift+U]
|*macOS*(TM) |kbd:[Command+Shift+U]
|===

or, select *Tools > Create/Update Tests* from the menu bar or, in the *Projects* window, right-click the `LibClass.java` node and and select *Tools > Create/Update Tests*.

In the *Create/Update Tests* dialog box, click *OK* to run the command with the default options.

In the *Projects* window you will see that the IDE has created the `org.me.mylib` package, the `LibClassTest.java` file in the *MyLib > Test Packages*  folder and, created the *MyLib > Test Libraries* folder. Finally the file `LibClassTest.java` is opened in the editor.

In the *Projects* window, right-click the *Test Libraries* node and select *Properties*.  In the *Project Properties - MyLib* window, select *Categories: Libraries*. In the right-hand pane select the *Compile Tests* tab and click the ` *+* ` button. From the pop-up list select *Add Library*, from the *Global Libraries* folder select `JUnit 4.x` and click *Add Libray* repeat, this time selecting the `Hamcrest 1.x` library.

In `LibClassTest.java`, delete the body of the `public void testAcrostic()` method and, in place of the deleted lines, type or paste in the following:

[source,java]
----

System.err.println("Running testAcrostic...");
String result = LibClass.acrostic(new String[]{"fnord", "polly", "tropism"});
assertEquals("Correct value", "foo", result);
----
Then *Save* the file.

//==============================================================================

=== Running JUnit Tests

In the *Projects* window, select the *MyLib* project node and press:

[cols="1,4"]
|===
|*Windows(TM)*/Linux |kbd:[Alt+F6]
|*macOS*(TM) |kbd:[Ctrl+F6]
|===

or, select *Run > Test Project (MyLib)* from the menu bar or, right-click the *MyLib* project node and select *Test*. A notification pops up telling you "Tests completed successfully for project: MyLib", and then instructs you to open the *Test Results* window, were you will receive confirmation of success.

You can also run a single test file rather than testing the entire project. Right-click the `LibClass.java` node in the *Projects* window and choose *Run > Test File*. Alternatively, if `LibClassTest.java` is open in the editor, select *Run > Test File* from the menu bar.

The JUnit API documentation is available from the IDE. To look for Javadoc references, select *Help > Javadoc References* from the menu bar and select `JUnit`.

If this is the first time you try to access Javadoc in the IDE, you need to first choose  *Help > Javadoc References > More Javadoc*.

You can learn more about JUnit by visiting link:http://www.junit.org[+http://www.junit.org+]

//==============================================================================

=== Debugging the Application

In this section, you will use the debugger to step through the application and watch the values of variables change as the acrostic is assembled.

*To run the application in the debugger:*

In the `LibClass.java` file, go to the `acrostic` method and place the insertion point anywhere inside `b.append(args[i].charAt(i));`, then set a breakpoint by pressing:

[cols="1,4"]
|===
|*Windows(TM)*/Linux |kbd:[Ctrl+F8]
|*macOS*(TM) |kbd:[Command+F8]
|===

or, select *Debug > Toggle Line Breakpoint* from the menu bar or, in the left hand margin right-click the specified line and select *Breakpoint > Toggle Line Breakpoint*.

Select the *MyApp* project node in the *Projects* window and, press:

[cols="1,4"]
|===
|*Windows*(TM)/Linux |kbd:[Ctrl+F5]
|*macOS*(TM) |kbd:[Shift+F5]
|===

or, select *Debug > Debug Project (MyApp)* from the menu bar or, right-click and select *Debug*. The IDE opens the *Debugging* window and runs the project in the debugger until the breakpoint is reached.

Select the *Variables* window in the bottom of the IDE and expand the `args` node. The array of strings contains the phrase you entered as the command arguments.

Press kbd:[F7] or, select *Debug > Step Into* from the menu bar to step through the program and watch the `b` variable change as the acrostic is constructed.

When the program reaches the end, the debugger windows close.

For more information, see link:junit-intro.html[+Writing JUnit Tests in NetBeans IDE+].

//================================== Testing and Debugging the Application (End)

//================== Building, Running, and Distributing the Application (Start)

== Building, Running, and Distributing the Application

Once you are satisfied that your application works properly, you can prepare the application for deployment outside of the IDE. In this section you will build the application's JAR file and then run the JAR file from the command line.

//==============================================================================

=== Building the Application

The main build command in the IDE is the *Clean and Build* command. The *Clean and Build* command deletes previously compiled classes and other build artifacts and then rebuilds the entire project from scratch.

NOTE: There is also a Build command, which does not delete old build artifacts, but this command is disabled by default. See link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG512[+About Building Java Projects+] in _Developing Applications with NetBeans IDE_ for more information.

To build the application, press kbd:[Shift+F11] or, if `Main.java` is open in the editor, select *Run > Clean and Build Project (MyApp)* from the menu bar or, in the *projects* window right-click on the *MyApp* node and select *Clean and Build*.

Output from the Ant build script appears in the *Output* window, If the window does not appear automatically, open it manually by choosing *Window > Output* from the menu bar.

When you clean and build your project, the following things occur:

* Output folders that have been generated by previous build actions are deleted, " *cleaned* ". In most cases, these are the `build` and `dist` folders.

* `build` and `dist` folders are added to your project folder, hereafter referred to as the _PROJECT_HOME_ folder. You can view these folders in the Files window.

* All of the sources are compiled into `.class` files, which are placed into the `_PROJECT_HOME_/build` folder.

* A JAR file containing your project is created inside the `_PROJECT_HOME_/dist` folder.

* If you have specified any libraries for the project, in addition to the JDK, a `lib` folder is created in the `dist` folder. The libraries are copied into `dist/lib`.

* The manifest file in the JAR is updated to include entries that designate the main class and any libraries that are on the project's classpath.

NOTE: You can view the contents of the manifest in the IDE's *Files* window. After you have built your project, switch to the Files window and navigate to `dist/MyApp.jar`. Expand the node for the JAR file, expand the `META-INF` folder, and double-click `MANIFEST.MF` to display the manifest in the Source Editor.

To find more about manifest files, you can read link:http://java.sun.com/docs/books/tutorial/deployment/jar/manifestindex.html[+this chapter+] from the Java Tutorial.

//==============================================================================

=== Running the Application Outside of the IDE

*To run the application outside of the IDE:*

On your system, open up a command prompt or terminal window.

In the command prompt, change directories to the `MyApp/dist` directory.

At the command line, type the following statement:

[source,java]
----

java -jar MyApp.jar However we all feel zealous
----

The application then executes and returns the following output as shown in the image below:


[source,java]
----

Result = Hello

----

//==============================================================================

=== Distributing the Application to Other Users

Now that you have verified that the application works outside of the IDE, you are ready to distribute the application.

*To distribute the application:*

On your system, create a zip file that contains the application JAR file (`MyApp.jar`) and the accompanying `lib` folder that contains `MyLib.jar`.

Send the file to the people who will use the application. Instruct them to unpack the zip file, making sure that the `MyApp.jar` file and the `lib` folder are in the same folder.

Instruct the users to follow the steps in the <<running-outside-IDE,Running the Application Outside of the IDE>> section above.

//==================== Building, Running, and Distributing the Application (End)

//=================================================== Other Common Tasks (Start)

== Other Common Tasks

You have now completed the main part of the tutorial, but there are still some basic tasks that have not been covered. This section includes a few of those tasks.

//==============================================================================

=== Making the Javadoc Available in the IDE

To view the Java SE API documentation in the NetBeans IDE, select either: *Source > Show Documentation* or, *Window > IDE Tools > Javadoc Documentation* from the menu bar.

However, for some third-party libraries, API documentation is not available. In these cases, the Javadoc resources must be manually associated with the IDE.

If you have not already installed the Javadoc for your JDK then go to:

link:https://www.oracle.com/technetwork/java/javase/downloads/index.html[]

and, download the file.

To install, select *Tools > Java Platforms* from the menu bar and, in the *Java Platform Manager* window select the *Javadoc* tab and click *Add ZIP/Folder...*. Navigate to the download file, select and then click the *Add ZIP/Folder* button, finally click *Close*.

//==============================================================================

=== Generating Javadoc for a Project

You can generate compiled Javadoc documentation for your project based on Javadoc comments that you have added to your classes.

To generate Javadoc documentation for a project:

From the *Projects* window select the *MyLib* project node then select *Run > Generate Javadoc (MyLib)* from the menu bar.

The generated Javadoc is added to the `dist` folder of the project. In addition, the IDE opens a web browser that displays the Javadoc.

//===================================================== Other Common Tasks (End)
