////
     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.
////
= Getting Help
:jbake-type: page
:jbake-tags: community
:jbake-status: published
:keywords: Apache NetBeans Help
:description: Apache NetBeans Help
:toc: left
:toc-title:

[[documentation]]
== Learning Trails

The following learning trails provide you with everything you need to know to develop applications using NetBeans IDE.

- link:/kb/docs/java/index.html[Java SE Applications]

- link:/kb/docs/php/index.html[PHP and HTML5 Applications]

- link:/kb/docs/ide/index.html[Integration with External Tools and Services]

NOTE: The learning trails, tutorials, and related documentation are works in progress, incomplete, and being reviewed: link:https://issues.apache.org/jira/browse/NETBEANS-1867[NETBEANS-1867]. See link:http://netbeans.apache.org/kb/docs/contributing.html[our documentation contribution guidelines] to learn how you can help us.

== Other resources

These other resources are available:

- Javadoc is updated hourly at https://bits.netbeans.org/dev/javadoc
- Short videos on how to link:getting-started.html[get started with the Apache NetBeans Platform] to build Java Desktop Applications.
- Visit the link:https://netbeans.org/kb/index.html[netbeans.org docs & support] section in the old website.
- Our link:https://www.youtube.com/user/NetBeansVideos[YouTube Video Channel] contains many tutorials and tips.
- The previous link:/wiki/index.asciidoc[wiki] has been partially migrated and is being updated.
- The link:https://github.com/apache/netbeans-website-cleanup[content of the previous netbeans.org website] is being cleaned up in github.
- The link:https://github.com/apache/netbeans-website[current Apache NetBeans website] (i.e., this website) is also hosted at github.

[[wiki]]
== Apache NetBeans Wiki

Some parts of the NetBeans Wiki link:/wiki/index.asciidoc[have been ported], but need review.

[[support]]
== Support

Community Support::
Is available through our link:/community/mailing-lists.html[mailing lists].

Commercial Support::
Is also available. See link:commercial-support.html[this link] for more info.


