ant-ivy-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Ilya Sterin" <ster...@gmail.com>
Subject Re: Embedded ivy
Date Tue, 23 Sep 2008 02:54:05 GMT
Also, there are numerous deps.  Like, adding dynamic dependencies to
the resolution without building an actual xml file to represent that
structure seems impossible.  It would be nice if Ivy had a more
intuitive external API and could be used as an embedded dependency
resolution library.  More build products would incorporate it, instead
of trying to build this complex mechanism themselves.  For now, I
think the code snipper I provided works fine for our case.  I'll fine
tune it, etc..., but it does the work.  I hope that API is stable
enough between releases though.

Ilya

On Mon, Sep 22, 2008 at 10:52 PM, Ilya Sterin <sterini@gmail.com> wrote:
> Thanks Jim.  Yes, using ant from java is very simple.  Also, thanks
> for the resources, I'll take a look at them shortly.
>
> One issue with ivy, is that it's not a matter of instantiating an ant
> taks and executing it, it's way more involved.  You can see that from
> the code snippet I posted which was extracted from the ivy bootstrap
> code in their external runner.
>
> Ilya
>
> On Mon, Sep 22, 2008 at 1:46 AM, Jim White <jim@pagesmiths.com> wrote:
>> 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
>>> ...
>>
>>
>

Mime
View raw message