Aggiungere Repository Personalizzati per Soddisfare Dipendenze

From Servizi RSI
Jump to: navigation, search

Se, a questo punto hai configurato il settings.xml Maven onde sfruttare Nexus come un mirror per tutti i repository, puo' accadere che alcuni progetti non siano in grado di recuperare gli artefatti dall' installazione locale Nexus.

Questo di solito accade perché si sta cercando di costruire un progetto che ha definito un insieme personalizzato di release e snapshot nel pom.xml.

Come esempio, proviamo a compilare Apache Shindig dai sorgenti di cui abbiamo fatto il ChekOut da Apache Incubator.

Che cosa è Shindig Apache? Diciamo che Shindig mira a fornire un contenitore che permette di eseguire gadget OpenSocial. Shindig dipende da alcuni repository Maven personalizzati per i componenti che devono ancora essere aggiunti al repository centrale Maven. Usando Shindig come esempio si puo' vedere cosa succede quando Nexus non ha ancora gli artefatti e quali passi si possono adottare per aggiungere i repository a Nexus.

Il seguente esempio presuppone che si sia installato Subversion e che si possa eseguire Subversion da riga di comando. Facciamo il CheckOut di Apache Shindig da Apache Incubator con Subversion e compiliamo.

Per fare questo, eseguire i seguenti comandi:

   svn co http://svn.apache.org/repos/asf/shindig/trunk/ shindig
   ... Subversion will checkout the trunk of Apache Shindig ...
   cd shindig
   mvn install
   ... Maven will build Shindig ...
   Downloading: http://buildandtest.si.cnr.it:8081/nexus/content/groups/\
   public/caja/caja/r2178/caja-r2178.jar
   ...
   [INFO] ------------------------------------------------------------------------
   [ERROR] BUILD ERROR
   [INFO] ------------------------------------------------------------------------
   [INFO] Failed to resolve artifact.
   Missing:
   ----------
   1) caja:caja:jar:r2178
   Try downloading the file manually from the project website.
   ...
   ----------
   3 required artifacts are missing.
   for artifact: 
   org.apache.shindig:shindig-gadgets:jar:1-SNAPSHOT
   from the specified remote repositories:
   nexus (http://buildandtest.si.cnr.it:8081/nexus/content/groups/public)


La compilazione non riesce perché non è in grado di scaricare due artefatti.

Uno dei manufatti che Maven cerca di scaricare ha un identificatore Caja e artifactId di Caja, e una versione di r2178. Si tratta di un artefatto che è ospitato su un repository

 http://google-caja.googlecode.com/svn/maven 

personalizzato.

Per Maven quindi è impossibile scaricare questo artefatto perché il settings.xml è stato configurato per cercare i mirror per i gruppi pubblici e snapshot sul server locale Nexus.

Quindi anche se il pom.xml per Apache Shindig definisce un repository e punta ad un URL corretto

http://google-caja.googlecode.com/svn/maven, 

Nexus non è in grado di recuperare un artefatto da un repository che non conosce. Ricordiamo che abbiamo configurato Maven affinchè tutte le richieste di manufatti passino attraverso Nexus.

In effetti, ci sono due repository che Nexus non conosce in questa build: Caja e OAuth. Caja e OAuth sono due librerie che sono ancora in sviluppo. Entrambi i progetti sono "released", e le dipendenze su cui Shindig si basa non sono certamente SNAPSHOT release, ma questi progetti non sono stati pubblicati nel Maven Central Repository. Dobbiamo trovare un modo per far conoscere a Nexus questi repository, prima di poter compilare questo progetto.


Ci sono due modi per risolvere questo problema.

  • In primo luogo, è possibile modificare il settings.xml per sostituire gli identificatori di specifici repository. Invece di elencare il gruppo pubblico Nexus come mirrorOf di tutti i repository, è possibile modificare l'elemento mirrorOf nel settings.xml a "centrale". In questo modo Maven tenta di scaricare le dipendenze direttamente dal repository OAuth e Caja. Questo funziona perché Maven consulta Nexus solo per i repository che corrispondono ai repository specificati nell'elemento mirrorOf in settings.xml. Se Maven vede l'identificatore Caja o OAuth, e non vede un repository configurato in settings.xml, tenterà di connettersi ai repository direttamente.
  • In secondo luogo, l'opzione più interessante è quella di aggiungere questi due repository di Nexus e poi aggiungere questi repository al gruppo pubblico.


Aggiungere Nuovi Repository