<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<!--
   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.    
-->
<html>
<head>
	<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
	<script type="text/javascript">var xookiConfig = {level: 0};</script>	
	<script type="text/javascript" src="xooki/xooki.js"></script>
</head>
<body>
	<textarea id="xooki-source">

<h2>Announcement</h2>

<pre>
December 21, 2015 - The Apache Ivy project is pleased to announce its 2.5.0 release.
 
Apache Ivy is a tool for managing (recording, tracking, resolving and
reporting) project dependencies, characterized by flexibility,
configurability, and tight integration with Apache Ant.

Key features of this 2.5.0 release are
* Ivy nows uses BoucyCastle 1.52. Due to the non backward compatibility of that library, earlier versions are not supported.
* TODO
* TODO
* TODO

You can download this 2.5.0 release at:
http://ant.apache.org/ivy/download.cgi
 
Issues should be reported to:
https://issues.apache.org/jira/browse/IVY
 
More information can be found on the website:
http://ant.apache.org/ivy/
</pre>
 
<h2>List of Changes in this Release</h2>
 
For details about the following changes, check our JIRA install at 
http://issues.apache.org/jira/browse/ivy
 
List of changes since Ivy 2.4.0:

- FIX: ArrayIndexOutOfBoundsException when using a p2 repository for dependencies (IVY-1504)
- FIX: fixdeps remove transitive 'kept' dependencies
- FIX: PomModuleDescriptorParser should parse licenses from parent POM (IVY-1526) (Thanks to Jaikiran Pai)
- FIX: dynamic revisions are not cached per resolver (IVY-1430) (Thanks to Stephen Haberman)
- FIX: Dependencies failed using branch attribute (and extra attributes) (IVY-1141) (Thanks to Stephen Haberman)
- FIX: useCacheOnly should allow lookup of changing dependencies in cache (IVY-1515) (Thanks to Ilya)

