<!--
    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 appendix: Setup steps](./setupSteps.html)
 or
 [On to the appendix: Example Configuration&gt;&gt;](./exampleconfig.html)
 
#Appendix: Configuration Entries
## General Information
 
 This page is a general quick overview over the possible configuration parameters, if you need further
 details please visit the[setup guide](./installation.html).
 
 
<table>
   <thead>
       <tr>
           <td>Param</td>
           <td>Required</td>
           <td>Possible values</td>
           <td>Short Description</td>
       </tr>
   </thead>
   <tbody>
       <tr>
           <td>org.apache.myfaces.FACES_INIT_PLUGINS</td>
           <td>YES</td>
           <td>org.apache.myfaces.extensions.scripting.servlet.StartupServletContextPluginChainLoader</td>
           <td>MyFaces Extension Point Setup</td>
       </tr>
       <tr>
           <td>org.apache.myfaces.extensions.scripting.groovy.LOADER_PATHS</td>
           <td>NO</td>
           <td>comma separate list of paths</td>
           <td>Additional comma separated loader paths to allow direct editing of groovy files on the sources
               directory instead of editing in the deployment dir /WEB-INF/groovy
           </td>
       </tr>
       <tr>
           <td>org.apache.myfaces.extensions.scripting.scala.LOADER_PATHS</td>
           <td>NO</td>
           <td>comma separate list of paths</td>
           <td>Additional comma separated loader paths to allow direct editing of scala files on the sources
               directory instead of editing in the deployment dir /WEB-INF/scala
               <b>Note this functionality is enabled only in ext-script 1.0.3 or newer</b>
           </td>
       </tr>
       <tr>
           <td>org.apache.myfaces.extensions.scripting.java.LOADER_PATHS</td>
           <td>NO</td>
           <td>comma separate list of paths</td>
           <td>Additional comma separated loader paths to allow direct editing of java files on the sources
               directory instead of editing in the deployment dir /WEB-INF/java
           </td>
       </tr>
       <tr>
           <td>org.apache.myfaces.extensions.scripting.resource.LOADER_PATHS</td>
           <td>NO</td>
           <td>comma separate list of paths</td>
           <td>Additional comma separated loader paths to allow direct editing of resources on the sources
               directory instead of editing in the deployment directory
           </td>
           <td>Important notice, in most cases this path will point to the root of your web application
               directory
               (ie: src/main/webapp in a standard Maven2 structure or &lt;project-root&gt;/webapp for a
               standard
               Eclipse project structure)
           </td>
       </tr>
       <tr>
           <td>facelets.RESOURCE_RESOLVER</td>
           <td>NO</td>
           <td>org.apache.myfaces.extensions.scripting.jsf.facelet.MyFacesReroutingResourceResolver</td>
           <td>Enables the loading of xhtml facelet pages from your source directory, if
               org.apache.myfaces.extensions.scripting.resource.LOADER_PATHS is set properly
           </td>
       </tr>
       <tr>
           <td>org.apache.myfaces.scripting.PGK_WHITELIST</td>
           <td>NO</td>
           <td>a comma separate list of whitelisted packages</td>
           <td>Enables package whitelisting, a mechanism which allows to compile and reload only from
               whitelisted packages. This can help in case of having to reroute ext-scripting to
               your compile source directories. With this option you can isolate your own dynamic classes
               from the rest of the system.
           </td>
       </tr>
       <tr>
           <td>org.apache.myfaces.extensions.scripting.PGK_ADDITIONAL_CLASSPATH</td>
           <td>NO</td>
           <td>a comma separate list of additional classpaths</td>
           <td>enables additional classpaths for the compile time</td>
       </tr>
   </tbody>
</table>
 
#Normal configuration entries
 all configuration follow the context parameter convention
                <context-param>
                    <description>
                        Initializes the plugins for our scripting support
                    </description>
                    <param-name>org.apache.myfaces.FACES_INIT_PLUGINS</param-name>
                    <param-value>org.apache.myfaces.extensions.scripting.servlet.StartupServletContextPluginChainLoader</param-value>
                </context-param>
             
             
 
#Navigation Bottom
 [&lt;&lt;Back to the appendix: Setup steps](./setupSteps.html)
 or
 [On to the appendix: Example Configuration&gt;&gt;](./exampleconfig.html)
 
