<!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>
	<script type="text/javascript">var xookiConfig = {level: 0};</script>	
	<script type="text/javascript" src="xooki/xooki.js"></script>
</head>
<body>
    <textarea id="xooki-source">
<ol>
    <li><a href="#annoucement">Release Annoucement</a></li>
    <li><a href="#what">What is Apache IvyDE?</a></li>
    <li><a href="#status">Status of this release</a></li>
    <li><a href="#majorchanges">Major Changes in this Release</a></li>
    <li><a href="#contrib">Committers and Contributors for this Release</a></li>
    <li><a href="#changes">List of Changes in this Release</a></li>
</ol>

<h1><a name="annoucement"></a>Release Annoucement</h1>

<tt>
The Apache IvyDE project is pleased to announce its 2.3.0 release.

The Apache IvyDE Eclipse plugin integrates Apache Ivy's dependency management into Eclipse. It lets you manage your dependencies declared in an ivy.xml in your Java Eclipse projects, or any other kind of project which needs dependency management. Apache IvyDE will contribute to the classpath of your Java project or you can make it retrieve your dependencies directly into your project. Last but not least Apache IvyDE offer editors of ivy.xml and ivysettings.xml files with completion. Get some preview here: http://ant.apache.org/ivy/ivyde/screenshots.html

Major changes in this release:

!!!! TODO !!!!

Compatibility:
!!!! TODO !!!!

!!!! TODO !!!! status of the release: stable or beta ?

A more detailed release notes can be read there:
http://ant.apache.org/ivy/ivyde/history/latest-milestone/release-notes.html

Download the 2.3.0 release at:
http://ant.apache.org/ivy/ivyde/download.cgi

Or use directly the Apache IvyDE's updatesite:
http://www.apache.org/dist/ant/ivyde/updatesite

Issues should be reported to:
https://issues.apache.org/jira/browse/IVYDE

More information can be found on the Apache IvyDE website:
http://ant.apache.org/ivy/ivyde/
</tt>

<h1><a name="what"></a>What is Apache IvyDE?</h1>

Apache IvyDE is the Eclipse plugin which integrates Apache Ivy's dependency management into Eclipse&#153;.

Apache IvyDE lets you manage your dependencies declared in an ivy.xml in your Java Eclipse projects, or any other kind of project which needs dependency management. Apache IvyDE will contribute to the classpath of your Java project or you can make it retrieve your dependencies directly into your project. Last but not least Apache IvyDE offer editors of ivy.xml and ivysettings.xml files with completion. Get some preview here: http://ant.apache.org/ivy/ivyde/screenshots.html.

<h1><a name="status"></a>Status of this release</h1>

!!!! TODO !!!!

<h1><a name="majorchanges"></a>Major Changes in this Release</h1>

!!!! TODO !!!!

<h1><a name="contrib"></a>Committers and Contributors</h1>

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 IvyDE !

<ul>Committers
<li>Maarten Coene</li>
<li>Xavier Hanin</li>
<li>Nicolas Lalev&eacute;e</li>
<li>Jon Schneider</li>
<li>Gilles Scokart</li>
</ul>
<ul>Contributors:
<li>Daniel Becheanu</li>
<li>Peter Blstak</li>
<li>Clint Burghduff</li>
<li>Peter Chanthamynavong</li>
<li>Gregory Fernandez</li>
<li>Thomas Friol</li>
<li>Troy Gaines</li>
<li>Nicolas Gavalda</li>
<li>Eugene Goldfarb</li>
<li>Matt Goldspink</li>
<li>Will Gorman</li>
<li>Miguel Griffa</li>
<li>Stephen Haberman</li>
<li>Matt Hillsdon</li>
<li>Adam Karl</li>
<li>Bernd Kurz</li>
<li>Ivica Loncar</li>
<li>Jeffrey M. Metcalf</li>
<li>S&eacute;bastien Moran</li>
<li>Marko Niemi</li>
<li>Peter Oxenham</li>
<li>Carsten Pfeiffer</li>
<li>Joe Sortelli</li>
<li>Nathan Summers</li>
<li>Phillip Webb</li>
<li>James Wilkins</li>
<li>Anton Zagorulko</li>
</ul>

<h1><a name="changes"></a>List of Changes in this Release</h1>

List of changes since <a href="/ivy/ivyde/history/2.2.0.final/release-notes.html">Apache IvyDE 2.2.0 final</a>:
<ul>
    <li>FIX: xml bomb in workspace causes hang in Ivy code during Search or Synchronize operations (IVYDE-354) (thanks to Matt Hillsdon)</li>
    <li>FIX: Deadlock in classpath container (IVYDE-361) (thanks to Carsten Pfeiffer)</li>
    <li>FIX: Typo in IvyResolveJob (IVYDE-362) (thanks to Nicolas Gavalda)</li>
</ul>
<ul>
    <li>NEW: add support for OSGi 'Bundle-Classpath' directive (Ivy 2.4.0-rc1 is required)</li>
    <li>NEW: basic support for the workspace resolver to find OSGi bundles managed by Ivy in the workspace (Ivy 2.4.0-rc2 is required)</li>
</ul>

    <!-- samples
<ul>
    <li>NEW: new new new (IVYDE-XXX) (thanks to XXX)</li>
</ul>
<ul>
    <li>IMPROVE: improve improve improve (IVYDE-XXX) (thanks to XXX)</li>
</ul>
<ul>
    <li>FIX: fix fix fix (IVYDE-XXX) (thanks to XXX)</li>
</ul>
    -->

Most of our changes are logged in our JIRA, where you can find comments and links to our subversion:
https://issues.apache.org/jira/browse/ivyde

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