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

= DevFaqBecomingProficient
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki DevFaqBecomingProficient
:description: Apache NetBeans wiki DevFaqBecomingProficient
:toc: left
:toc-title:
:syntax: true

=== Becoming a Proficient NetBeans Module Developer

The NetBeans Platform has a learning curve.  The goal of this FAQ is to get you over the basic humps quickly.  Being proficient does not necessarily mean knowing everything there is to know.  It means being able to find what you need to know quickly when you need it.  Here are some pointers.

=== Javadoc

The reference documentation for all of NetBeans APIs can be found on the web here:
link:http://bits.netbeans.org/dev/javadoc/index.html[http://bits.netbeans.org/dev/javadoc/index.html].

If you want a local copy of it, you can either download it from the update center, or build it from your source checkout

[source,java]
----

cd $NB_SRC_ROOT
ant build-javadoc
----

=== Using the Javadoc

Notice the list of APIs in the upper left in the javadoc.  These restrict the list of classes to a single API. /Also notice the link that says _javadoc_ next to each API name.  It's important!  This links to the overview page for each API.  That page contains a list of changes, an architecture description, and other very useful stuff!/

=== NetBeans Tutorials

There are a link:http://netbeans.org/kb/trails/platform.html[huge number of tutorials].  Do at least some of them - step by step.

=== FAQs

There is a huge link:NetBeansDeveloperFAQ.asciidoc[Frequently Asked Questions for Module Developers] list.  It is worth bookmarking.

=== Getting the Source Code

Some people claim that they should never need to look at source code - documentation should suffice.  That's just silly.  The NetBeans codebase is a treasure-trove of examples of how to do things.

Since the end of January 2008 the NetBeans sources are stored in Mercurial repository at link:http://hg.netbeans.org[hg.netbeans.org].

You can see useful documentation about Mercurial and also about its specifics for NetBeans repository in link:HgMigrationDocs.asciidoc[HgMigrationDocs] wiki topic. If you are already familiar with Mercurial you cat go directly to link:HgHowTos.asciidoc[HgHowTos] topic.

You will end up with a large number of directories representing top-level NetBeans projects.  Most of them will be openable as projects in NetBeans.

Here's how to link:HgHowTos#Doing_your_first_build.asciidoc[build it].

The build of NetBeans will be created in `nbbuild/netbeans`.

=== How To Find Useful APIs

See the link:DefFaqMapApisToTasks.asciidoc[tasks to APIs faq] for a list of common tasks and what APIs you will want to use to accomplish those tasks.

=== Get the NetBeans Platform Examples

There are a large number of samples.  Many of these correspond to the tutorials. 

Two full blown NetBeans Platform applications are provided as samples in NetBeans IDE. Look in the Samples category in the New Project dialog and you will find the FeedReader sample and the Paint sample, for both of which there are tutorials describing how to create them from scratch.

You can find several other samples in the module `platform` in `main/misc` repository at hg.netbeans.org.  They are in the `platform/samples/` subdirectory.  The `platform/samples/` folder can be link:http://hg.netbeans.org/main/misc/file/tip/platform/samples/[browsed online here].

=== Build Platform from Sources

First get platform sources from link:http://www.netbeans.info/downloads/dev.php[download page] or use Hg client as described in link:HgHowTos.asciidoc[HgHowTos].

To build platform run 

[source,java]
----

cd $NB_SRC_ROOT
ant build-platform
----

=== Mining the NetBeans Source Code for Examples

For most things you will need to do, there is some module that does something similar already.  For example, say that you want to show a window that shows the contents of some random directories on disk or some registry of objects your module creates.  The `core/favorites` module provides the Favorites window which does exactly this.  A bit of intuition and a willingness to open a couple of projects is all it takes to find examples of many things.  Often a good place to start is simply to open the source for a class you think you want to use and run Find Usages on it.

=== Use the Mailing Lists

If you have questions, the best place to go is the link:mailto:dev@platform.netbeans.org[developer mailing list].  Click link:mailto:sympa@platform.netbeans.org?subject=subscribe%20dev[this link] to subscribe.  

You can also browse the link:http://netbeans.org/projects/platform/lists/dev/archive[archives online], but actually joining the mailing list is the best way to get (and give) help.

Note: dev@platform.netbeans.org was formerly dev@openide.netbeans.org - older archives can be found on link:http://www.nabble.com/Netbeans---Open-API-f2609.html[Nabble] and via a newsreader by going to `news://news.gmane.org`.

Ask questions, and when you can answer them, do that too.  There is a very healthy and helpful community there.

=== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/DevFaqBecomingProficient[http://wiki.netbeans.org/DevFaqBecomingProficient] , 
that was last modified by NetBeans user Skygo 
on 2013-12-13T23:38:26Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
