Exclure des dépendances avec Maven en fonction de la version de Java

Il peut parfois être utile d’exclure certaines dépendances dans un projet Maven, pour éviter d’avoir des classes en doublons dans le classpath, et d’être assuré d’utiliser la bonne version de la classe.

Par exemple, si notre projet utilise une dépendance qui doit utiliser elle-même la dépendance transitive jaxb-api 2.0, on peut souhaiter exclure cette dernière dépendance qui est en fait incluse dans Java 6.

Pour ce faire, il existe plusieurs solutions :

  1. Exclure une dépendance dans la gestion des dépendances
  2. Utiliser un scope provided ou system sur la dépendance que l’on souhaite exclure (suivant qu’elle est embarquée par le container, ou incluse dans le JRE)

Enfin, pour s’assurer que l’on traite l’exclusion uniquement dans une version donnée de Java, on utilise le mécanisme des profiles Maven.

Exemple, pour exclure une API qui serait incluse dans Java 6 :

Dans ce cas on utilise un profile – extrait du pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>fr.husta.test</groupId>
	<artifactId>xml-jaxb2-schema-test</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<!-- http://maven.apache.org/plugins/maven-compiler-plugin/ -->
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>

			<!-- PLUGIN MAVEN-DUPLICATE-FINDER-PLUGIN -->
			<!-- https://github.com/ning/maven-duplicate-finder-plugin -->
			<plugin>
				<groupId>com.ning.maven.plugins</groupId>
				<artifactId>maven-duplicate-finder-plugin</artifactId>
				<version>1.0.4</version>
			</plugin>

		</plugins>
	</build>

	<dependencies>

		<!-- LIB PERSO pour TESTS -->
		<dependency>
			<groupId>fr.xxx.yyy</groupId>
			<artifactId>yyy-xml-jaxb2</artifactId>
			<version>1.0</version>
		</dependency>

	</dependencies>

	<profiles>
		<profile>
			<id>java6</id>
			<activation>
				<jdk>[1.6,)</jdk>
			</activation>
			<dependencies>
				<!-- JE VEUX EXCLURE JSR 173: STAX -->
				<dependency>
					<groupId>javax.xml.bind</groupId>
					<artifactId>jsr173_api</artifactId>
					<version>1.0</version>
					<scope>system</scope>
					<systemPath>${java.home}/lib/rt.jar</systemPath>
				</dependency>
				<!-- http://www.oracle.com/technetwork/java/javase/6u18-142093.html#stax1.2-1.6.0_18 -->
				<dependency>
					<groupId>stax</groupId>
					<artifactId>stax</artifactId>
					<version>1.2.0</version>
					<scope>system</scope>
					<systemPath>${java.home}/lib/rt.jar</systemPath>
				</dependency>
				<dependency>
					<groupId>stax</groupId>
					<artifactId>stax-api</artifactId>
					<version>1.0.1</version>
					<scope>system</scope>
					<systemPath>${java.home}/lib/rt.jar</systemPath>
				</dependency>
				<!-- JE VEUX EXCLURE JSR 222: JAXB 2.0 -->
				<dependency>
					<groupId>javax.xml.bind</groupId>
					<artifactId>jaxb-api</artifactId>
					<version>2.0</version>
					<scope>system</scope>
					<systemPath>${java.home}/lib/rt.jar</systemPath>
				</dependency>
			</dependencies>
		</profile>
	</profiles>

</project>

Références utiles :