Apache Harmony - Open Source Java SE
http://harmony.apache.org/

Apache Harmony is the Java SE project of the Apache Software Foundation.

The aim of the project is to produce a large and healthy community of
those interested in runtime platforms tasked with creation of:

 * A compatible, independent implementation of the Java SE JDK under
   the Apache License v2

 * A community-developed modular runtime (VM and class library)
   architecture.

This source can be built from a tar/zip using:

  ant fetch-depends build

To build from a subversion checkout it is necessary to fetch the
component source with:

  ant populate-src

For information, including details of the prerequisites, see:

  http://harmony.apache.org/quickhelp_contributors.html

For more information about using Apache Harmony see:

  http://harmony.apache.org/quickhelp_users.html

Please send any feedback to:

  dev@harmony.apache.org

Export Notice
-------------

This distribution includes cryptographic software.  The country in
which you currently reside may have restrictions on the import,
possession, use, and/or re-export to another country, of
encryption software.  BEFORE using any encryption software, please
check your country's laws, regulations and policies concerning the
import, possession, or use, and re-export of encryption software, to
see if this is permitted.  See http://www.wassenaar.org/ for more
information.

The U.S. Government Department of Commerce, Bureau of Industry and
Security (BIS), has classified this software as Export Commodity
Control Number (ECCN) 5D002.C.1, which includes information security
software using or performing cryptographic functions with asymmetric
algorithms.  The form and manner of this Apache Software Foundation
distribution makes it eligible for export under the License Exception
ENC Technology Software Unrestricted (TSU) exception (see the BIS
Export Administration Regulations, Section 740.13) for both object
code and source code.

The following provides more details on the included cryptographic
software:

Apache Harmony contains code that is specifically designed to enable
cryptography.  In particular Apache Harmony contains an implementation
the Java cryptographic extensions.  In addition, binary distributions
of Apache Harmony may contain cryptographic functionality provided by
The Legion of the Bouncy Castle (http://www.bouncycastle.org).
