using IVY dependencies manager programmatically
dependencies, ivy, jar, java
Solution
Ivy can be used as a standalone java program:
java -jar ivy.jar -retrieve "lib/[conf]/[artifact].[ext]"
The retrieve pattern can be then used to determine where files are installed, based on the ivy configuration settings
$ find lib -type f
lib/core/commons-lang.jar
lib/plugin1/commons-logging.jar
lib/plugin1/commons-codec.jar
lib/plugin2/commons-logging.jar
lib/plugin2/commons-cli.jar
lib/plugin3/commons-logging.jar
Configurations are used as a collective label or grouping of dependencies. They are similar to Maven scopes but much more flexible:
<ivy-module version="2.0">
<info organisation="com.myspotontheweb" module="demo"/>
<configurations>
<conf name="core" description="Core application dependencies"/>
<conf name="plugin1" description="Plugin 1 dependencies"/>
<conf name="plugin2" description="Plugin 2 dependencies"/>
<conf name="plugin3" description="Plugin 3 dependencies"/>
</configurations>
<dependencies>
<dependency org="commons-lang" name="commons-lang" rev="2.5" conf="core->default"/>
<dependency org="commons-codec" name="commons-codec" rev="1.4" conf="plugin1->default"/>
<dependency org="commons-cli" name="commons-cli" rev="1.2" conf="plugin2->default"/>
<dependency org="commons-logging" name="commons-logging" rev="1.1.1" conf="plugin1,plugin2,plugin3->default"/>
</dependencies>
</ivy-module>
If you only want to download and install one set of jars, into a specified directory you can use the confs parameter:
java -jar ivy.jar -retrieve "plugin1/[artifact].[ext]" -confs plugin1
Finally, if you still want to use a programming API, you could invoke the run method called by the main class
http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/Main.java?view=markup
Update 1
Groovy has built in support for invoking ivy tasks
import groovy.xml.NamespaceBuilder
def ant = new AntBuilder()
def ivy = NamespaceBuilder.newInstance(ant, 'antlib:org.apache.ivy.ant')
ivy.settings(file:"ivysettings.xml")
ivy.retrieve(pattern:"lib/[conf]/[artifact].[ext]")
ivy.report(toDir:'reports', graph:false)
Update 2
To set the location of your local Maven repository you need to use an ivysettings.xml file.
<ivysettings>
<settings defaultResolver='nexus' />
<resolvers>
<ibiblio name='nexus' root='http://myhost.mydomanin.com:8081/nexus' m2compatible='true' />
</resolvers>
</ivysettings>
Update 3
Just found an article that details how to invoke Ivy from Java
Problem
i need help using IVY as dependencies manager my application need to load plug-ins at RUN-TIME means while the core application is running ,user can request for a new plug-in and install them , i wish to manage all installed plug-ins using the core application DB. i want to get a pom from my plug-ins server (or some other descriptor), and ask IVY to tell me what are the dependencies OR let IVY install the plug-in and dependencies , based on the current state of my application. ( what do i have right now , 1.jar's used by core application 2.jar's used by current installed plug-ins) i wish for each plug-in to have independent directory under some folder where my application is located (not a shared one) the thing is i don't know where to start i notice that there is no programming API for that i located one link over the network of someone who try something similar but look likes the code is not completed , or some variable are missing and i dont know how to complete the rest cause lake of programming documentation http://www.mail-archive.com/ivy-user@ant.apache.org/msg03228.html (where the variable "art" came for.....) can you help me please ... Thank you all UPDATE ok this what i am trying now . i am getting some a error plus i dont know how to define my archiva server ``` IvySettings settings = new IvySettings(); settings.setDefaultIvyUserDir(new File("D:/programming/eclipse_projects/ivyTest/repo/")); settings.setDefaultCache(new File("D:/programming/eclipse_projects/ivyTest/repo/cache/")); settings.setDefaultCacheArtifactPattern("[module]/[revision]/[module]-[revision](-[classifier]"); Ivy ivy = Ivy.newInstance(settings); ivy.getLoggerEngine().pushLogger(new DefaultMessageLogger(Message.MSG_VERBOSE)); ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(new IvySettings(), new File("src/movies.pom").toURL(), true); RetrieveOptions retriveOptions = new RetrieveOptions(); retriveOptions.setUseOrigin(true); retriveOptions.setConfs(md.getConfigurationsNames()); ivy.retrieve(md.getModuleRevisionId(), "lib/[conf]/[artifact].[ext]", etriveOptions); ``` this is the error i get ``` :: loading settings :: url = jar:file:/D:/programming/eclipse_projects/ivyTest/ivy-2.2.0.jar!/org/apache/ivy/core/settings/ivysettings.xml :: retrieving :: org.jtpc#movies checkUpToDate=true confs: [default, master, compile, provided, runtime, test, system, sources, javadoc, optional] java.lang.RuntimeException: problem during retrieve of org.jtpc#movies: java.lang.IllegalStateException: Report file 'D:\programming\eclipse_projects\ivyTest\repo\cache\org.jtpc-movies-default.xml' does not exist. at org.apache.ivy.core.retrieve.RetrieveEngine.retrieve(RetrieveEngine.java:206) at org.apache.ivy.Ivy.retrieve(Ivy.java:540) at Test.main(Test.java:52) Caused by: java.lang.IllegalStateException: Report file 'D:\programming\eclipse_projects\ivyTest\repo\cache\org.jtpc-movies-default.xml' does not exist. at org.apache.ivy.plugins.report.XmlReportParser.parse(XmlReportParser.java:294) at org.apache.ivy.core.retrieve.RetrieveEngine.determineArtifactsToCopy(RetrieveEngine.java:288) at org.apache.ivy.core.retrieve.RetrieveEngine.retrieve(RetrieveEngine.java:104) ... 2 more ```