Проблемы зависимостей Maven: при условии и компиляции зависимостей, работающих вместе - PullRequest
0 голосов
/ 01 сентября 2018

Я унаследовал проект maven с десятками «предоставленных» зависимостей области действия. Я работаю над вставкой новой зависимости, которая сама по себе зависит от одной из ранее упомянутых «предоставленных» зависимостей. Эта новая зависимость ограничена тегом "compile" / default.

Приложение работает без добавления новой зависимости. После успешной компиляции приложения с новой зависимостью приложение перестает работать во время выполнения, поскольку новая зависимость не может найти «предоставленные» зависимости.

Необходимо ли, чтобы все «предоставленные» зависимости работали с «предоставленными» зависимостями (и то же самое с любой другой областью действия - они работают только в своем роде)? Я не могу придумать никакого другого объяснения того, почему новые зависимости по умолчанию / «компилировать» не могут работать с существующими «предоставленными» зависимостями. Как я уже упоминал, они четко предоставлены и работают до появления каких-либо новых зависимостей. Любая помощь приветствуется! Я работал с maven документацией по областям и этим ТАК .

1 Ответ

0 голосов
/ 01 сентября 2018

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


По сути, сделав зависимость:

  • compile , вы говорите: «Мне нужно это, чтобы скомпилировать мой код, и он мне нужен также во время выполнения»
  • при условии , вы говорите: «Мне нужно это, чтобы скомпилировать мой код, но во время выполнения кто-то другой предоставит его» * ​​1019 *
  • время выполнения , вы говорите: «Мне не нужно это для компиляции моего кода, но оно понадобится во время выполнения»

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

при условии предназначен для тех случаев, когда кто-то другой будет предоставлять библиотеку во время выполнения (например, контейнер сервлета обычно предоставляет servlet-api.jar как часть инфраструктуры). Эта область, однако, также иногда (ab) используется для странных ситуаций, когда вам нужно скомпилировать какую-то библиотеку, но на самом деле она может / не может использоваться во время выполнения (например, дополнительная функция). В вашем случае также важно, чтобы приложение не работало только на зависимости при условии , если на самом деле зависимость не предоставляется во время выполнения и , попытка использовать ее при время выполнения.

runtime - довольно частая область применения, когда есть артефакт API и артефакт реализации, такой как slf4j-api и slf4j-log4j - тогда вам нужен только API во время компиляции, но нужны как API, так и фактическая реализация во время выполнения.

...