Gradle: compileOnly и runtimeOnly - PullRequest
       90

Gradle: compileOnly и runtimeOnly

4 голосов
/ 09 мая 2020

Я бы прочитал документацию , но я не могу понять, как создать рабочий пример, чтобы лучше понять их различия.

enter image description here

И из c Я создал проект игровой площадки, чтобы проверить, что происходит, когда я использую тот или иной.

app.gradle

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$rootProject.kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.2.0'
    compileOnly project(":compileonlylibrary")
    runtimeOnly project(":runtimeonlylibrary")
}

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        FooCompile() // this crash in runtime
        BarRuntime() // this doesn't compiles obviously
    }
}
// FooCompile belongs to compileonlylibrary
// BarRuntime belongs to runtimeonlylibrary

И все, я застрял здесь, я не могу создать правильный пример, чтобы улучшить свои знания о конфигурациях Gradle.

Может ли кто-нибудь дать мне рука? При необходимости я могу предоставить более подробную информацию.

1 Ответ

2 голосов
/ 09 мая 2020

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 обнаружен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...