Проблема не в том, что ваша компилируемая зависимость зависит от предоставленной зависимости, а в том, что предоставленная зависимость отсутствует во время выполнения. Я могу только догадываться, почему это так, но вероятное объяснение состоит в том, что он уже отсутствовал, просто никто раньше не использовал эту зависимость во время выполнения, так что это не имело значения.
По сути, сделав зависимость:
- compile , вы говорите: «Мне нужно это, чтобы скомпилировать мой код, и он мне нужен также во время выполнения»
- при условии , вы говорите: «Мне нужно это, чтобы скомпилировать мой код, но во время выполнения кто-то другой предоставит его» * 1019 *
- время выполнения , вы говорите: «Мне не нужно это для компиляции моего кода, но оно понадобится во время выполнения»
compile - это область по умолчанию и наиболее частая область, поскольку большинство зависимостей необходимы как во время компиляции, так и во время выполнения, поэтому имеет смысл сказать Maven распространять их в обоих случаях.
при условии предназначен для тех случаев, когда кто-то другой будет предоставлять библиотеку во время выполнения (например, контейнер сервлета обычно предоставляет servlet-api.jar
как часть инфраструктуры). Эта область, однако, также иногда (ab) используется для странных ситуаций, когда вам нужно скомпилировать какую-то библиотеку, но на самом деле она может / не может использоваться во время выполнения (например, дополнительная функция). В вашем случае также важно, чтобы приложение не работало только на зависимости при условии , если на самом деле зависимость не предоставляется во время выполнения и , попытка использовать ее при время выполнения.
runtime - довольно частая область применения, когда есть артефакт API и артефакт реализации, такой как slf4j-api
и slf4j-log4j
- тогда вам нужен только API во время компиляции, но нужны как API, так и фактическая реализация во время выполнения.