<!--
    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 Setup Guide](./installation.html) or
 [On to the General Users Guide&gt;&gt;](./usingGeneral.html)
 
#Users Guide
 
 After having set up MyFaces Ext-Scripting (if you do not have done so please go to our[Installation Page](./installation.html)), you basically can start editing, and be done with
 the users
 guide.
 
 
 Well theoretically anyway, there are some things every user of Extension-Scripting has to take into
 consideration.
 
 
 First of all Ext-Scripting in its current incarnation tries to help the programmers every day life. That
 means, it tries to reduce the number of needed server restarts to the lowest possible minimum which is
 achievable within the boundaries of Java and JSF.
 Also it is not yet fully integrated into the bigger application servers, testing only currently is
 done for Apache Tomcat and Jetty. Scala due to the nature of its compiler interface, definitely only
 will work in an expanded embedded WAR environment, not in an EAR environment.
 
 
 You won't get a zero restart configuration, Extension-Scripting tries not to be perfect in this regard,
 but
 what you can achieve is a significant reduction on restarts by applying scripting languages and dynamic
 compilation.
 
 
 Secondly, we do not try to support every scripting language under the earth, the basic goal is first to
 get
 the basics right and then in subsequent releases to add additional scripting languages support.
 
 
 As is, every scripting language which can compile against the JVM can be supported. Purely interpreted
 languages are not supported.
 
 
 For now we cannot recommend to use Ext-Scripting in a production environment for live patches, although
 it
 theoretically would be possible, and we spent a lot of blood sweat and tears into making the system
 stable
 under multithreaded conditions. For now, however, we simply only can recommend to use Ext-Scripting for
 development and development only scenarios if you need to hot patch code (deployment without any changes
 however should be fine). So if you want to hot patch a running installations, we assume it should work
 fine,
 but you are on your own.
 
 
#Chapters
 The Following Chapters should help you to guide you through the usage of Ext-Scripting
<ul>
   <li>
       <a href="./usingGeneral.html">General users guide</a>
   </li>
   <li>
       <a href="./usingAdvanced.html">Advanced usage</a>
   </li>
   <li>
       <a href="./usingEclipse.html">Ext-Scripting in Eclipse</a>
   </li>
   <li>
       <a href="./usingIntellij.html">Ext-Scripting in Intellij</a>
   </li>
   <li>
       <a href="./usingNetbeans.html">Ext-Scripting in Netbeans</a>
   </li>
</ul>
 
#Navigation Bottom
 [&lt;&lt;Back to the Setup Guide](./installation.html) or
 [On to the General Users Guide&gt;&gt;](./usingGeneral.html)
 
 