- IMPROVEMENT: Optimization: limit the revision numbers scanned if revision prefix is specified (Thanks to Ernestas Vaiciukevi&#269;ius)
- IMPROVEMENT: Update bouncycastle to 1.52 (IVY-1521) (Thanks to Michal Srb)

- NEW: Lets ssh-based resolvers use an ~/.ssh/config file to find username/hostname/keyfile options (Thanks to Colin Stanfill)
- NEW: Add ivy.maven.sources.lookup and ivy.maven.javadoc.lookup variables to control the lookup of the additional artifacts. Defaults to true, for backward compatibility (IVY-1529)

<!-- Samples :
- NEW: bla bla bla (IVY-1234) (Thanks to Jane Doe)
- IMPROVEMENT: bla bla bla (IVY-1234) (Thanks to Jane Doe)
- FIX: bla bla bla (IVY-1234) (Thanks to Jane Doe)
- DOCUMENTATION: bla bla bla (IVY-1234) (Thanks to Jane Doe)
-->

<h2>Committers and Contributors</h2>

Here is the list of people who have contributed source code and documentation up to this release. Many thanks to all of them, and also to the whole IvyDE community contributing ideas and feedback, and promoting the use of Apache Ivy !

<ul>Committers
<li>Matt Benson</li>
<li>Jean-Louis Boudart</li>
<li>Maarten Coene</li>
<li>Charles Duffy</li>
<li>Xavier Hanin</li>
<li>Nicolas Lalevee</li>
<li>Jon Schneider</li>
<li>Gilles Scokart</li>
</ul>

<ul>Contributors:
<li>Ingo Adler</li>
<li>alex322</li>
<li>Mathieu Anquetin</li>
<li>Andreas Axelsson</li>
<li>Stephane Bailliez</li>
<li>Karl Baum</li>
<li>Andrew Bernhagen</li>
<li>Mikkel Bjerg</li>
<li>Per Arnold Blaasmo</li>
<li>Jeffrey Blattman</li>
<li>Jasper Blues</li>
<li>Jim Bonanno</li>
<li>Joseph Boyd</li>
<li>Dave Brosius</li>
<li>Matthieu Brouillard</li>
<li>Carlton Brown</li>
<li>Mirko Bulovic</li>
<li>Ed Burcher</li>
<li>Jamie Burns</li>
<li>Wei Chen</li>
<li>Chris Chilvers</li>
<li>Kristian Cibulskis</li>
<li>Andrea Bernardo Ciddio</li>
<li>Archie Cobbs</li>
<li>Flavio Coutinho da Costa</li>
<li>Stefan De Boey</li>
<li>Mykhailo Delegan</li>
<li>Charles Duffy</li>
<li>Martin Eigenbrodt</li>
<li>Stephen Evanchik</li>
<li>Robin Fernandes</li>
<li>Gregory Fernandez</li>
<li>Danno Ferrin</li>
<li>Benjamin Francisoud</li>
<li>Wolfgang Frank</li>
<li>Jacob Grydholt Jensen</li>
<li>John Gibson</li>
<li>Mitch Gitman</li>
<li>Evgeny Goldin</li>
<li>Scott Goldstein</li>
<li>Pierre Hägnestrand</li>
<li>Scott Hebert</li>
<li>Tobias Himstedt</li>
<li>Aaron Hachez</li>
<li>Ben Hale</li>
<li>Stephen Haberman</li>
<li>Peter Hayes</li>
<li>Scott Hebert</li>
<li>Payam Hekmat</li>
<li>Achim Huegen</li>
<li>Ilya</li>
<li>Matt Inger</li>
<li>Anders Jacobsson</li>
<li>Anders Janmyr</li>
<li>Steve Jones</li>
<li>Christer Jonsson</li>
<li>Michael Kebe</li>
<li>Matthias Kilian</li>
<li>Alexey Kiselev</li>
<li>Gregory Kisling</li>
<li>Stepan Koltsov</li>
<li>Heschi Kreinick</li>
<li>Sebastian Krueger</li>
<li>Thomas Kurpick</li>
<li>Tat Leung</li>
<li>Costin Leau</li>
<li>Antoine Levy-Lambert</li>
<li>Tony Likhite</li>
<li>Andrey Lomakin</li>
<li>William Lyvers</li>
<li>Sakari Maaranen</li>
<li>Jan Materne</li>
<li>Markus M. May</li>
<li>Abel Muino</li>
<li>J. Lewis Muir</li>
<li>Stephen Nesbitt</li>
<li>Joshua Nichols</li>
<li>Bernard Niset</li>
<li>Ales Nosek</li>
<li>David Maplesden</li>
<li>Glen Marchesani</li>
<li>Phil Messenger</li>
<li>Steve Miller</li>
<li>Mathias Muller</li>
<li>Randy Nott</li>
<li>Peter Oxenham</li>
<li>Jaikiran Pai</li>
<li>Douglas Palmer</li>
<li>Jesper Pedersen</li>
<li>Emmanuel Pellereau</li>
<li>Carsten Pfeiffer</li>
<li>Yanus Poluektovich</li>
<li>Roshan Punnoose</li>
<li>Jean-Baptiste Quenot</li>
<li>Carl Quinn</li>
<li>Damon Rand</li>
<li>Geoff Reedy</li>
<li>Torkild U. Resheim</li>
<li>Christian Riege</li>
<li>Frederic Riviere</li>
<li>Jens Rohloff</li>
<li>Andreas Sahlbach</li>
<li>Brian Sanders</li>
<li>Adrian Sandor</li>
<li>Michael Scheetz</li>
<li>Ben Schmidt</li>
<li>Ruslan Shevchenko</li>
<li>John Shields</li>
<li>Nihal Sinha</li>
<li>Gene Smith</li>
<li>Michal Srb</li>
<li>Colin Stanfill</li>
<li>Simon Steiner</li>
<li>Johan Stuyts</li>
<li>John Tinetti</li>
<li>Erwin Tratar</li>
<li>Jason Trump</li>
<li>David Turner</li>
<li>Ernestas Vaiciukevi&#269;ius</li>
<li>Tjeerd Verhagen</li>
<li>Richard Vowles</li>
<li>Sven Walter</li>
<li>James P. White</li>
<li>Tom Widmer</li>
<li>John Williams</li>
<li>Chris Wood</li>
<li>Patrick Woodworth</li>
<li>Jaroslaw Wypychowski</li>
<li>Sven Zethelius</li>
<li>Aleksey Zhukov</li>
<li>Zhong Wang</li>
</ul>

	</textarea>
<script type="text/javascript">xooki.postProcess();</script>
</body>
</html>
