<!--
    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.
-->
 
 
#Navigation Top
 [&lt;&lt;Back to the Intellij Users Guide](./usingIntellij.html)
 or
 [On to the appendix: Setup Steps&gt;&gt;](./setupSteps.html)
 
#Introduction
 
 Netbeans also works perfectly in conjunction with Ext-Scripting
 pretty much everything said for Eclipse and Intellij also applies to NetBeans.
 The biggest restriction is if you want to use Netbeans in conjunction with maven
 only one source folder is picked up and you cannot use additional source folders
 like for instance Intellij or Eclipse allow. So either dont use maven or
 use package whitelisting as workaround if you want to use Netbeans.
 
<ul>
   <li>Ext-Scripting does its own incremental compile cycle depending on the sources changed</li>
   <li>Deployment and Redeployment is not needed as long as Ext-Scripting itself can pick up the changes
   </li>
</ul>
 
#Setting up Eclipse
## Prerequirements
 Secondly make sure that your project compiles properly
 and can be properly deployed from Netbeans. Turn off any auto deployment mechanisms
 which might trigger unnecessary restarts.
 
 If you use scripting languages make sure to have the proper
 plugin installed for the scripting language of your choice
 
 
 
#Setting up Ext-Scripting specifics
 
 If you only have one source path you might have a look at the package whitelisting
 to mark only the packages you actively want to edit for this deployment cycle.
 This speeds up startup time and helps generally to avoid restarts.
 
 
 If you use different paths then you can work by including the added source paths as sources
 like WEB-INF/java or WEB-INF/groovy (not classes compiled via Ext-Scripting always have higher loading
 priority than what can be found in WEB-INF/classes), so there is no need to change any target
 directories
 source directories always are enough.
 To change your source directories open
 File-&gt;Project Properties -&gt; Sources - &gt; Source Package Folders
 and press the Add Folder button
 
 ![setting the sourcepath from Intellij](images/netbeans-source1.jpg)
 
 After that you get a file dialog where you can choose your source directory.
 
 ![setting the sourcepath from Intellij](images/netbeans-source2.jpg)
 
 You can leave your compile target directory unchanged
 
 
 If you prefer your own source paths to be the sources of everything set the
 org.apache.myfaces.extensions.scripting.java.LOADER_PATHS
 or
 org.apache.myfaces.extensions.scripting.groovy.LOADER_PATHS
 accordingly in your web.xml the same goes for the resource roots.
 
 
#Navigation Bottom
 [&lt;&lt;Back to the Intellij Users Guide](./usingIntellij.html)
 or
 [On to the appendix: Setup Steps&gt;&gt;](./setupSteps.html)
 
 
