<?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 Netbeans. 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>