112 Stimmen

Unterschied zwischen Kompilier- und Laufzeitkonfigurationen in Gradle

Meine Frage ist etwas üblich, aber sie ist auch mit Gradle verknüpft.

Warum brauchen wir Kompilierungs- und Laufzeitkonfiguration?

Wenn ich etwas kompiliere, benötige ich Artefakte, um meine Java-Klassen in Bytecode umzuwandeln, deshalb brauche ich eine Kompilierungskonfiguration. Aber warum wird eine Laufzeitkonfiguration benötigt? Brauche ich etwas anderes, um meine Anwendung in der JVM auszuführen?

Entschuldigung, wenn das dumm klingt, aber ich verstehe es nicht.

165voto

Peter Niederwieser Punkte 116677

Im häufigsten Fall sind die Artefakte, die zur Kompilierungszeit benötigt werden, eine Teilmenge derjenigen, die zur Laufzeit benötigt werden. Zum Beispiel, nehmen wir an, dass ein Programm namens app die Bibliothek foo verwendet, und die Bibliothek foo intern die Bibliothek bar verwendet. Dann ist nur foo zum Kompilieren von app erforderlich, aber sowohl foo als auch bar sind erforderlich, um es auszuführen. Deshalb ist standardmäßig alles, was Sie in die compile Konfiguration von Gradle einfügen, auch in der runtime Konfiguration sichtbar, aber das Gegenteil ist nicht der Fall.

18voto

KnockingHeads Punkte 910

Antwort aktualisieren gemäß den neuesten Gradle-Versionen.

Von der offiziellen Dokumentation von Gradle unter folgendem Link:

https://docs.gradle.org/current/userguide/upgrading_version_5.html

Veraltungen

Abhängigkeiten sollten nicht mehr mithilfe der Konfigurationen compile und runtime deklariert werden. Die Verwendung der Konfigurationen compile und runtime in den Java-Ökosystem-Plugins wird seit Gradle 3.4 entmutigt.

Die Konfigurationen implementation, api, compileOnly und runtimeOnly sollten verwendet werden, um Abhängigkeiten zu deklarieren, und die Konfigurationen compileClasspath und runtimeClasspath, um Abhängigkeiten aufzulösen.

Zudem wurde die Kompilierabhängigkeitskonfiguration in der kürzlich veröffentlichten Gradle-Version 7.0 entfernt.

Wenn Sie versuchen, compile in Ihrem Gradle 3.4+-Projekt zu verwenden, erhalten Sie eine Warnung wie diese:

Veraltete Gradle-Funktionen wurden beim Erstellen verwendet und sind daher nicht kompatibel mit Gradle 7.0. Verwenden Sie ‘–warning-mode all’, um die einzelnen Veraltungs warnungen anzuzeigen.

Sie sollten immer implementation anstelle von compile für Abhängigkeiten verwenden und runtimeOnly anstelle von runtime.

Was ist eine Implementierungsabhängigkeit?

Wenn Sie ein Java-Projekt erstellen und ausführen, sind zwei Klass Pfade beteiligt:

Kompilierungsklassenpfad – Diese Abhängigkeiten sind erforderlich, damit das JDK Java-Code in .class-Dateien kompilieren kann.

Ausführungsklassenpfad – Diese Abhängigkeiten sind erforderlich, um den kompilierten Java-Code tatsächlich auszuführen.

Beim Konfigurieren von Gradle-Abhängigkeiten konfigurieren wir nur, welche Abhängigkeiten auf welchem Klassenpfad erscheinen sollen. Da es nur zwei Klassenpfade gibt, ergibt es Sinn, dass wir drei Optionen haben, um unsere Abhängigkeiten zu deklarieren.

  1. compileOnly – Die Abhängigkeit nur auf den Kompilierungsklassenpfad setzen.
  2. runtimeOnly – Die Abhängigkeit nur auf den Ausführungsklassenpfad setzen.
  3. implementation – Die Abhängigkeit auf beide Klassenpfade setzen.

Verwenden Sie die Implementierungsabhängigkeitskonfiguration, wenn Sie möchten, dass die Abhängigkeit auf beiden Kompilierungs- und Ausführungsklassenpfaden vorhanden ist. Andernfalls sehen Sie sich compileOnly oder runtimeOnly an.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X