 ~~ 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 beta stage, so no fully 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 Beta 1 "Release" Maven packages can be found in {{{http://people.apache.org/~lu4242/extscript10beta1} http://people.apache.org/~lu4242/extscript10beta1}}

 For manual inclusion of Ext-Scripting the meta bundles can be found here:

  * {{{http://people.apache.org/~lu4242/extscript10beta1/org/apache/myfaces/extension-scripting/extscript-myfaces12-bundle/1.0-beta-1/}MyFaces 1.2 meta bundle directory}}
  * {{{http://people.apache.org/~lu4242/extscript10beta1/org/apache/myfaces/extension-scripting/extscript-myfaces20-bundle/1.0-beta-1/}MyFaces 2.0 meta bundle directory}}


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


Manual Checkout and Build

 For manual checkout and building instructions of the Ext-Scripting Trunk  {{{installation.html}Ext-Scripting installation page}}
 For manual download instructions of the Ext-Scripting Beta 1 release follow the link to the {{{install_beta_1.html}Ext-Scripting Beta 1 installation page}}
 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.

  Building instructions can be found under {{{installation.html}Ext-Scripting installation page}}

  
