// 
//     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.
//

= General Java Development Learning Trail
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:reviewed: 2019-01-26
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: General Java Development Learning Trail - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, General Java Development Learning Trail


== What Is a Java SE Application?

A Java SE application is an application written to the Java Platform, Standard Edition (Java SE). The same unmodified Java SE applications can be run on almost any computer, whether that computer uses the Microsoft Windows, Solaris, Linux, or OS X operating systems. The key to this application portability is the Java Runtime Environment, which is available free of charge for most operating systems, including all of the ones mentioned above.

In addition to being a platform for multi-platform desktop applications, the Java SE platform is the basis for other technologies such as Java Platform, Enterprise Edition. You might find yourself writing Java code that provides back-end logic for web and enterprise applications as well.

== Getting Started 

- link:../docs/java/quickstart.html[+Java Quick Start Tutorial+]
- link:../docs/java/editor-codereference.html[+Code Assistance in the NetBeans IDE Java Editor: A Reference Guide to NetBeans IDE+]
- link:http://docs.oracle.com/cd/E50453_01/doc.80/e50452/toc.htm[+Developing Applications with NetBeans IDE 8.0+] (link:http://docs.oracle.com/cd/E50453_01/doc.80/e50452.pdf[+PDF+])

== Tutorials and Articles

=== Developing Java Applications

- link:../docs/java/javase-embedded.html[+Using Oracle Java SE Embedded Support in NetBeans IDE+]
- link:../docs/java/javase-jdk8.html[+Overview of JDK 8 Support in NetBeans IDE+]
- link:../docs/java/javase-jdk7.html[+Overview of JDK 7 Support in NetBeans IDE+]
- link:../docs/java/javase-deploy.html[+Packaging and Distributing Java Desktop Applications+]
- link:../docs/java/javase-intro.html[+Developing General Java Applications+]
- link:../docs/java/code-inspect.html[+Static Code Analysis in the NetBeans IDE Java Editor+]
- link:../docs/java/editor-inspect-transform.html[+Refactoring with Inspect and Transform in the NetBeans IDE Java Editor+]
- link:https://netbeans.org/projects/usersguide/downloads/download/shortcuts-80.pdf[+Keyboard Shortcuts Card+]

=== Building, Debugging, and Testing

- link:../docs/java/debug-visual.html[+Using the Visual Debugger+]
- link:../docs/java/junit-intro.html[+Writing JUnit Tests+]
- link:../docs/java/debug-multithreaded.html[+Debugging Multithreaded Applications+]

=== Maven

- link:http://wiki.netbeans.org/MavenBestPractices[+Maven Best Practices+]
- link:../docs/java/maven-hib-java-se.html[+Creating a Maven Swing Application Using Hibernate+]

=== Profiling Source Code

- link:../docs/java/profiler-intro.html[+Introduction to Profiling Java Applications+]
- link:../docs/java/profiler-profilingpoints.html[+Using Profiling Points+]
- link:../../../community/magazine/html/04/profiler.html[+Advanced Profiling: Theory in Practice+]
- link:../../../competition/win-with-netbeans/case-study-nb-profiler.html[+Case Study of NetBeans Profiler+]

=== Scripting Languages

- link:../docs/java/groovy-quickstart.html[+Introduction to Groovy+]

=== JMX Monitoring and Management

- link:../docs/java/jmx-getstart.html[+Getting Started with Java Management Extensions (JMX) Monitoring+]
- link:../docs/java/jmx-tutorial.html[+Adding JMX Instrumentation to a Java Application+]
- link:../docs/java/jmx-manager-tutorial.html[+Developing a JMX Manager and Connecting to a Remote JMX Agent+]

=== Community-Contributed Docs

- link:http://java.dzone.com/articles/using-lambda-expression-sort[+Using Lambda Expression to sort a List in Java 8 using Netbeans Lambda Support+] (_by Mohamed Sanaulla_)
- link:http://wiki.netbeans.org/CompactProfiles[+Compact Profiles in NetBeans IDE+] (_by Tomas Zezula _)
- link:http://wiki.netbeans.org/PackagingADistributableJavaApp[+Setting up Netbeans to Generate a Distributable JAR File Using OneJAR+]
- link:http://wiki.netbeans.org/TaT_ConfigNetBeansUsingBatchFiles[+Configure NetBeans using Batch Files+]
- link:http://wiki.netbeans.org/Refactoring[+Refactoring Simplified+]

=== Other Resources

- link:http://www.oracle.com/technetwork/java/embedded/resources/se-embeddocs/index.html[+Java SE Embedded Documentation+]
- link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG366[+Creating Java Projects+] in _Developing Applications with NetBeans IDE_
- link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG510[+Building Java Projects+] in _Developing Applications with NetBeans IDE_
- link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG659[+Testing and Profiling Java Application Projects+] in _Developing Applications with NetBeans IDE_
- link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG796[+Running and Debugging Java Application Projects+] in _Developing Applications with NetBeans IDE_
- link:http://wiki.netbeans.org/Java_Hints[+List of NetBeans Java Hints+]
- link:http://wiki.netbeans.org/NetBeansUserFAQ[+NetBeans User FAQs:+]
- link:http://wiki.netbeans.org/NetBeansUserFAQ#Project_System_.28General.29[+General Project System+]
- link:http://wiki.netbeans.org/NetBeansUserFAQ#Compiling_and_Building_Projects[+Compiling and Building+]
- link:http://wiki.netbeans.org/NetBeansUserFAQ#Freeform_Projects[+Free-form Project+]
- link:http://wiki.netbeans.org/NetBeansUserFAQ#Debugging[+Debugging+]
- link:http://wiki.netbeans.org/NetBeansUserFAQ#Profiler[+Profiling+]
- link:http://wiki.netbeans.org/NetBeansUserFAQ#Editing[+Editing+]
- link:http://www.mysql.com/why-mysql/java/[+MySQL and Java - Resources +]
- link:http://mysql.com/news-and-events/on-demand-webinars/?category=java_mysql[+MySQL On-Demand Web Seminars +]
- link:../../kb/articles/learn-java.html[+Learning Java - Resources+]


