 ~~ 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.
 
 ------
Download Apache MyFaces Extension Scripting
 ------

Download Apache MyFaces Extension Scripting

 As of now the project is in alpha stage, so no stable release has happened.
 While we personally think the project already has beta quality, no official beta has been done yet.

 The best bet to try Ext-Scripting for now is a source build from maven (see link below)
 For Binary Builds from maven you can use the Alpha Repository or the trunk
 (see  {{{installation.html} the Ext-Scripting Installation Page }} for further information)

 The Binary Alpha 1 "Release" Maven packages can be found in {{{http://people.apache.org/~lu4242/extscript100alpha} http://people.apache.org/~lu4242/extscript100alpha}}

 Note since the codebase is alpha currently there is no official release or distributions.
 Distribution packages will follow in the upcoming weeks during the beta phase.
 It is recommended to checkout and use the latest sources.

 For manual download instructions of the Ext-Scripting Alpha 1 release follow the link to the {{{install_alpha_1.html}Ext-Scripting Alpha 1 installation page}}

Latest source code from SVN repository

  If you want to use the latest Apache MyFaces Ext-Scripting features, the source code is under
  version control with SVN.  Click {{{source-repository.html} here }}
  for information on how to use the ASF MyFaces Ext-Scripting SVN Repository.
