2011-01-27 12 views
18

Tengo un caso en el que deseo una dependencia en el classpath de tiempo de ejecución pero no classpath de prueba. La dependencia en cuestión es Logback, una implementación de SLF4J. En tiempo de ejecución, quiero que mi código (opcionalmente) dependa de logback para que tenga una infraestructura de registro disponible. En el momento de la prueba, sin embargo, deseo utilizar la implementación slf4j-nop para tapar el resultado 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 al ejecutar mis pruebas. No veo una forma de excluir logback del classpath de prueba.¿Cómo puedo tener una dependencia de Maven en classpath en tiempo de ejecución pero no en classpath de prueba?

No quiero dividir mis pruebas en un paquete separado si puede evitarse.

Ideas?

Respuesta

18

Finalmente he encontrado una solución real para esto. Desde la versión 2.6 del complemento Maven Surefire, ahora existe un elemento de configuración classpathDependencyExcludes que permite que se excluyan dependencias específicas de la ruta de clase. Por lo tanto, esto 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> 
+0

¡Gracias! Me has ahorrado mucho tiempo investigando con esta respuesta. –

+1

Gracias una tonelada. Triste parece un truco ... ¡Ojalá pudiéramos obtener un "!" operador en el campo de alcance. –

0

¿Funcionaría agregar una exclusión de dependencia en logback desde la dependencia slf4j-nop test-scoped? Algo así 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> 
+0

yo probamos este, pero 'exclude' sólo excluye dependencias transitivas del paquete en cuestión; desafortunadamente, parece que no se puede usar para excluir dependencias arbitrarias propagadas desde otros classpaths. –

2

Si al deshabilitar la salida del registro es lo que desea, añadir un archivo de configuración logback a src/test/resources que descarta toda la salida.

Si necesita hacer esto para varios módulos en la misma construcción del reactor, considere usar el maven remote resources plugin.

Este complemento se utiliza para recuperar JAR de recursos de repositorios remotos, procesar esos recursos e incorporarlos a los archivos JAR que compile con Maven. Un caso de uso muy común es la necesidad de empaquetar ciertos recursos de manera consistente en toda su organización.

+0

Podría tener que ir con esto; desafortunadamente, también requeriría una reestructuración adicional del proyecto (es un proyecto de varios módulos, así que tengo que asegurarme de que el archivo de configuración esté disponible en todos). –

+0

@Michael: consulte mi actualización –

1

Por lo que sé, no tiene que excluirlo de la classpath de prueba. Maven debería 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 la primera en el classpath 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 de logback.

+0

Sí, sin embargo, SLF4J luego imprime una advertencia sobre múltiples classpaths. Estoy tratando de evitar la advertencia. –

Cuestiones relacionadas