<!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">
Ivy can be used as a standalone program very easily. All you need is a java 1.4+ runtime environment (JRE)!

Then here is how to call it:
<code>
java -jar ivy.jar -?
</code>
It will display an online help like this:
<code>
==== settings options
 -settings <settingsfile>     use given file for settings
 -cache <cachedir>            use given directory for cache
 -novalidate                  do not validate ivy files against xsd
 -m2compatible                use maven2 compatibility

==== resolve options
 -ivy <ivyfile>               use given file as ivy file
 -dependency <organisation> <module> <revision>
                              use this instead of ivy file to do the rest of the
                               work with this as a dependency.
 -confs <configurations>      resolve given configurations

==== retrieve options
 -retrieve <retrievepattern>  use given pattern as retrieve pattern
 -sync                        use sync mode for retrieve

==== cache path options
 -cachepath <cachepathfile>   outputs a classpath consisting of all dependencies
                               in cache (including transitive ones) of the given
                               ivy file to the given cachepathfile

==== deliver options
 -deliverto <ivypattern>      use given pattern as resolved ivy file pattern

==== publish options
 -publish <resolvername>      use given resolver to publish to
 -publishpattern <artpattern> use given pattern to find artifacts to publish
 -revision <revision>         use given revision to publish the module
 -status <status>             use given status to publish the module

==== http auth options
 -realm <realm>               use given realm for HTTP AUTH
 -host <host>                 use given host for HTTP AUTH
 -username <username>         use given username for HTTP AUTH
 -passwd <passwd>             use given password for HTTP AUTH

==== launcher options
 -main <main>                 the FQCN of the main class to launch
 -args <args>                 the arguments to give to the launched process
 -cp <cp>                     extra classpath to use when launching process

==== message options
 -debug                       set message level to debug
 -verbose                     set message level to verbose
 -warn                        set message level to warn
 -error                       set message level to error

==== help options
 -?                           display this help
 -deprecated                  show deprecated options
</code> 

<span class="since">since 1.3</span> System properties are included as ivy variables, so you can easily define an ivy variable like this:
<code>
java -Dmyivyvar=myvalue org.apache.ivy.Main [parameters]
</code>


<h1>Examples</h1>
<code>
java -jar ivy.jar
</code>
calls ivy with default configuration using ivy.xml in the current dir
<hr/>
<code>
java -jar ivy.jar -settings path/to/myivysettings.xml -ivy path/to/myivy.xml
</code>
calls ivy with given ivysettings file using given ivy file
<hr/>
<span class="since">since 1.3</span>
<code>
java -jar ivy.jar -settings path/to/myivysettings.xml -dependency apache commons-lang 2.0
</code>
calls ivy with given ivysettings file and resolve apache commons-lang 2.0. 

This is equivalent to:
<code>
java -jar ivy.jar -settings path/to/myivysettings.xml -ivy ivy.xml
</code>
with ivy.xml like this:
<code type="xml">
<ivy-module version="1.0">
  <info organisation="org"
       module="standalone"
       revision="working"
   />
  <dependencies>
    <dependency org="apache" name="commons-lang" rev="2.0" conf="default->*"/>
  </dependencies>
</ivy-module>
</code>
<hr/>
<span class="since">since 1.3</span>
<code>
java -jar ivy.jar -settings path/to/myivysettings.xml -ivy path/to/myivy.xml -cachepath mycachefile.txt
</code>
calls ivy with given ivysettings file and resolve the dependencies found in the given ivy file, and then output the classpath of resolved artifacts in cache in a file. This file can then be used to define a classpath corresponding to all the resolved dependencies for any java program. 

<hr/>
<span class="since">since 1.4</span>
<code>
java -jar ivy.jar -settings path/to/myivysettings.xml -dependency bar foo 2.0 -main org.bar.foo.FooMain
</code>
calls ivy with given ivysettings file and resolve bar foo 2.0, and then run org.foo.FooMain class with the resolved artifacts as classpath


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