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

     https://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 https://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
https://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


