////
   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.
////

= Apache Ivy(TM)


== What is Apache Ivy?

Apache Ivy is a tool for managing (recording, tracking, resolving and reporting) 
project dependencies. 
It is characterized by the following:

1. flexibility and configurability
+
Apache Ivy is essentially process agnostic and is not tied to any
methodology or structure.
Instead it provides the necessary flexibility and configurability
to be adapted to a broad range of dependency management and build
processes.

2. tight integration with Apache Ant
+
While available as a standalone tool, Apache Ivy works particularly well
with Apache Ant providing a number of powerful Ant tasks ranging
from dependency resolution to dependency reporting and publication.

== Latest Changes:

See the list of the changes since the last release in the file
link:asciidoc/release-notes{outfilesuffix}[asciidoc/release-notes.adoc]

== Supported Platforms

Please see the the detailed documentation about Ivy compatibility here:
link:asciidoc/compatibility{outfilesuffix}[asciidoc/compatibility.adoc]

== Installation

Please read link:asciidoc/install{outfilesuffix}[asciidoc/install.adoc]
for installation instructions.

== Licensing

This software is licensed under the terms you may find in the file 
named link:LICENSE["LICENSE"] in this directory.

== Crypto 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:

The Ivy ssh resolver requires the JSch library
http://www.jcraft.com/jsch/index.html. +
The sftp and https resolvers requires the Java Cryptography extensions
http://java.sun.com/javase/technologies/security/. +
The PGP signature generator requires the BouncyCastle Java cryptography APIs
https://www.bouncycastle.org/java.html.

== How to Get Involved

The Apache Ivy project really needs and appreciates any contributions, 
including documentation help, source code and feedback.  If you are interested
in contributing, please visit https://ant.apache.org/ivy/get-involved.html.

== How to Report Issues

The Apache Ivy project uses JIRA for issue tracking.  Please report any 
issues you find at https://issues.apache.org/jira/browse/IVY


