Correggetemi se ho torto, ma un Mirror viene utilizzato per reindirizzare tutto il traffico verso un URL specifico del repository e bloccare tutto il resto (incluso il repository centrale di Maven).
Questo non è del tutto corretto. Gli artefatti vengono scaricati da Maven cercandoli all'interno definito repositories. Questi repository sono definiti nel POM del progetto o nelle impostazioni Maven. Ma, come specificato nello Mirror documentation:
Tuttavia, è possibile utilizzare un mirror alternativo per un determinato repository senza modificare i file di progetto.
Prendiamo l'esempio dalla documentazione e commentarlo:
<mirrors>
<mirror>
<id>UK</id>
<name>UK Central</name>
<url>http://uk.maven.org/maven2</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
Questo definisce un unico specchio che sarà utilizzato durante Maven vorrà prendere una dipendenza da Maven centrale. Diciamo che avete 2 depositi attuali, che sono Maven centrale e un repo personalizzato A. Quello che succede è il seguente:
- si dichiara una dipendenza ad un artefatto;
- Maven cercherà quella dipendenza all'interno dei repository definiti, quindi cercherà all'interno del repository A e Maven Central;
- Diciamo che inizia con A: colpirà l'URL definito per quel repository, come ci si aspetterebbe. Quindi diciamo che non è stato trovato lì;
- Quindi guarderà all'interno di Maven Central. Tuttavia, Maven noterà che un mirror è stato configurato per quel repository. Non colpirà Maven Central al numero
repo1.maven.org
. Invece, lo prenderà da uk.maven.org
, che è l'URL definito nell'elemento di configurazione del mirror.
Come illustrato in questo esempio, un mirror si applica solo a determinati archivi, definiti con l'elemento di configurazione <mirrorOf>
. Nel caso precedente, avevamo <mirrorOf>central</mirrorOf>
che significa "Mirror Maven Central". Questo elemento can have various values, e la documentazione gives examples:
Esempi:
*
= tutto
external:*
= tutto non sul localhost e non file basato.
repo,repo1
= repo o repo1
*,!repo1
= tutto, tranne repo1:
Ora che cosa se ho uno specchio per http://a.com:8081
e un repository per http://b.com:8081
. Il secondo URL sarebbe mai stato utilizzato? Presumo che la risposta sia un n.
Quanto sopra indica che la risposta non è strettamente n. Il mirror su http://a.com:8081
verrà utilizzato quando Maven tenterà di recuperare una dipendenza da uno dei repository che esegue il mirroring. Se in effetti rispecchia il repository su http://b.com:8081
, non verranno mai inviate richieste a http://b.com:8081
(verranno reindirizzate a http://a.com:8081
); ma se così non fosse, Maven continuerà a recuperare le dipendenze dallo http://b.com:8081
come al solito.
Potete avere più specchi?
Sì, è possibile.