November 08, 2010

Embed Ivy - How to use Ivy with Java

« Groovy Webservice - Webservice Producer and Consumer Example | Main | Documenting Design Patterns with Annotations »

This article from Peter Grund describes how to use Maven directly in Java. Recently I looked for an analog way to resolute and download Maven repository artifacts. But I wanted to use Ivy. The following example shows how to embed and use Ivy directy in Java.

1. Add Ivy dependenvy to pom.xml:


    org.apache.ivy
    ivy
    2.2.0

2. Java code to resolve and download artifacts:
public class IvyArtifactResolver {
    public File resolveArtifact(String groupId, String artifactId, String version) throws Exception {
        //creates clear ivy settings
        IvySettings ivySettings = new IvySettings();
        //url resolver for configuration of maven repo
        URLResolver resolver = new URLResolver();
        resolver.setM2compatible(true);
        resolver.setName("central");
        //you can specify the url resolution pattern strategy
        resolver.addArtifactPattern(
                "http://repo1.maven.org/maven2/"
                + "[organisation]/[module]/[revision]/[artifact](-[revision]).[ext]");
        //adding maven repo resolver
        ivySettings.addResolver(resolver);
        //set to the default resolver
        ivySettings.setDefaultResolver(resolver.getName());
        //creates an Ivy instance with settings
        Ivy ivy = Ivy.newInstance(ivySettings);

        File ivyfile = File.createTempFile("ivy", ".xml");
        ivyfile.deleteOnExit();

        String[] dep = null;
        dep = new String[]{groupId, artifactId, version};
        
        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);
        
        //creates an ivy configuration file
        XmlModuleDescriptorWriter.write(md, ivyfile);

        String[] confs = new String[]{"default"};
        ResolveOptions resolveOptions = new ResolveOptions().setConfs(confs);
        
        //init resolve report
        ResolveReport report = ivy.resolve(ivyfile.toURL(), resolveOptions);
        
        //so you can get the jar library
        File jarArtifactFile = report.getAllArtifactsReports()[0].getLocalFile();

        return jarArtifactFile;
    }

Regards
Rafael Sobek

Technorati Tags:

Posted by rafael.sobek at 7:41 AM in Java

 

[Trackback URL for this entry]

Comment: Evgeny Goldin at Di, 7 Feb 4:19 PM

Thanks, Rafael, it helped me in my project. I saw the code is mostly taken from Ivy command-line main() - I'm surprised one needs to write temp "ivy.xml" to disk and read it back rather than use an API, but it's a minor drawback which I can live with

Reposted it at makandracards: http://goo.gl/fPb1t.

Your comment:

(not displayed)
 
 
 

Live Comment Preview: