<!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 5+ 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>
