Estoy tratando de encontrar una forma "genérica" de excluir una dependencia transitiva para que no se incluya sin tener que excluirla de todas las dependencias que dependen de ella. Por ejemplo, si quiero excluir slf4j, hago lo siguiente:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jmx</artifactId>
<version>3.3.2.GA</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.4.0.GA</version>
<type>jar</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
Esto es en parte para limpiar el archivo pom, en parte para evitar problemas en el futuro con personas que agregan dependencias que dependen de esa dependencia excluida y se olvidan de excluirla.
¿Hay alguna manera?
maven
maven-2
dependencies
pom.xml
Sébastien Le Callonnec
fuente
fuente
Respuestas:
¿Esto ayuda? http://jlorenzen.blogspot.com/2009/06/maven-global-excludes.html
"Suponiendo que quiero excluir avalon-framework de mi WAR, agregaría lo siguiente a mis proyectos POM con un alcance de proporcionado. Esto funciona en todas las dependencias transitivas y le permite especificarlo una vez.
<dependencies> <dependency> <artifactId>avalon-framework</artifactId> <groupId>avalon-framework</groupId> <version>4.1.3</version> <scope>provided</scope> </dependency> </dependencies>
Esto incluso funciona cuando se especifica en el POM principal, lo que evitaría que los proyectos tuvieran que declarar esto en todos los POM secundarios ".
fuente
runtime
alcance en lugar delprovided
alcance?Creé un frasco vacío y creé esta dependencia:
<dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <scope>system</scope> <systemPath>${basedir}/src/lib/empty.jar</systemPath> <version>0</version> </dependency>
No es perfecto porque a partir de ahora tienes un jar vacío en tu ruta de compilación / prueba. Pero eso es solo cosmético.
fuente
system
el alcance ahora está en desuso: maven.apache.org/guides/introduction/…system
alcance, consulte el repositorio virtual de Maven versión99.grons.nl (Advertencia: solo HTTP) o (solo para commons-logging / log4j) consulte la "alternativa 3) artefactos vacíos" aquí: slf4j.org/faq.html#excluyendoJCLPara ampliar el comentario de dnault :
Se puede usar la regla de dependencias prohibidas del complemento Maven Enforcer para garantizar que se excluyan las dependencias. Aún hay que excluirlos manualmente, pero la compilación fallará si alguien agrega la dependencia en otro lugar por error.
<dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jmx</artifactId> <version>3.3.2.GA</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <version>1.4.1</version> <executions> <execution> <goals> <goal>enforce</goal> </goals> <configuration> <rules> <bannedDependencies> <excludes> <exclude>org.slf4j:slf4j-api</exclude> </excludes> </bannedDependencies> </rules> </configuration> </execution> </executions> </plugin> </plugins>
También hay una solicitud de función abierta: MNG-1977 Exclusiones de dependencia global
fuente
Como recordatorio, aquí está la respuesta de la documentación oficial de Maven:
Si se quiere hacer una construcción más robusta, se puede utilizar un rango de versiones . Esto aseguraría que ninguna versión más nueva de la dependencia pueda interferir con el proyecto.
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>[1.4.2,)</version> <scope>provided</scope> </dependency>
Cualquier versión de slf4j-api> = 1.4.2 se considerará ofrecida (proporcionada) en tiempo de ejecución, ya sea desde una ruta de clase configurada o desde un contenedor.
Referencias
fuente