<!--
    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.ReroutingResourceResolver</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)
 
