


Apache Ivy&#153; is a very powerful dependency manager oriented toward Java&#153; dependency management, although it can be used to manage dependencies of any kind.




If you're unsure if you should use a dependency manager, or if you have general questions about Apache Ivy, consult the link:faq.html[FAQ] and the link:mailing-lists.html[Mailing lists].



== Integrated with Apache Ant&#153;



Apache Ivy is integrated with Apache Ant, the most popular Java build management system, so Apache Ivy follows Apache Ant design principles.  If you have Apache Ant skills, you already have Apache Ivy skills! The plugin mechanism in Apache Ivy follows the Apache Ant model.  Also like Apache Ant, Apache Ivy supports macrodefs and file imports from configuration.




Since Apache Ivy is a subproject of Apache Ant, we even share the same development community!



== Simple to use



For simple cases, Apache Ivy is easy to use. Declare your dependencies, and that's all. See the link:history/latest-milestone/tutorial/start.html[quick start tutorial] to check yourself, it should take less than 5 minutes!




Apache Ivy brings the dependency management advantages of Apache Maven&#153; to Apache Ant build files, for those who already use Apache Ant and don't want to migrate to Apache Maven. But Apache Ivy does not stop there, it provides many more great features!



== Clean dependency reports



Apache Ivy produces two primary report types: HTML reports and graph reports. HTML reports give a good understanding of what Apache Ivy did, and of a project's immediate dependencies. The graph reports provide a good overview of a project's transitive dependencies (see below) and conflicts.




Here are some sample Apache Ivy reports:



link:history/latest-milestone/samples/ivy-sample-xslt.xml[ image:images/ivyfile-small.png[browsable ivy file through simple xslt]] link:images/hibgraph.png[ image:images/hibgraph-small.png[full dependency graph]] link:history/latest-milestone/samples/jayasoft-ivyrep-example-default.html[ image:images/report-small.png[detailed dependency report]]





== Non intrusive



Apache Ivy is most commonly used to resolve dependencies and copy them to the lib directory of a project. After dependencies have been copied, a build no longer depends on Apache Ivy. Therefore, existing builds may easily be migrated to Apache Ivy using the lib directory pattern. Also, dependencies can be delivered with a project so that the build file need not depend on Apache Ivy.



== Extremely flexible



In most cases, Apache Ivy will conform to your existing environment.




Apache Ivy comes with many default values that work out of the box, and most can be changed. For example, you can change the way Apache Ivy finds the latest dependency versions, you can change the conflict manager, you can choose if you want Apache Ivy to copy dependencies to your project libs or use them directly from the cache, etc.



== Easily extensible



When Apache Ivy does not do what you want out of the box, you can often extend it to solve your problem. For instance, you can plug your own repository. But you can also define your own latest strategy and your own conflict manager. See link:history/latest-milestone/extend.html[how to extend Ivy] in the reference doc. 




You can even define your own metadata on your modules, with link:history/latest-milestone/concept.html[extra attributes].



== High performance



The Apache Ivy project has always emphasized performance. For example, Apache Ivy uses a cache to avoid duplicate dependency downloads.  Also, all settings and ivy files are parsed using SAX for maximum performance.



== Transitive dependencies



Imagine a component that's often reused by a software team, and that this component has dependencies of its own. Without a good dependency management tool, each time this component is reused, all its dependencies must be repeated. With Apache Ivy, it's different: simply write a dependency file once for the component, and benefit from the work already done anytime this component is reused.




This model is even more powerful as the component's own dependencies change over time. In this case, without Apache Ivy, the resulting ripple effect can disrupt your project. With Apache Ivy, you update the ivy file of the component and that's it!



== Strong conflict management



Transitive dependencies can cause confusion over exactly which version of a dependency gets bundled, because several modules require it in different versions. Apache Ivy provides a strong and flexible conflict management engine, which allows choosing the version to be evicted or kept in each case.




Apache Ivy also implements transitive dependencies management, which means that conflicts are solved for each dependency before being solved for your whole module. This  ensures that problematic conflicts will only need to be solved in the dependency where they are encountered.



== Out of the box maven repository support



The public maven repository has many advantages: a lot of modules available, easy search with mvnrepository.com, etc. With Apache Ivy, you benefit from this repository out of the box thanks to maven2 metadata compatibility. 



== Continuous Integration Ready



Are you working in a continuous integration (CI) environment? No? You should be ;-)




If you are working in a CI environment, and if you have many projects that depend one on each other, then you might be experiencing the dependency management nightmare. Fortunately, Apache Ivy can help you!




With Apache Ivy you can declare that a component depends on the latest version of another component. Knowing that, Apache Ivy will search for the latest version of the dependency whenever you ask it to do so. This latest version is computed either by checking the date of the dependency versions or by comparing versions as text (either lexicographically or with an algorithm close to the one used in php version_compare function).



== Publication handling



Apache Ivy helps you publish your projects to your repository. This simplifies the management of multi-project environments.



== Pluggable module descriptor parsers



Apache Ivy is able to use ivy-files as module descriptors, but also maven2 POMs, or even your own module descriptors! This can help you move softly from an existing repository of modules to an Ivy-managed one.



== Unique enterprise features



Apache Ivy is the only dependency management tool to support powerful features such as repository namespace and building through the install task. A link:history/latest-milestone/tutorial/build-repository.html[tutorial] is dedicated to this feature which shows how to build your own repository by importing data from a public one, and how to convert heterogeneous repositories into a stable and homogeneous one.



== Heavily tested



Apache Ivy benefits from a lot of unit tests checked at each code modification. It is also heavily tested by the community itself, and we pay a lot of attention to bug fixing and code stability.



== Free and open source



Apache Ivy is an Apache project, which means that it's fully open sourced, with a business-friendly Apache license.




Since it's open source, you can even modify it for your own needs, and let the community benefit from your enhancements if you like.



== Extensively documented



Not only is Apache Ivy free and open source, but you also have access to very detailed tutorial and reference documentation.



== Self contained



The core engine which enables most Apache Ivy features is provided as a single jar with no dependency other than JRE 1.4 or greater. This means that you can very easily use Apache Ivy to bootstrap your build system, or to embed in your own tool. Apache Ant support is provided only as a thin wrapper over the Apache Ivy engine so that you can do everything in embedded or standalone mode.

