Ho visto alcuni strumenti di costruzione nella mia carriera, e hanno tutti avuto i loro capricci. Sto solo ora esaminando Maven e ho scoperto l'idea di "esclusioni di dipendenza" per la prima volta. Onestamente non capisco quale problema legittimo questo meccanismo sta cercando di risolvere.
Prendiamo il POM di Apache Pig, ad esempio:
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>org.apache.pig</groupId>
<artifactId>pig</artifactId>
<packaging>jar</packaging>
<version>0.16.0.2.5.0.0-1245</version>
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.7.4</version>
<exclusions>
<exclusion>
<!-- Don't pull in Avro's (later) version of Jetty. -->
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
</exclusion>
<exclusion>
<!--
Exclude Avro's version of ant since it conflicts with Jetty's.
-->
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- ... -->
</dependencies>
<!-- ... -->
</project>
Questo particolare progetto dipende dal avro
artefatto dal gruppo org.apache.avro
, ma rimuove due dipendenze da quella dipendenza (vale a dire jetty
e ant
) perché "in conflitto". Apparentemente, è perfettamente corretto rimuovere queste dipendenze da avro
, come faranno quelle incluse da avro
.
Per me, questo sembra chiedere dei guai, e penserei che qualsiasi altra risoluzione dei conflitti di dipendenza sarebbe preferibile a questo.
Interagendo con le dipendenze di una dipendenza, il progetto Pig sta effettivamente rattoppando il progetto Avro, e in modo abbastanza cieco, poiché il vincolo della versione su Avro non identifica strettamente una versione del progetto.
Non avrebbe più senso rifiutare del tutto la build o costruire in due versioni separate di ant
e jetty
nel progetto (supponendo che possano essere mantenute segregate nel sistema di caricamento classi di Java)?