2013-03-24 9 views
6

Trovo che l'API di Ivy sia estremamente complicata.Il più semplice codice Ivy per recuperare la dipendenza da Maven Central a livello di programmazione

Qual è lo snippet più semplice possibile per recuperare un artefatto da Maven Central in una directory locale specifica utilizzando Ivy al 100% a livello di programmazione (niente Ant, nessun file Xml, ...)?

Per fare un esempio, riprendere la registrazione delle risorse comuni: registrazione delle comunicazioni comuni: 1.1: jar in/my/destination.

+0

Perché Ivy un requisito? Sono accettabili altre librerie/snippet di codice? – kdgregory

+0

Certo, se si dispone di una soluzione alternativa che memorizza nella cache localmente e garantisce che i download non vengano danneggiati, va bene anche questo. –

+0

Originariamente raccomandavo [Aether] (http://www.sonatype.org/aether), ma poi ho guardato i loro [esempi] (http://git.eclipse.org/c/aether/aether- demo.git/tree /) e [API] (http://download.eclipse.org/aether/aether-core/0.9.0.M2/apidocs/), e capito perché le persone prendono in giro i programmatori Java. – kdgregory

risposta

5

Il modo più semplice per recuperare un manufatto (ed è dipendenze) è quello di use ivy from the command-line

java -jar ivy.jar -dependency commons-logging commons-logging 1.1 -retrieve "/my/destination/[artifact](-[classifier]).[ext]" 

Questo sarà recuperare i file nella directory "/ my/destinazione".

Altri esempi:

+0

Questo sta estendendo "il 100% a livello di programmazione" un po ', in quanto evita del tutto l'API. –

+0

@AxelFontaine Ottiene il lavoro finito :-) Se segui il primo elenco di esempio, ho un esempio groovy che chiama le attività dell'edera. Personalmente non ho mai avuto bisogno di usare l'API Java di ivy. Come ha affermato David, in ogni caso è scarsamente documentato. –

7

Ho lavorato sull'uso edera risolvere remoto artefatti (e) da dipendenze repository Maven. Ecco un esempio di codice che scarica un artefatto (senza dipendenze).

Se sono necessarie delle dipendenze, è necessario adattare il descrittore di dipendenza.

Qualche nota:

  1. Ivy utilizza una cache per memorizzare i manufatti recuperati in precedenza e le loro "traduzioni edera" (troverete i moduli di edera derivati ​​da artefatti Maven nella cache)

  2. Il generale il concetto è che si crea un modulo Ivy che ha dipendenze sul repository Maven memorizzato "pseudo-moduli" (cioè c'è una mappatura sotto il cappuccio implementata dal resolver - credo).

  3. In generale, un buon punto di partenza, se si desidera sapere come utilizzare a livello di programmazione Ivy, è la classe principale org.apache.ivy.Main.


     public static void main(String[] args) throws Exception { 

     String groupId = "org.springframework"; 
     String artifactId = "spring-context-support"; 
     String version = "4.0.2.RELEASE"; 
     File out = new File("out"); 

     // create an ivy instance 
     IvySettings ivySettings = new IvySettings(); 
     ivySettings.setDefaultCache(new File("ivy/cache")); 

     // use the biblio resolver, if you consider resolving 
     // POM declared dependencies 
     IBiblioResolver br = new IBiblioResolver(); 
     br.setM2compatible(true); 
     br.setUsepoms(true); 
     br.setName("central"); 

     ivySettings.addResolver(br); 
     ivySettings.setDefaultResolver(br.getName()); 

     Ivy ivy = Ivy.newInstance(ivySettings); 

     // Step 1: you always need to resolve before you can retrieve 
     // 
     ResolveOptions ro = new ResolveOptions(); 
     // this seems to have no impact, if you resolve by module descriptor (in contrast to resolve by ModuleRevisionId) 
     ro.setTransitive(true); 
     // if set to false, nothing will be downloaded 
     ro.setDownload(true); 

     // 1st create an ivy module (this always(!) has a "default" configuration already) 
     DefaultModuleDescriptor md = DefaultModuleDescriptor.newDefaultInstance(
      // give it some related name (so it can be cached) 
      ModuleRevisionId.newInstance(
       groupId, 
       artifactId+"-envelope", 
       version 
      ) 
     ); 

     // 2. add dependencies for what we are really looking for 
     ModuleRevisionId ri = ModuleRevisionId.newInstance(
      groupId, 
      artifactId, 
      version 
     ); 
     // don't go transitive here, if you want the single artifact 
     DefaultDependencyDescriptor dd = new DefaultDependencyDescriptor(md, ri, false, false, false); 

     // map to master to just get the code jar. See generated ivy module xmls from maven repo 
     // on how configurations are mapped into ivy. Or check 
     // e.g. http://lightguard-jp.blogspot.de/2009/04/ivy-configurations-when-pulling-from.html 
     dd.addDependencyConfiguration("default", "master"); 
     md.addDependency(dd); 

     // now resolve 
     ResolveReport rr = ivy.resolve(md,ro); 
     if (rr.hasError()) { 
      throw new RuntimeException(rr.getAllProblemMessages().toString()); 
     } 

     // Step 2: retrieve 
     ModuleDescriptor m = rr.getModuleDescriptor(); 

     ivy.retrieve(
      m.getModuleRevisionId(), 
      out.getAbsolutePath()+"/[artifact](-[classifier]).[ext]", 
      new RetrieveOptions() 
       // this is from the envelop module 
       .setConfs(new String[]{"default"}) 
     ); 
    } 

+0

Come potremmo averlo anche per scaricare i sorgenti per il gruppo/artefatto/versione? – ticktock

+0

'' Transitive' di 'ResolveOptions' e' downloads' hanno valori di default 'true', quindi non è necessario chiamare i loro setter. – lyomi

+0

come aggiungerei le credenziali alle impostazioni di edera? –

Problemi correlati