<?xml version="1.0" encoding="ISO-8859-1" ?>
<!--
    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.
-->
<document>
    <properties>
        <title>Using Ext-Scripting in Eclipse</title>
    </properties>

    <body>

        <section name="Navigation Top">
            <a href="using_intellij.html">&lt;&lt;Back to the Intellij Users Guide</a>
            or
            <a href="setup_steps.html">On to the appendix: Setup Steps&gt;&gt;</a>
        </section>


        <section name="Introduction">
            <p>
                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.

            </p>
            <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>
        </section>
        <section name="Setting up Eclipse">
            <subsection name="Prerequirements">

                <p>Secondly make sure that your project compiles properly
                    and can be properly deployed from eclipse. Turn off any auto deployment mechanisms
                    which might trigger unnecessary restarts.
                </p>

                <p>If you use scripting languages make sure to have the proper
                    plugin installed for the scripting language of your choice
                </p>
            </subsection>
        </section>
        <section name="Setting up Ext-Scripting specifics">
            <p>
                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.
            </p>
            <p>
                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
                <b>File->Project Properties -> Sources - > Source Package Folders</b>
                and press the Add Folder button
            </p>
            <img src="images/netbeans_source1.jpg" alt="setting the sourcepath from Intellij"/>
            <p>
                After that you get a file dialog where you can choose your source directory.
            </p>
            <img src="images/netbeans_source2.jpg" alt="setting the sourcepath from Intellij"/>
            <p>
                You can leave your compile target directory unchanged
            </p>
            <p>
                If you prefer your own source paths to be the sources of everything set the
                <b>org.apache.myfaces.extensions.scripting.java.LOADER_PATHS</b>
                or
                <b>org.apache.myfaces.extensions.scripting.groovy.LOADER_PATHS</b>
                accordingly in your web.xml the same goes for the resource roots.
            </p>

        </section>

        <section name="Navigation Bottom">
            <a href="using_intellij.html">&lt;&lt;Back to the Intellij Users Guide</a>
            or
            <a href="setup_steps.html">On to the appendix: Setup Steps&gt;&gt;</a>
        </section>

    </body>
</document>