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.

Questo è sicuramente succederà se si aggiungono repository personalizzati di terze parti Maven per la configurazione.

Come esempio, proponiamo di 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 permetterà alle persone di eseguire gadget OpenSocial. Essa ci offre un esempio di progetto interessante, perché 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 di Nexus.

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

Per fare questo, eseguire i seguenti comandi:

   svn co http://svn.apache.org/repos/asf/incubator/shindig/trunk shindig
   ... Subversion will checkout the trunk of Apache Shindig ...
   cd shindig
   mvn install
   ... Maven will build Shindig ...
   Downloading: http://localhost: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://localhost:8081/nexus/content/groups/public)


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

Uno dei manufatti che Maven cerca di scaricare ha un identificatore del gruppo di 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 puntare tutti i mirror per i gruppi pubblici e pubblico-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 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 costruire questo progetto.


Ci sono due modi per risolvere questo problema.

  • In primo luogo, è possibile modificare le settings.xml per sostituire gli identificatori di specifici repository. Invece di elencare il gruppo pubblico Nexus come mirrorOf 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 specificato 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.