Объявлять зависимость 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
для плагина зависимостей, но это похоже на очень тупой инструмент, который скроет другие потенциальные проблемы.)
Ответы
Ответ 1
Здесь нет области, которая делает именно то, что вы хотите здесь; test
- лучший доступный вариант.
A test-runtime
область была запрошена раньше (Re: Необходимость в области проверки выполнения?), и предлагаемое решение - это именно конфигурация ignoreNonCompile
, которую вы Вы уже обнаружили.
dependency:analyze
уже имеет некоторые ограничения ( "некоторые случаи не обнаружены (константы, аннотации с сохранением исходного кода, ссылки в javadoc)" ). Возможно, вам придется принять, что любые зависимые от test
-scope зависимости, которые он предупреждает, являются ложными срабатываниями.
(Вы могли бы разделить определение своих тестов на отдельный модуль, который не имел бы зависимостей реализации slf4j
, а затем запускал их в другом модуле. Я не думаю, что это того стоило.)
Ответ 2
В maven нет понятия тестового времени выполнения. Единственный реальный недостаток - это анализ зависимостей, определяющий эти зависимости тестовой среды как неиспользуемые. Однако, поскольку они являются только тестовыми зависимостями, это довольно мягко и не может вызывать проблемы для других проектов, транзитно зависящих от этого проекта.
Ответ 3
Поскольку maven-dependency-plugin 2.10 (версия 1649454, январь 2015 г.), вы также можете добавить в конфигурацию список ignoredDependencies, ignoredUnusedDeclaredDependencies и ignoredUsedUndeclaredDependencies.