<!--
    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 Eclipse Users Guide](./usingEclipse.html)
 or
 [On to the NetBeans Users Guide&gt;&gt;](./usingNetbeans.html)
 
#Introduction
 
 Intellij is very specific because it allows mixed programming out of the box, hence it is the ideal
 partner for mixing it with Ext-Scripting. However while setting everything up you have to be aware
 of several specifics.
 
<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 Idea. 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 sourcepath 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 Structure -&gt;Modules-&gt;&lt;Your Web Module&gt;
 and mark your script directories as source paths:
 ![setting the sourcepath from Intellij](images/intellij-source.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 Eclipse Users Guide](./usingEclipse.html)
 or
 [On to the NetBeans Users Guide&gt;&gt;](./usingNetbeans.html)
 
 
