Как получить зависимость Maven от пути к классам среды выполнения, но не от пути к классам тестов? - PullRequest
18 голосов
/ 28 января 2011

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

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

Идеи?

Ответы [ 4 ]

18 голосов
/ 25 марта 2011

Я наконец нашел реальное решение для этого. Начиная с версии 2.6 подключаемого модуля Maven Surefire, теперь имеется элемент конфигурации classpathDependencyExclude , который позволяет исключить определенные зависимости из пути к классам. Поэтому это работает:

<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 голосов
/ 28 января 2011

Если вы хотите отключить вывод журнала, добавьте файл конфигурации обратного входа в src/test/resources, который отбрасывает весь вывод.

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

Этот плагин используется для извлечения JAR-ресурсов из удаленных репозиториев, обработки этих ресурсов и включения их в JAR-файлы, создаваемые вами в Maven. Очень распространенный вариант использования - это необходимость систематизировать определенные ресурсы по всей организации.

1 голос
/ 28 января 2011

Насколько я знаю, вам не нужно исключать его из тестового пути к классам.Maven должен поддерживать порядок зависимостей в пути к классам.Если вы поместили тестовую зависимость перед зависимостью времени выполнения в зависимостях, она также должна быть первой в пути к классам, а ClassLoader должен сначала найти классы в тестовой зависимости, когда 2 зависимости содержат одинаковые классы.Таким образом, slf4j найдет статическую привязку slf4j-nop, а не привязку logback.

0 голосов
/ 28 января 2011

Будет ли работать добавление исключения зависимости при входе в систему из зависимой области тестирования slf4j-nop?Что-то вроде

<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>
...