pom mvn exclude example dependency compile clean maven maven-3

mvn - ¿Forma correcta de declarar el alcance múltiple para la dependencia de Maven?



mvn clean install (3)

Por ejemplo, tengo una dependencia que quiero usar en el ámbito de test (para que esté en el classpath cuando estoy ejecutando pruebas unitarias), y en el alcance del runtime de runtime (para poder contener eso en WAR / EAR / otro paquete para implementación, pero no afecta la búsqueda de dependencia transitiva para artefactos dependientes).

Un ejemplo de la vida real son los JAR de implementación de SLF4J (por ejemplo, Logback), quiero que existan en classpath cuando estoy ejecutando pruebas, y quiero que se incluyan en mi WAR / EAR, pero no quiero un proyecto que dependa de mi proyecto para incluir eso en la búsqueda de dependencia transitiva.

Intenté usar <scope>test,runtime</scope> pero en Maven 3 me advirtió

[WARNING] ''dependencies.dependency.scope'' for org.slf4j:jcl-over-slf4j:jar must be one of [provided, compile, runtime, test, system] but is ''test,runtime''.

¿Cuál es la forma correcta de declarar el alcance de la dependencia en tal caso?

Gracias


El alcance del tiempo de ejecución también hace que el artefacto esté disponible en el classpath de prueba. Solo usa tiempo de ejecución. (Consulte la documentation Maven).

Para evitar que la dependencia se resuelva transitoriamente, también haga que sea optional con <optional>true</optional> :

<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback</artifactId> <version>0.5</version> <scope>runtime</scope> <optional>true</optional> </dependency>


La declaración de una dependencia con un scope de runtime de runtime garantiza que la biblioteca no esté disponible durante el tiempo de compilación.

Declarar la dependencia como optional causa un corte en el proceso de resolución de dependencia; los proyectos que dependen de sus bibliotecas deberán incluir explícitamente las dependencias mismas.

Entonces, la forma correcta de declarar esto sería:

<dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.13</version> <scope>runtime</scope> <optional>true</optional> </dependency>


Solo puede definir un valor de ámbito por etiqueta <scope/> .

Me temo que lo que le gustaría hacer no se puede lograr simplemente usando un alcance. Si define un alcance de test , solo estará disponible durante las pruebas; si define un alcance de proporcionado, eso significaría que esperaría que la dependencia de su proyecto se resolviera y utilizara durante la compilación y las pruebas, pero no se incluirá en su archivo WAR. De cualquier manera, no es lo que querrías.

Por lo tanto, recomendaría que eche un vistazo al maven-assembly-plugin , con el que puede lograrlo, pero aún así necesitará algunos juegos.