<!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">
Display a dependency tree on the console.

This is a [[ant:postresolvetask post resolve task]], with all the behaviour and attributes common to all post resolve tasks.

Please prefer the use of retrieve + standard ant path creation, which make your build more independent from ivy (once artifacts are properly retrieved, ivy is not required any more).

<h1>Attributes</h1>

<table class="ant">
<thead>
    <tr><th class="ant-att">Attribute</th><th class="ant-desc">Description</th><th class="ant-req">Required</th></tr>
</thead>
<tbody>
    <tr><td>showEvicted</td><td>specify if evicted modules should be printed</td>
        <td>No. Defaults to false</td></tr>
    <tr><td>conf</td><td>a comma separated list of the configurations to take in consideration in the  dependency tree</td>
        <td>No. Defaults to the configurations resolved by the last resolve call, or * if no resolve was explicitly called</td></tr>
    <tr><td>haltonfailure</td><td>true to halt the build on ivy failure, false to continue</td><td>No. Defaults to true</td></tr>
    <tr><td>validate</td><td>true to force ivy files validation against ivy.xsd, false to force no validation</td>
        <td>No. Defaults to default ivy value (as configured in configuration file)</td></tr>
    <tr><td>settingsRef</td><td>A reference to the ivy settings that must be used by this task <b>(since 2.0)</b></td><td>No, 'ivy.instance' is taken by default.</td></tr>
    <tr><td>overwrite</td><td>Overwrite the value of the property if it already exist <b>(since 2.0)</b>.  Before 2.0, the properties were always overwritten.</td><td>No, 'false' by default.</td></tr>
</tbody>
</table>

<h1>Example</h1>
Suppose we have two dependencies one called <i>mydep</i> in revision 2.0 and one called <i>myotherdependency</i> in revision 2.2.
<i>mydep</i> has a transitive dependency on <i>mytransitivedependency</i> in revision 2.2.

Then:
<code type="xml">
<dependencytree />
</code>
will display the following tree in the console:
<code>
Dependency tree for foobar
+- org#mydep;2.0
   \- org#mytransitivedependency;2.2
\- org#myotherdependency;2.2");
</code>

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