I embed Ivy into IFCX Wings, but I do it via the Ant tasks. That will provide the best compatibility going forward as they will change less than the Java API.

http://www.ifcx.org/wiki/Wings.html

The code is in Groovy and looks like this:

http://ifcx.svn.sourceforge.net/viewvc/ifcx/Wings/trunk/OpenOffice/WingsEval.groovy?revision=151&view=markup#l_2383

def ivy_resolve(WingsEngineSettings engineSettings, def ivy_file, URLClassLoader classLoader)
{
    final WingsContext context = engineSettings.context

final AntBuilder ant = new AntBuilder(createAntProject(context), new Target())

def ant_ivy = groovy.xml.NamespaceBuilder.newInstance(ant, 'antlib:org.apache.ivy.ant')
    ant.property(name:'ivy.dep.file', location:ivy_file)
    ant_ivy.resolve()
    ant_ivy.cachefileset(setid:'cache-files-id')
    ant.path { fileset(refid:'cache-files-id') }

final List jars = ant.path { fileset(refid:'cache-files-id') }.collect { it.file.toURI().toURL() }

if (null == classLoader) classLoader = engineSettings.context.contextClassLoader

    // Only add JARs that aren't already in the list.
    // TODO: Do duplicate/conflict resolution stuff through Ivy.
(jars - (classLoader.getURLs() as List)).each { URL jar -> classLoader.addURL(jar) }

    return jars
}


I realize that isn't much use to folks who aren't using Groovy, and having your Java example is very helpful. But using Ant from Java is really pretty simple. A bit a code I wrote to demonstrate that a while ago is:

import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.taskdefs.Echo;
import org.apache.tools.ant.taskdefs.ExecTask;

import java.io.File;

public class java2ant
{
   public static void main(final String[] args)
   {
      final Project project = new Project();

      project.init();

      final Echo echo = (Echo) project.createTask("echo");

      echo.setMessage("Hello World");
      echo.setFile(new File("output.txt"));
      echo.execute();

      final ExecTask exec = (ExecTask) project.createTask("exec");

      exec.setExecutable("ls");
      exec.setOutput(new File("execoutput.txt"));
      exec.execute();
   }
}

That's available here:

http://pagesmiths.com/ant/

An article on the topic:

http://www.ibm.com/developerworks/websphere/library/techarticles/0502_gawor/0502_gawor.html

I don't have an example of how to call an Antlib task from Java though. Perhaps this article might help (although a quick scan didn't show anything directly applicable):

http://www.onjava.com/pub/a/onjava/2006/08/09/ant-1-7-using-antlibs.html?page=2

Jim

Ilya Sterin wrote:

Ok, so I think I figured it out, but still not sure if anything is out
of the ordinary.  I took bits and pieces of this from the ivy
Main.main method...

Ivy ivy = Ivy.newInstance();
        ivy.configureDefault();

        File ivyfile = File.createTempFile("ivy", ".xml");
        ivyfile.deleteOnExit();
        String[] dep = new String[]{"commons-lang", "commons-lang", "1.0"};
        DefaultModuleDescriptor md = DefaultModuleDescriptor
                .newDefaultInstance(ModuleRevisionId.newInstance(dep[0],
                        dep[1] + "-caller", "working"));
        DefaultDependencyDescriptor dd = new DefaultDependencyDescriptor(md,
                ModuleRevisionId.newInstance(dep[0], dep[1], dep[2]),
false, false, true);
        md.addDependency(dd);
        XmlModuleDescriptorWriter.write(md, ivyfile);

        String[] confs = new String[]{"default"};
        ResolveOptions resolveOptions = new ResolveOptions().setConfs(confs);
        ResolveReport report = ivy.resolve(ivyfile.toURL(), resolveOptions);

It would be nice for someone to document this.  I can imagine many
systems wanting to use ivy's resolution mechanism outside of the ant
process.

Ilya
...

Reply via email to