<!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">
<h1><a name="latest"></a>Install the last release via Internet</h1>

For most user who have access to the internet it is simpler to install the latest release from the Apache IvyDE updatesite. So just look out there:
http://ant.apache.org/ivy/ivyde/download.cgi

<h1><a name="manual"></a>Manual install</h1>

<h2>Install Apache IvyDE</h2>

So you should have the zip distribution of Apache IvyDE in which you should find these files:
<ul>
<li>features/org.apache.ivyde.feature_2.1.0.XXXX.jar</li>
<li>plugins/org.apache.ivyde.eclipse_2.1.0.XXXX.jar</li>
</ul>

You can then install them by copying them respectively in the $ECLIPSE_HOME/features and the $ECLIPSE_HOME/plugins:
<code>
cp features/* $ECLIPSE_HOME/features
cp plugins/* $ECLIPSE_HOME/plugins
</code>

<h2>Install the latest Apache Ivy bundle</h2>

Get the latest Apache Ivy feature and bundle for the updatesite:
<ul>
<li>the <a href="[preferred]/ant/ivyde/updatesite/features">features folder</a></li>
<li>the <a href="[preferred]/ant/ivyde/updatesite/plugins">plugins folder</a></li>
</ul>

And then just copy them respectively in the $ECLIPSE_HOME/features and the $ECLIPSE_HOME/plugins folders.

<h2>Restart Eclipse</h2>

After installing manually your plugins, you have to restart your Eclipse to have it take into account the changes. It is recommended to restart it with the -clean option on the command line.

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