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
...