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

= Ivy Release Announcement

XXXX Date XXXX - The Apache Ivy project is pleased to announce its 2.6.0 release.

== What is Ivy?
Apache Ivy is a tool for managing (recording, tracking, resolving and reporting) project dependencies, characterized by flexibility,
configurability, and tight integration with link:https://ant.apache.org/[Apache Ant].

== Download
You can download this release at link:https://ant.apache.org/ivy/download.cgi[]

Issues should either be discussed in the link:https://ant.apache.org/ivy/mailing-lists.html[Ivy user mailing list] or reported at link:https://issues.apache.org/jira/browse/IVY[]

More information about the project can be found on the website link:https://ant.apache.org/ivy/[]

== Key features in this release

Key features of this 2.6.0 release are:

    * Ivy now requires a minimum of Java 8 runtime.


== List of Changes in this Release

For details about the following changes, check our JIRA install at link:https://issues.apache.org/jira/browse/IVY[]

*List of changes since Ivy 2.5.0:*

- BREAKING: Removed old fr\jayasoft\ivy\ant\antlib.xml AntLib definition file (jira:IVY-1612[])
- FIX: ResolveEngine resets dictator resolver to null in the global configuration (jira:IVY-1618[])
- FIX: ConcurrentModificationException in MessageLoggerHelper.sumupProblems (jira:IVY-1628[])
- FIX: useOrigin="true" fails with file-based ibiblio (jira:IVY-1616[])


- IMPROVEMENT: Ivy command now accepts a URL for the -settings option (jira:IVY-1615[])

- NEW:


////
 Samples :
- NEW: bla bla bla (jira:IVY-1234[]) (Thanks to Jane Doe)
- IMPROVEMENT: bla bla bla (jira:IVY-1234[]) (Thanks to Jane Doe)
- FIX: bla bla bla (jira:IVY-1234[]) (Thanks to Jane Doe)
- DOCUMENTATION: bla bla bla (jira:IVY-1234[]) (Thanks to Jane Doe)
////

== Committers and Contributors

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 !

*Committers:*

* Matt Benson
* Jean-Louis Boudart
* Maarten Coene
* Charles Duffy
* Gintautas Grigelionis
* Xavier Hanin
* Nicolas Lalev&eacute;e
* Jan Mat&egrave;rne 
* Jaikiran Pai
* Jon Schneider
* Gilles Scokart

*Contributors:*

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