2011-01-27 7 views
18

Mam przypadku, w którym chcę zależności od ścieżki klasy środowiska wykonawczego, ale , a nie testowej ścieżki klasy. Zależność, o której mowa, to Logback, implementacja SLF4J. W środowisku wykonawczym chcę, aby mój kod (opcjonalnie) był zależny od logback, dzięki czemu dostępna jest infrastruktura rejestrowania. Jednak w czasie testu chcę użyć implementacji slf4j-nop, aby uzyskać czarną dziurę wyjścia dziennika. Z logback jako zależności runtime i slf4j-nop jako zależności testowej, otrzymuję ostrzeżenie o wielu implementacjach od SLF4J podczas uruchamiania moich testów. Nie widzę sposobu, aby wykluczyć logback z testowej ścieżki klas.Jak mogę uzyskać zależność Maven od ścieżki klasy środowiska wykonawczego, ale nie od ścieżki testowej?

Nie chcę dzielić testów na osobną paczkę, jeśli można tego uniknąć.

Pomysły?

Odpowiedz

18

W końcu znalazłem prawdziwe rozwiązanie tego problemu. Od wersji 2.6 wtyczki Maven Surefire istnieje teraz element konfiguracyjny classpathDependencyExcludes, który pozwala na wykluczenie określonych zależności ze ścieżki klas. Działa to zatem:

<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

Dziękujemy! Dzięki tej odpowiedzi zaoszczędziłeś mi mnóstwo czasu na badaniach. –

+1

Dzięki za tonę. Smutne, wydaje się, że to hack ... Żałujmy, że nie dostaniemy "!" operator w polu zakresu. –

0

Czy dodawanie wykluczania zależności przy logbackach z zależności zależnej od zestawu testów jest zależne od slf4j-nop? Coś jak

<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

Próbowałem tego, ale "wyklucz" tylko wyklucza przechodnie zależności pakietu, o którym mowa; Niestety, wydaje się, że nie można go użyć do wykluczenia dowolnych zależności propagowanych z innych ścieżek klas. –

2

Jeśli wyłączenie wyjścia dziennika jest to, co chcesz, dodać plik konfiguracyjny logback do src/test/resources który odrzuca wszystkie wyjścia.

Jeśli potrzebujesz tego dla wielu modułów w tej samej konstrukcji reaktora, rozważ użycie maven remote resources plugin.

Ta wtyczka służy do pobierania plików JAR z odległych repozytoriów, przetwarzania tych zasobów i dołączania ich do słoików tworzonych za pomocą Maven. Bardzo częstym przypadkiem użycia jest potrzeba spakowania określonych zasobów w spójny sposób w całej organizacji.

+0

Być może będę musiał iść z tym; Niestety, wymagałoby to również dalszej restrukturyzacji projektu (jest to projekt wielomodułowy, więc muszę się upewnić, że plik konfiguracyjny jest dostępny we wszystkich). –

+0

@Michael: zobacz moją aktualizację –

1

O ile wiem, nie trzeba wykluczyć go z testowej ścieżki klas. Maven powinien zachować kolejność zależności w ścieżce klas. Jeśli umieścisz zależność testową przed zależnością środowiska wykonawczego w zależnościach, powinna ona również być pierwsza w ścieżce klasy, a klasa ClassLoader powinna znaleźć klasy w zależności testowej, gdy dwie zależności zawierają te same klasy. Zatem slf4j znalazłoby statyczne powiązanie slf4j-nop, a nie powiązanie logback.

+0

Tak, jednak SLF4J wyświetli ostrzeżenie o wielu ścieżkach klas. Próbuję uniknąć ostrzeżenia. –

Powiązane problemy