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