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

= Camí d'aprenentatge del desenvolupament general de Java
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Camí d'aprenentatge del desenvolupament general de Java - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Camí d'aprenentatge del desenvolupament general de Java

== Què és una aplicació Java SE?

Una aplicació Java SE és una aplicació escrita en la plataforma Java, edició estàndard (Java SE). Les mateixes aplicacions Java SE sense modificar-se poden executar-se en la majoria d'ordinadors, tant en ordinadors amb sistemes operatius Microsoft Windows, Solaris, Linux, o MacOS X. La clau d'aquesta portabilitat d'aplicacions és l'entorn d'execució Java, el qual no és cap sobrecàrrega per a la majoria dels sistemes operatius, incloent tots els citats anteriorment.

Addicionalment per a començar una aplicació d'escriptori multi-plataforma, la plataforma Java SE és la base per a altres tècniques com la plataforma Java, edició empresarial (Java EE). Per exemple, potser us podeu trobar escrivint un codi Java que proporcioni la lògica del servidor de rerefons per a una aplicació web empresarial.

== Getting Started 

* link:../docs/java/quickstart.html[+Java Quick Start Tutorial+]

== Tutorials and Articles

=== Developing Java Applications

* link:../docs/java/javase-jdk7.html[+JDK 7 Support in NetBeans IDE 7.0+]
* link:../docs/java/javase-deploy.html[+Packaging and Distributing Java Desktop Applications+]
* link:../docs/java/javase-intro.html[+Developing General Java Applications+]
* link:../articles/freeform-config.html[+Advanced Free-Form Project Configuration+]
* link:../docs/java/annotations.html[+Annotation Processors Support in the NetBeans IDE+]
* link:../docs/java/annotations-lombok.html[+Part I: Using Project Lombok+]
* link:../docs/java/annotations-custom.html[+Part II: Using Own Custom Annotation Processors+]
* link:https://netbeans.org/projects/www/downloads/download/shortcuts.pdf[+Keyboard Shortcuts Card+]

=== Building, Debugging, and Testing

* link:http://java.sun.com/developer/technicalArticles/java_warehouse/single_jar/[+Use NetBeans IDE to Combine JAR Files Into a Single JAR File+]
* 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:https://netbeans.org/community/magazine/html/04/profiler.html[+Advanced Profiling: Theory in Practice+]

=== 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+]

== Screencasts

* link:../docs/java/jdk7-nb70-screencast.html[+Demo: JDK 7 Support in NetBeans IDE 7.0+]
* link:https://blogs.oracle.com/arungupta/entry/screencast_35_jdk_7_project[+Demo: JDK 7 Project Coin Features in NetBeans IDE 7.0 Beta+] (_by Arun Gupta_)
* link:../docs/java/debug-deadlock-screencast.html[+Demo: Deadlock Detection Using the NetBeans Debugger+]
* link:../docs/java/debug-stepinto-screencast.html[+Demo: Visual Step Into Action in the NetBeans Debugger+]
* link:../docs/java/debug-evaluator-screencast.html[+Demo: Using the Code Snippet Evaluator in the NetBeans Debugger+]
* link:../docs/java/debug-multithreaded-screencast.html[+Demo: Multithreaded Debugging+]

== Community-Contributed Docs

* link:http://wiki.netbeans.org/Integrating_ANTLR_without_learning_Ant[+Integrating ANTLR without learning Ant+] (_by Jeff Allen_)
* link:http://wiki.netbeans.org/Splash_Screen_Beginner_Tutorial[+Adding a Splash Screen to a Java Application+] (_by Joseph Areeda_)
* link:http://netbeans.dzone.com/nb-java-editor-macro-syntax[+Complete List of Macro Keywords for the NetBeans Java Editor+] (Geertjan's post on link:http://netbeans.dzone.com/[+Dzone+]).
* 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+]
* link:http://wiki.netbeans.org/LookAndFeel[+Customizing the Look and Feel of the NetBeans IDE+]

== Other Resources

* 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+]
* link:http://www.javapassion.com/portal/[+JavaPassion Java Intro+]
* link:http://download.oracle.com/javase/tutorial/[+The Java Tutorials+]
