Как я могу использовать зависимость Maven от пути к классам выполнения, но не для тестового пути?
У меня есть случай, когда мне нужна зависимость от пути к среде выполнения, но не для тестового пути. Эта зависимость относится к Logback, реализации SLF4J. Во время выполнения я хочу, чтобы мой код (необязательно) зависел от логина, чтобы он имел доступную инфраструктуру ведения журнала. Однако во время тестирования я хочу использовать реализацию slf4j-nop
для черной дыры для выхода журнала. С logback
в качестве зависимости от времени выполнения и slf4j-nop
в качестве тестовой зависимости я получаю предупреждение о множественной реализации из SLF4J при выполнении моих тестов. Я не вижу способа исключить logback
из тестового пути.
Я не хочу разделить свои тесты на отдельный пакет, если его можно избежать.
Идеи?
Ответы
Ответ 1
Наконец-то я нашел реальное решение. Начиная с версии 2.6 плагина Maven Surefire, теперь есть элемент конфигурации classpathDependencyExcludes, который позволяет исключить определенные зависимости из пути к классам. Поэтому это работает:
<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>
Ответ 2
Если вы отключите вывод журнала, добавьте файл конфигурации журнала в src/test/resources
, который отбрасывает все выходные данные.
Если вам нужно сделать это для нескольких модулей в одной и той же реакторной сборке, подумайте об использовании плагина maven remote resources.
Этот плагин используется для извлечения JAR-ресурсов из удаленных репозиториев, обрабатывает эти ресурсы и включает их в JAR файлы, которые вы создаете с помощью Maven. Очень распространенным случаем использования является необходимость последовательного объединения определенных ресурсов в вашей организации.
Ответ 3
Насколько я знаю, вам не нужно исключать его из тестового пути. Maven должен поддерживать порядок зависимостей в пути к классам. Если вы ставите свою зависимость теста до зависимости от времени выполнения в зависимостях, она также должна быть первой в пути к классам, и ClassLoader должен сначала найти классы в тестовой зависимости, когда 2 зависимостей содержат одни и те же классы. Таким образом, slf4j затем найдет статическую привязку slf4j-nop, а не привязку к журналу.
Ответ 4
Будет ли работать над добавлением исключения зависимостей в logback из зависимостей slf4j-nop test-scope? Что-то вроде
<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>