Solución:
En Maven no puede desactivar las dependencias transitivas para todas las dependencias declaradas de una sola manera, como lo indica la documentación oficial
Por qué las exclusiones se realizan por dependencia, en lugar de a nivel de POM
Esto se hace principalmente para asegurarse de que el gráfico de dependencia sea predecible y para evitar que los efectos de la herencia excluyan una dependencia que no debería excluirse. Si llega al método de último recurso y tiene que incluir una exclusión, debe estar absolutamente seguro de cuál de sus dependencias está generando esa dependencia transitiva no deseada.
De hecho, dado que Maven 3.2.1 puede especificar comodines para excluir todas las dependencias transitivas para una dependencia específica, pero eso sigue siendo por dependencia y no global.
Lo que realmente le gustaría tener algo como lo siguiente por cada dependencia en todos y cada uno de los pom (!!):
<dependency>
<groupId>groupId</groupId>
<artifactId>artifactId</artifactId>
<version>version</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
Aunque esto no es aconsejable ya que puede afectar fácilmente (y negativamente) la mantenibilidad de los proyectos en cuestión, una posible solución sería tener un POM principal común para todos los proyectos en cuestión, de modo que cada pom declararía:
<parent>
<groupId>com.sample</groupId>
<artifactId>projects-governance</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
Entonces, en el POM principal en cuestión, tendría:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.sample</groupId>
<artifactId>modules</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<!-- for each and every foreseen dependency of children poms -->
<dependency>
<groupId>groupId</groupId>
<artifactId>artifactId</artifactId>
<version>version</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
</project>
Nota la dependencyManagement
sección, aquí estamos diciendo: a todos los POM secundarios, siempre que use las dependencias en cuestión que declaro, para este groupId y este artifacId por defecto se aplicarán esta versión y estas exclusiones.
Las principales ventajas de esta solución es que centraliza este mecanismo / gestión para que al menos no tenga que tocar todos y cada uno de los POM (excepto el cambio relativo al nuevo padre).
Sin embargo, aún necesitaría enumerar en el POM principal todas las dependencias utilizadas por todos los proyectos y aplicar una exclusión de comodines para todos ellos.
Para obtener una lista de todas las dependencias por proyecto, probablemente pueda optar por un enfoque manual (¡abra todos y cada uno de los POM!) O ejecutar en cada proyecto lo siguiente:
mvn dependency:list -DexcludeTransitive=true -DoutputFile=dependencies.txt -DappendOutput=true
El complemento de dependencia de Maven luego escribiría en el especificado dependencies.txt
archivar las dependencias declaradas (en el formato groupId:artifactId:packaging:version:scope
) del proyecto en cuestión. Tenga en cuenta el último parámetro, appendOutput
, podría ser útil escribir al final del mismo archivo para mantenerlos centralizados para su posterior procesamiento (eliminar duplicados, moverlos al nuevo pom padre).
Para aplicar comodines a todas las dependencias declaradas, una sugerencia rápida es simplemente reemplazar (con cualquier editor de texto o mediante scripts de shell) los siguientes tokens:
</version>
</dependency>
Por los siguientes:
</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
Luego guarde el archivo. Y automáticamente habría aplicado de forma bastante segura exclusiones de comodines a todas las dependencias.
Actualización por OP: finalmente decidimos no hacer esto y, en su lugar, resolvimos el problema original usando el comando del árbol de dependencias para generar informes de las dependencias recién agregadas / eliminadas para cada proyecto y transmitirlo.