java - generate - classpath maven dependencies
¿Cómo puedo tener una dependencia de Maven en el classpath de tiempo de ejecución pero no el classpath de prueba? (4)
Tengo un caso en el que quiero una dependencia en el classpath de tiempo de ejecución pero no el classpath de prueba. La dependencia en cuestión es Logback, una implementación de SLF4J. En el tiempo de ejecución, quiero que mi código (opcionalmente) dependa del inicio de sesión para que tenga una infraestructura de registro disponible. Sin embargo, en el momento de la prueba, quiero usar la slf4j-nop
para hacer un agujero negro en la salida del registro. Con logback
como una dependencia de tiempo de ejecución y slf4j-nop
como una dependencia de prueba, recibo una advertencia de implementación múltiple de SLF4J cuando ejecuto mis pruebas. No veo una manera de excluir logback
de la ruta de logback
de prueba.
No quiero dividir mis pruebas en un paquete separado si se puede evitar.
Ideas?
¿Trabajaría para agregar una exclusión de dependencia en el inicio de sesión desde la dependencia slf4j-nop test-scoped? Algo como
<dependency>
<groupId>foo</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.0</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>foo</groupId>
<artifactId>logback</artifactId>
</exclusion>
</exclusions>
</dependency>
Finalmente he encontrado una solución real para esto. Desde la versión 2.6 del complemento de Maven Surefire, ahora hay un elemento de configuración classpathDependencyExcludes que permite que se excluyan dependencias específicas de la classpath. Esto por lo tanto funciona:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.8</version>
<configuration>
<classpathDependencyExcludes>
<classpathDependencyExclude>ch.qos.logback:logback-classic</classpathDependencyExclude>
</classpathDependencyExcludes>
</configuration>
</plugin>
Por lo que sé, no tiene que excluirlo de la ruta de clase de prueba. Maven debe mantener el orden de las dependencias en el classpath. Si coloca su dependencia de prueba antes de la dependencia de tiempo de ejecución en las dependencias, también debe ser el primero en la ruta de clase y un ClassLoader debe encontrar las clases en la dependencia de prueba primero cuando 2 dependencias contienen las mismas clases. Entonces, slf4j encontraría el enlace estático de slf4j-nop y no el enlace logback.
Si lo que desea es deshabilitar la salida de registro, agregue un archivo de configuración de registro de retorno a src/test/resources
que descarta toda la salida.
Si necesita hacer esto para varios módulos en la misma compilación del reactor, considere usar el complemento de recursos remotos de Maven .
Este complemento se utiliza para recuperar los archivos JAR de los recursos de los repositorios remotos, procesa esos recursos y los incorpora a los archivos JAR que creas con Maven. Un caso de uso muy común es la necesidad de empaquetar ciertos recursos de manera consistente en toda su organización.