2012-05-10 17 views
11

Sto cercando un'API Java che possa essere utilizzata per recuperare le risorse Maven da un repository remoto. Ho trovato Eclipse Ather finora ma sembra complicato per le mie esigenze, quindi cerco qualcosa di più semplice.Recupero di artefatti Maven a livello di programmazione

cosa ho bisogno è:

  • devo specificare la posizione del repository remoto Maven
  • mi piace per andare a prendere un artefatto basato su di esso è groupId + artifactId + versione
  • L'API deve fornire la versione remota corrente del manufatto (pensare a artefatti SNAPSHOT che sono costruiti regolarmente in modo che abbiano una parte generata nelle loro versioni)
  • Restituire il percorso del manufatto, un URL HTTP è preferito (lo prendo per il mio proprio con ad esempio Apache HTTP Client)
  • Eventualmente recuperare i manufatti che sono i dipendenti di quello richiesto.
+0

Suona come si tenta di reinventare la ruota con la libreria Etere. quindi vorrei dare un'occhiata approfondita alla libreria di etere e potrei chiedere sulla loro mailing list per vedere se esiste una possibilità di utilizzare un diverso risolutore di artefatti (scaricando in seguito ecc.). Dubito ma provalo. – khmarbaise

+0

Farò un tentativo. – NagyI

+2

Alcune opzioni dell'edera elencate qui: http://stackoverflow.com/questions/3955209/using-ivy-dependencies-manager-programmatically/3963721#3963721 –

risposta

9

jcabi-aether potrebbe aiutarti (sono uno sviluppatore). E 'un semplice wrapper per Aether, che permette di trovare tutte le dipendenze transitive di un manufatto Maven:

File repo = this.session.getLocalRepository().getBasedir(); 
Collection<Artifact> deps = new Aether(this.getProject(), repo).resolve(
    new DefaultArtifact("junit", "junit-dep", "", "jar", "4.10"), 
    JavaScopes.RUNTIME 
); 

Quindi, tutto ciò che serve per fornire come input è:

  • locale posizione di pronti contro termine, come nome della directory
  • lista dei repository repote (MavenProject#getRemoteRepositories())
  • coordinate Maven del manufatto
  • Maven scopo di cercare
  • 0.123.

Percorsi assoluti di ogni dipendenza trovato possono essere ottenuti come Artifact#getPath()

+0

Accetto questo perché sembra la cosa più vicina alle mie esigenze e sembra facile da usare. – NagyI

+0

Grazie per il tuo grande progetto. Trovo utile testare i plug-in Maven (prendendo in giro il comportamento di recuperare gli artefatti). –

+0

Sentiti libero di vederlo su Github: https://github.com/jcabi/jcabi-aether/stargazers :) – yegor256

0

Aether jest in realtà molto semplice ed elegante modo di farlo. È uno dei principali miglioramenti di Maven 3 e molti lo stavano cercando. Guarda this per un po 'di codice iniziale con cui lavorare. Non ricordo un metodo per ottenere l'URL esatto del manufatto, ma altri requisiti sono supportati da AFAIR.

+0

Uno dei problemi che non mi piace usare l'etere è che devo creare un repository temporaneo solo per il recupero di un artefatto in esso. Non voglio che l'etere scarichi il file. Voglio solo sapere qual è l'ultima versione del manufatto e dove si trova sulla rete. Immagina di avere uno zip di distribuzione dell'applicazione che non ha artefatti dipendenti quindi è solo da solo.Posso recuperarlo facilmente da solo o anche meglio decomprimerlo al volo mentre lo scarico. – NagyI

+0

@Michal Kalinowski, l'esempio che viene mostrato mostra come usare l'etere in un plugin di Maven. Conosci qualche documento che mostra come usarlo in un normale programma Java (non plug-in)? – user944849

0

Hai provato a utilizzare Apache Ivy? Supporta il recupero delle dipendenze Maven.

La documentazione per questo caso d'uso è un po 'scarsa, ma ho trovato alcune informazioni sull'uso programmatico di Ivy here.

+0

Questo non è assolutamente programmatico. Ha bisogno di file XML predefiniti che definiscono le dipendenze e altre configurazioni. Cosa succede se questi sono determinati dinamicamente durante l'esecuzione (recuperati da una fonte esterna)? Non mi piace avere file temporanei dappertutto. – NagyI

+0

Penso che potresti aver bisogno di quei file per determinare la posizione del repository remoto, ma spero che non sia necessario usare i file di configurazione per recuperare dipendenze specifiche. Gradle e SBT usano edera per recuperare le dipendenze, e penso che lo facciano senza i file di configurazione xml. –

+0

Capisco. Allora scaverò più a fondo in Ivy. Grazie! – NagyI

1
public List<Artifact> findDependencies(Artifact artifact) throws DependencyCollectionException { 

    CollectRequest collectRequest = new CollectRequest(); 
    collectRequest.setRoot(new Dependency(artifact, "")); 
    collectRequest.addRepository(repository); 

    final MavenServiceLocator locator = new MavenServiceLocator(); 
    locator.addService(RepositoryConnectorFactory.class, FileRepositoryConnectorFactory.class); 
    locator.addService(RepositoryConnectorFactory.class, WagonRepositoryConnectorFactory.class); 
    locator.setServices(WagonProvider.class, new WagonProvider() { 
     public Wagon lookup(String roleHint) throws Exception { 
      if (Arrays.asList("http", "https").contains(roleHint)) { 
       return new LightweightHttpWagon(); 
      } 
      return null; 
     } 

     public void release(Wagon wagon) { 

     } 
    }); 

    final RepositorySystem system = locator.getService(RepositorySystem.class); 
    MavenRepositorySystemSession session = new MavenRepositorySystemSession(); 

    session.setLocalRepositoryManager(system.newLocalRepositoryManager(localRepository)); 
    session.setTransferListener(new LoggingTransferListener()); 
    session.setRepositoryListener(new LoggingRepositoryListener()); 

    final List<Artifact> artifacts = new ArrayList<Artifact>(); 

    system.collectDependencies(session, collectRequest).getRoot().accept(new DependencyVisitor() { 
     public boolean visitEnter(DependencyNode dependencyNode) { 
      artifacts.add(dependencyNode.getDependency().getArtifact()); 
      return true; 
     } 

     public boolean visitLeave(DependencyNode dependencyNode) { 
      return true; 
     } 
    }); 
    return artifacts; 
} 
+0

Puoi suggerire come farlo funzionare con i nuovi Maven ed Eclipse Aether? – wilx

Problemi correlati