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

=== 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.html[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-01-10, and needs to be reviewed.
