Объявите зависимость 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 для подключаемого модуля зависимостей, но это кажется очень грубым инструментом, скрывающим другие потенциальные проблемы.)


person Trevor Robinson    schedule 31.12.2014    source источник
comment
что это требуется во время выполнения для основного источника? не будет ли он по-прежнему жаловаться на зависимость с областью действия runtime?   -  person jmj    schedule 01.01.2015
comment
В общем случае транзитивные зависимости объявлять не нужно. Для необязательной зависимости (как правило, такой как ведение журнала, которое может использовать разные фреймворки) ваша процедура верна. Может быть, вы также можете добавить тест области.   -  person Joop Eggen    schedule 01.01.2015
comment
Он также жалуется (ошибочно, ИМХО) на зависимость runtime, поэтому кажется, что только область действия здесь не является ответом. Что мне действительно нужно, так это область, которая является пересечением test и runtime (насколько это касается пути к классу), и чтобы подключаемый модуль зависимостей вел себя менее глупо в отношении неиспользуемых зависимостей runtime.   -  person Trevor Robinson    schedule 01.01.2015


Ответы (4)


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

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

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

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

person Joe    schedule 01.01.2015
comment
Для проблемы с javadoc я прибегал к ссылке на полное имя класса и добавлял базовый URL-адрес ссылки к плагину javadoc и не объявлял зависимость от проекта. Это позволяет избежать оператора импорта и других потенциальных негативных проблем, связанных с перечислением зависимостей, которые на самом деле не требуются. - person Brett Okken; 01.01.2015
comment
Проблема описана здесь. - person Olivier Cailloux; 29.12.2018

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

person Brett Okken    schedule 31.12.2014

Начиная с maven-dependency-plugin 2.10 (редакция 1649454, январь 2015 г.), вы можете также добавьте в конфигурацию список игнорируемых зависимостей , ignoredUnusedDeclaredDependencies и ignoredUsedUndeclaredDependencies.

person Alessio Santacroce    schedule 21.03.2016
comment
Можете ли вы объяснить немного больше, пожалуйста? - person Dieter Meemken; 21.03.2016
comment
Эти варианты были добавлены сразу после того, как я задал вопрос, и я думаю, что они, в сочетании с принятым ответом, являются лучшим подходом для решения этой проблемы. - person Trevor Robinson; 13.05.2016

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

person jnr    schedule 21.02.2020