Apache Flex BlazeDS
===================

    Apache Flex SDK is an application development framework for easily building
    Flash-based applications for mobile devices, web browsers, and desktops.

    Apache Flex BlazeDS is the server-based Java remoting and web messaging
    technology that enables developers to easily connect to back-end distributed
    data and push data in real-time to Adobe® Flex® and Adobe AIR™ applications
    for more responsive rich Internet application (RIA) experiences..

    Apache Flex BlazeDS 4.7.2 is an update to the initial release of BlazeDS
    from the Apache Software Foundation.  Prior to this, releases were provided 
    by Adobe Systems Inc. It is compatible with most code written to target Adobe
    Flex 4.6.

    For detailed information about Apache Flex please visit
    http://flex.apache.org/


Getting the latest sources via Git
==================================

    Getting the source code is the recommended way to get Apache Flex BlazeDS.

    You can always checkout the latest source via git using the following
    command:

	 git clone https://git-wip-us.apache.org/repos/asf/flex-blazeds.git blazeds
	 cd blazeds
	 git checkout develop

    For further information visit http://flex.apache.org/download-source.html


Building Apache Flex BlazeDS 4.7.2
==================================

    Apache Flex BlazeDS is a large project. It requires some build tools which must be
    installed prior to building BlazeDS and it depends on some external software
    which are downloaded as part of the build process.  Some of these have
    different licenses.  See the Software Dependencies section for more
    information on the external software dependencies.

    From Apache's perspective, the Adobe Flash Player and Adobe AIR have
    excluded licenses so they can not be bundled with the Apache Flex binaries.
    They must be installed prior to building Apache Flex.

    Linux support is currently experimental and while it is possible to compile
    BlazeDS it has not been fully tested so you may run into issues.


Install Prerequisites
---------------------

    Before building the Apache Flex BlazeDS you must install the following software
    and set the corresponding environment variables using absolute file paths.  
    Relative file paths will result in build errors.

    ==================================================================================
    SOFTWARE                                    ENVIRONMENT VARIABLE (absolute paths)
    ==================================================================================

    Java SDK 1.7 or greater (*1)                JAVA_HOME

    Maven 2.2.0 or greater (*1)                 MAVEN_HOME

    ==================================================================================

    *1) The bin directories for MAVEN_HOME and JAVA_HOME should be added to your
        PATH.

        On Windows, set PATH to

            PATH=%PATH%;%MAVEN_HOME%\bin;%JAVA_HOME%\bin

        On the Mac (bash), set PATH to

            export PATH="$PATH:$MAVEN_HOME/bin:$JAVA_HOME/bin"

         On Linux make sure you path include MAVEN_HOME and JAVA_HOME.


Software Dependencies
---------------------

    Apache BlazeDS uses a variety of third party libraries. A detailed summary
    of all of these dependencies is listed in the releases DEPENDENCIES file.


Using the Binary Distribution
-----------------------------

    Binary artifacts of Apache BlazeDS are available on Apache's public Maven 
	repositories.

    By adding a Dependency to the following Maven artifact the binary 
	version of Apache BlazeDS will automatically be downloaded.

    <dependency>
        <groupId>org.apache.flex.blazeds</groupId>
        <artifactId>flex-messaging-common</artifactId>
        <version>4.7.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flex.blazeds</groupId>
        <artifactId>flex-messaging-core</artifactId>
        <version>4.7.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flex.blazeds</groupId>
        <artifactId>flex-messaging-opt</artifactId>
        <version>4.7.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flex.blazeds</groupId>
        <artifactId>flex-messaging-proxy</artifactId>
        <version>4.7.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flex.blazeds</groupId>
        <artifactId>flex-messaging-remoting</artifactId>
        <version>4.7.2</version>
    </dependency>


Building the Source
----------------------------------------------

    When you have all the prerequisites in place and the environment variables
    set (see Install Prerequisites above), use

        cd <flex-blazeds.dir>
        mvn install

    Notice that you have to enter the modules directory in order to able to
    execute the Maven build as the rest of the project still contains an
    outdated and no longer maintained ANT build. This will be removed in
    future versions.


Running Tests
-------------

    The testsuite is automatically executed during a normal maven build.


Thanks for using Apache Flex BlazeDS.  Enjoy!

                                          The Apache Flex Project
                                          <http://flex.apache.org>
