CompileOnly
зависимости доступны во время компиляции, но не при их запуске.
Это эквивалентно области provided
в maven.
Это означает, что все, кто хочет ее выполнить необходимо предоставить библиотеку со всеми классами библиотеки CompileOnly
.
Например, вы можете создать библиотеку, которая использует SLF4J API, и вы можете установить для нее значение CompileOnly
.
Любой, кто использует библиотеку, должен (явно) импортировать некоторую версию API SLF4J, чтобы использовать его.
RuntimeOnly
библиотеки - это наоборот, они доступны во время выполнения, но не во время компиляции.
Например, вам не нужен конкретный регистратор SLF4J (например, логбэк) во время компиляции (поскольку вы используете классы SLF4J для доступа к нему), но он вам нужен во время выполнения, так как вы хотите его использовать.
Давайте посмотрим на следующий пример:
У вас есть библиотека, использующая SLF4J:
compileOnly org.slf4j:slf4j-api:1.7.30
, и у вас может быть проект, использующий эту библиотеку:
implementation project(":yourlibrary")
implementation org.slf4j:slf4j-api:2.0.0-alpha1
runtimeOnly ch.qos.logback:logback:0.5
SLF4J обнаруживает со Конкретный регистратор во время выполнения, ему не нужно знать библиотеку ведения журнала (например, возврат в журнал) во время выполнения. Вот почему вы можете использовать runtimeOnly
для конкретного регистратора.
Обратите внимание, что compileOnly
широко используется с Jakarta EE, поскольку контейнер / сервер приложений JEE предоставляет множество зависимостей, как показано на блог OP обнаружен.