Подтвердить что ты не робот

Как я могу использовать зависимость Maven от пути к классам выполнения, но не для тестового пути?

У меня есть случай, когда мне нужна зависимость от пути к среде выполнения, но не для тестового пути. Эта зависимость относится к Logback, реализации SLF4J. Во время выполнения я хочу, чтобы мой код (необязательно) зависел от логина, чтобы он имел доступную инфраструктуру ведения журнала. Однако во время тестирования я хочу использовать реализацию slf4j-nop для черной дыры для выхода журнала. С logback в качестве зависимости от времени выполнения и slf4j-nop в качестве тестовой зависимости я получаю предупреждение о множественной реализации из SLF4J при выполнении моих тестов. Я не вижу способа исключить logback из тестового пути.

Я не хочу разделить свои тесты на отдельный пакет, если его можно избежать.

Идеи?

4b9b3361

Ответ 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>