Abhängigkeitsmanagement in Gradle

1. Übersicht

In diesem Tutorial werden wir uns mit dem Deklarieren von Abhängigkeiten in einem Gradle-Build-Skript befassen. Für unsere Beispiele verwenden wir Gradle 6.7.

2. Typische Struktur

Beginnen wir mit einem einfachen Gradle-Skript für Java-Projekte:

plugins { id 'java' } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter:2.3.4.RELEASE' testImplementation 'org.springframework.boot:spring-boot-starter-test:2.3.4.RELEASE' }

Wie oben zu sehen ist, haben wir drei Codeblöcke: Plugins , Repositorys und Abhängigkeiten .

Zunächst sagt uns der Plugins- Block, dass dies ein Java-Projekt ist. Zweitens deklariert der Abhängigkeitsblock Version 2.3.4. FREIGABE der Spring-Boot-Starter- Abhängigkeit, die zum Kompilieren des Produktionsquellcodes des Projekts erforderlich ist. Darüber hinaus wird angegeben, dass die Testsuite des Projekts zum Kompilieren einen Spring-Boot-Starter-Test benötigt .

Der Gradle-Build ruft alle Abhängigkeiten aus dem Maven Central-Repository ab, wie durch den Repositorys- Block definiert.

Konzentrieren wir uns darauf, wie wir Abhängigkeiten definieren können.

3. Abhängigkeitskonfigurationen

Es gibt verschiedene Konfigurationen, in denen wir Abhängigkeiten deklarieren können. In dieser Hinsicht können wir uns dafür entscheiden, mehr oder weniger genau zu sein, wie wir später sehen werden.

3.1. So deklarieren Sie Abhängigkeiten

Zu Beginn besteht die Konfiguration aus 4 Teilen:

  • Gruppe - Kennung einer Organisation, eines Unternehmens oder eines Projekts
  • Name - Abhängigkeitskennung
  • Version - die, die wir importieren möchten
  • Klassifizierer - nützlich, um Abhängigkeiten mit derselben Gruppe ,demselben Namen undderselben Version zu unterscheiden

Wir können Abhängigkeiten in zwei Formaten deklarieren. Das vertraglich vereinbarte Format ermöglicht es uns , eine Abhängigkeit als zu erklären , String :

implementation 'org.springframework.boot:spring-boot-starter:2.3.4.RELEASE'

Das erweiterte Format ermöglicht es uns stattdessen, es als Karte zu schreiben :

implementation group:'org.springframework.boot', name: 'spring-boot-starter', version: '2.3.4.RELEASE'

3.2. Arten der Konfiguration

Darüber hinaus bietet Gradle viele Konfigurationsarten für Abhängigkeiten:

  • api - wird verwendet, um die Abhängigkeiten explizit zu machen und sie im Klassenpfad verfügbar zu machen. Zum Beispiel bei der Implementierung einer Bibliothek, die für die Konsumenten der Bibliothek transparent ist
  • Implementierung - erforderlich zum Kompilieren des Produktionsquellcodes und rein intern. Sie sind nicht außerhalb des Pakets ausgesetzt
  • compileOnly - wird verwendet, wenn sie nur zur Kompilierungszeit deklariert werden müssen, z. B. Annotationen nur für Quellen oder Annotationsprozessoren. Sie werden nicht im Laufzeitklassenpfad oder im Testklassenpfad angezeigt
  • compileOnlyApi - Wird verwendet, wenn dies zur Kompilierungszeit erforderlich ist und wenn sie im Klassenpfad für Verbraucher sichtbar sein müssen
  • runtimeOnly - wird verwendet, um Abhängigkeiten zu deklarieren, die nur zur Laufzeit erforderlich sind und zur Kompilierungszeit nicht verfügbar sind
  • testImplementation - erforderlich, um Tests zu kompilieren
  • testCompileOnly - nur zur Testkompilierungszeit erforderlich
  • testRuntimeOnly - nur zur Testlaufzeit erforderlich

Wir sollten beachten, dass die neuesten Versionen von Gradle einige Konfigurationen wie compile , testCompile , runtime und testRuntime ablehnen. Zum Zeitpunkt des Schreibens sind sie noch verfügbar.

4. Arten externer Abhängigkeiten

Lassen Sie uns die Arten externer Abhängigkeiten untersuchen, die in einem Gradle-Build-Skript auftreten.

4.1. Modulabhängigkeiten

Grundsätzlich besteht die häufigste Methode zum Deklarieren einer Abhängigkeit darin, auf ein Repository zu verweisen. Ein Gradle-Repository ist eine Sammlung von Modulen, die nach Gruppe , Name und Version organisiert sind .

Tatsächlich zieht Gradle die Abhängigkeiten aus dem angegebenen Repository innerhalb des Repository- Blocks herunter :

repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter:2.3.4.RELEASE' }

4.2. Dateiabhängigkeiten

Da Projekte nicht immer das automatisierte Abhängigkeitsmanagement verwenden, organisieren einige Projekte Abhängigkeiten als Teil des Quellcodes oder des lokalen Dateisystems. Daher müssen wir den genauen Ort angeben, an dem sich die Abhängigkeiten befinden.

Zu diesem Zweck können wir Dateien verwenden , um eine Abhängigkeitssammlung einzuschließen:

dependencies { runtimeOnly files('libs/lib1.jar', 'libs/lib2.jar') }

In ähnlicher Weise können wir filetree verwenden , um eine Hierarchie von JAR- Dateien in ein Verzeichnis aufzunehmen:

dependencies { runtimeOnly fileTree('libs') { include '*.jar' } }

4.3. Projektabhängigkeiten

Da ein Projekt von einem anderen abhängig sein kann, um Code wiederzuverwenden, bietet Gradle uns die Möglichkeit dazu.

Angenommen, wir möchten erklären, dass unser Projekt vom gemeinsamen Projekt abhängt :

 dependencies { implementation project ( ':shared' ) } 

4.4. Gradle-Abhängigkeiten

In bestimmten Fällen, z. B. beim Entwickeln einer Aufgabe oder eines Plugins, können wir Abhängigkeiten definieren, die zu der von uns verwendeten Gradle-Version gehören:

dependencies { implementation gradleApi() }

5. buildScript

As we saw before, we can declare the external dependencies of our source code and tests inside the dependencies block. Similarly, the buildScript block allows us to declare the Gradle build's dependencies, such as third-party plugins and task classes. Particularly, without a buildScript block, we can use only Gradle out-of-the-box features.

Below we declare that we want to use the Spring Boot plugin by downloading it from Maven Central:

buildscript { repositories { mavenCentral() } dependencies { classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.3.4.RELEASE' } } apply plugin: 'org.springframework.boot'

Hence we need to specify the source from which we'll download external dependencies because there isn't a default one.

What's described above is related to older versions of Gradle. Instead, in newer versions, it's possible to use a more concise form:

plugins { id 'org.springframework.boot' version '2.3.4.RELEASE' }

6. Conclusion

In diesem Artikel haben wir uns mit Gradle-Abhängigkeiten, ihrer Deklaration und den verschiedenen Konfigurationstypen befasst.

Angesichts dieser Punkte ist der Quellcode für diesen Artikel auf GitHub verfügbar.