<!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: 1};</script>	
	<script type="text/javascript" src="../xooki/xooki.js"></script>
</head>
<body>
	<textarea id="xooki-source">
This page describe how to setup an environment to develop IvyDE.

<h1>Requirement</h1>

<h2>Eclipse plugins</h2>

<ul>
You need some plugins installed in your Eclipse:
<li>the PDE plugins</li>
<li>the Zest plugins if you want to work with the IvyDE resolve visualizer</li>
</ul>

If you have a "Classic" Eclipse, the PDE plugins are already installed. Otherwise you should find them in the Eclipse update site "The Eclipse Project Updates". Under the section "Eclipse Platform SDK", the feature to install is called "Eclipse Platform SDK".

The Zest plugins can be found in the Eclipse updatesite of your Eclipse distribution (Indigo, Juno, etc...). Under the section "Modeling", the feature to install is called "Graphical Editing Framework Zest Visualization Toolkit SDK".

<h2>Ivy</h2>

You will also need Ivy as it is a dependency of IvyDE. Either you will work against a release version of Ivy, or work against an- build form the source in your Eclipse. Note that even when working against a released version, you will still be able to run in debug mode, see the sources and put break points in Ivy code. You just won't be able to modify the sources.

Running against a released version is the simpler. Just install it from the IvyDE updatesite in you Eclipse.

Otherwise you will need to setup a project for Ivy in your workspace, see next section.

<h1>Setup</h1>

<h2>Import Ivy</h2>

If you want to run against an Ivy from source in your workspace, you must import the Ivy project in your workspace. Otherwise, you can skip this section.

The Ivy sources already contains the Eclipse metadata. Just "Import" from "Existing Project into Workspace". 

<h2>Import IvyDE</h2>

Once the required plugins are installed, you can import the IvyDE plugins and features into your workspace. Just do a regular "Import" from "Existing Project into Workspace".

If you just have to fix a bug or add a little feature to IvyDE, just import the "org.apache.ivyde.eclipse" plugin.
If you intend to work on the resolve visualizer, you should import the plugin "org.apache.ivyde.eclipse.resolvevisualizer".

<h1>Launch</h1>

You will have to create you "Launch configuration".

<ul>
<li>In the Debug menu, select "Debug Configuration...".</li>
<li>On the section "Eclipse Application", right click and select "New".</li>
<li>Give a better name to your configuration: "IvyDE".</li>
<li>You may want to give a better location to the workspace in which the forked eclipse will run: for instance "${workspace_loc}/_eclipse/runtime-IvyDE"</li>
</ul>

Now you can launch and so some happy debugging !

<h2>Advanced tips</h2>

<h3>Console log</h3>

For old version of Eclipse only, in recent ones the option is automatically added.

By default the logs of the forked Eclipse just goes in the Error log of the forked Eclipse. It is not ideal when browsing a stack trace since you will have to switch between the 2 Eclipse.
Just add "-consoleLog" in the "Program Arguments" of the launch configuration so that errors of the forked Eclipse will go in the console of the host one.

<h3>Slow fork</h3>

Your hosting Eclipse may have a lot of plugins installed. By default, forking an Eclipse will launch with the same plugins. So forking may take some time and can be painful while developing.

In the launch configuration, you can tune what plugins should be loaded in the "Plug-ins" tab. Select "plug-ins selected below only". Then it is quite tedious to know which one should be selected. The button "Add Required Plug-ins" will help you not missing one.
<ul>Basically you will need:
<li>org.eclipse.ivyde (in your workspace)</li>
<li>org.eclipse.ivy (in your workspace if you have one)</li>
<li>org.eclipse.sdk</li>
<li>org.eclipse.jdt.*</li>
</ul>
</textarea>
<script type="text/javascript">xooki.postProcess();</script>
</body>
</html>
