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

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


