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

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

=== How determine all available project types?

* create a new nbm-module using the "_New Project..._"-wizard and choose your target platform
* create a layer.xml using the "_New File..._"-wizard
* expand the nodes "_Important Files/XML Layer/<this layer in context>/Projects_" within the project view
* the direct childnodes of "Projects" are the supported project types of the target platform (see the screenshot below)

The project type can be used for extending the project properties - See link:DevFaqActionAddProjectCustomizer.asciidoc[DevFaqActionAddProjectCustomizer].

==== Example of some available types in NetBeans 7.2

image:ChildnodesRepresentingProjectTypes.jpg[])

[source,java]
----

org-netbeans-modules-ant-freeform
org-netbeans-modules-apisupport-project
org-netbeans-modules-apisupport-project-suite
org-netbeans-modules-apisupport-project-suite-jnlp
org-netbeans-modules-apisupport-project-suite-osgi
org-netbeans-modules-apisupport-project-suite-package
org-netbeans-modules-autoproject
org-netbeans-modules-j2ee-clientproject
org-netbeans-modules-j2ee-earproject
org-netbeans-modules-j2ee-ejbjarproject
org-netbeans-modules-java-j2seproject
org-netbeans-modules-maven
org-netbeans-modules-web-project
...
----

Note: The list is incomplete. There will be more project types, if you enable support for JS, PHP, Gradle a.s.o.

--
Applies to: NetBeans IDE 7.x
Platforms: All

=== 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/DevFaqActionAllAvailableProjectTypes[http://wiki.netbeans.org/DevFaqActionAllAvailableProjectTypes] , 
that was last modified by NetBeans user Skygo 
on 2013-12-16T19:53:47Z.


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