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

Объявлять зависимость Maven только как тестовую версию

Каков наилучший способ объявить зависимость Maven как только используемую для пути класса тестирования (но не для тестовой компиляции)?

В частности, я хочу slf4j-api (фаза ведения журнала) как типичную зависимость от компиляции, но я хочу, чтобы slf4j-simple (реализация barebones, подходящая для модульных тестов), только на пути тестирования тестовой среды выполнения (она не нужна для компиляции теста). Я делал это:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <scope>test</scope>
</dependency>

Однако недостатком этого является то, что dependency:analyze сообщает slf4j-simple как неиспользуемый, предположительно потому, что он не нужен для компиляции:

[WARNING] Unused declared dependencies found:
[WARNING]    org.slf4j:slf4j-simple:jar:1.7.7:test

Я не могу использовать зависимость runtime, потому что я не хочу, чтобы эта зависимость транзитивно унаследовалась (например, поэтому нисходящие зависимости могут использовать log4j и т.д.). Я пробовал runtime с помощью optional=true, но это приводит к тому же предупреждению.

(Заметьте, что я мог бы также установить ignoreNonCompile для плагина зависимостей, но это похоже на очень тупой инструмент, который скроет другие потенциальные проблемы.)

4b9b3361

Ответ 1

Здесь нет области, которая делает именно то, что вы хотите здесь; test - лучший доступный вариант.

A test-runtime область была запрошена раньше (Re: Необходимость в области проверки выполнения?), и предлагаемое решение - это именно конфигурация ignoreNonCompile, которую вы Вы уже обнаружили.

dependency:analyze уже имеет некоторые ограничения ( "некоторые случаи не обнаружены (константы, аннотации с сохранением исходного кода, ссылки в javadoc)" ). Возможно, вам придется принять, что любые зависимые от test -scope зависимости, которые он предупреждает, являются ложными срабатываниями.

(Вы могли бы разделить определение своих тестов на отдельный модуль, который не имел бы зависимостей реализации slf4j, а затем запускал их в другом модуле. Я не думаю, что это того стоило.)

Ответ 2

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