Gradle: Was ist der Unterschied zwischen Klassenpfad- und Kompilierungsabhängigkeiten?

94

Wenn ich meinem Projekt Abhängigkeiten hinzufüge, bin ich mir nie sicher, welches Präfix ich ihnen geben soll, z. B. "classpath"oder"compile".

Sollten meine folgenden Abhängigkeiten beispielsweise die Kompilierungszeit oder der Klassenpfad sein?

Sollte dies auch in meinen Anwendungen build.gradle oder im modulspezifischen build.gradle sein?

Aktuelles build.gradle (auf Anwendungsebene):

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.hibernate:hibernate-core:5.0.5.Final'
    compile 'mysql:mysql-connector-java:5.1.38'
} 
java123999
quelle
1
Ich bin mir nicht sicher ob ich das verstehe. classpathist kein gültiger Abhängigkeitsbereich.
Tunaki
Vielleicht bin ich verwirrt, was sind die gültigen Abhängigkeitsbereiche?
Java123999
Schauen Sie sich dieses Dokument an: docs.gradle.org/current/userguide/…
Tunaki
Eine Sache, compileOnlydie project.configurations.compileClasspathproject.configurations.compile
mir

Antworten:

47

Ich werde vermuten, dass Sie sich auf compileund classpathinnerhalb des dependencies {}Blocks beziehen . Wenn das so ist, sind solche Abhängigkeit Nachdem Konfigurationen .

Eine Konfiguration ist einfach ein benannter Satz von Abhängigkeiten.

Die compileKonfiguration wird vom Java-Plugin erstellt. Die classpathKonfiguration wird häufig in dem buildSrc {}Block angezeigt, in dem Abhängigkeiten für das build.gradle selbst deklariert werden müssen (möglicherweise für Plugins).

Eric Wendelin
quelle
Danke, also sollte ich für mein Haupt-Build.gradle keinen Klassenpfad verwenden müssen?
Java123999
@ Java123999 Nein, es sei denn, Sie verwenden benutzerdefinierte Plugins
Eric Wendelin
@EricWendelin Wo Sie "innerhalb des Blocks" Abhängigkeiten {} "sagen, meinen Sie" innerhalb des Blocks "Buildscript {Abhängigkeiten {}}"? (Ich bin nicht sicher, nur fragen.)
Paulo Merson
2
Ein dependencies {}Block kann sowohl innerhalb buildscript {}als auch außerhalb deklariert werden . Im Inneren verwenden Sie die classpathKonfiguration für Abhängigkeiten, die zum Kompilieren des Build-Skripts selbst erforderlich sind.
Eric Wendelin
56

Wenn Buildscript selbst etwas zum Ausführen benötigt, verwenden Sie classpath .

Wenn Ihr Projekt ausgeführt werden muss, verwenden Sie compile .

Der buildscript{}Block ist für das build.gradle selbst.

Bei der Erstellung mehrerer Projekte ist die Build-Datei der obersten Ebene für das Stammprojekt und die spezifische Build-Datei für das Unterprojekt (Modul) vorgesehen.

Build-Datei der obersten Ebene, in der Sie Konfigurationsoptionen hinzufügen können, die allen Unterprojekten / Modulen gemeinsam sind.

Platzieren Sie Ihre Anwendungsabhängigkeiten nicht in der Build-Datei der obersten Ebene, sie gehören zu den einzelnen Modul-Build.gradle-Dateien

q ...
quelle
Zur Bestätigung: Bedeutet das, dass proandroiddev.com/… ein compileund kein a verwenden sollte classpath?
WillC
1
Aber warum nicht die Anwendungsabhängigkeiten in der Datei der obersten Ebene selbst platzieren, wenn das Projekt nur ein Modul hat, wie die typischen Android-Anwendungen?
Harsha
18

Wenn ich das richtig verstehe, verwechseln Sie den Skriptblock Project.dependenciesmit dem Project.buildscript.dependenciesSkriptblock (genau wie bei der Beantwortung dieser Frage).

Ich werde versuchen, dies mit dem zu beantworten, was ich gefunden habe.

Ich denke, Sie sollten bereits mit dem Project.dependenciesSkriptblock vertraut sein . In diesem Block deklarieren wir Abhängigkeiten, die von unserem Quellcode benötigt werden. Es gibt verschiedene Möglichkeiten, eine Abhängigkeit zu deklarieren, die wir für das Projekt benötigen. Siehe Gradle-Tutorial: Abhängigkeitstypen . Ich werde nur den Teil erwähnen, der für dieses Problem am relevantesten ist:

compile 'org.hibernate:hibernate-core:5.0.5.Final'ist eine Modulabhängigkeitsdeklaration. Die Kompilierungskonfiguration (die jetzt von der Implementierungskonfiguration nicht mehr unterstützt wird) ist lediglich ein Schlüsselwort für. Implementation only dependencies.Es ist kein Schlüsselwort, das beschreibt, um welche Art von Abhängigkeit es sich handelt (nach Typ folge ich hier den drei im Lernprogramm definierten Typen, dh Modul, Datei und Projekt.)

Im Gradle-Tutorial: Organisieren der Build-Logik heißt es:

Wenn Ihr Build-Skript externe Bibliotheken verwenden muss, können Sie diese dem Klassenpfad des Skripts im Build-Skript selbst hinzufügen. Sie tun dies mit der Methode buildcript () und übergeben einen Abschluss, der den Klassenpfad des Erstellungsskripts deklariert.

Auf diese Weise deklarieren Sie beispielsweise den Java-Kompilierungsklassenpfad. Sie können jeden der unter Abhängigkeitstypen beschriebenen Abhängigkeitstypen verwenden, mit Ausnahme der Projektabhängigkeiten.

Nachdem Sie den Klassenpfad des Erstellungsskripts deklariert haben, können Sie die Klassen in Ihrem Erstellungsskript wie alle anderen Klassen im Klassenpfad verwenden.

Ich hoffe, die Dinge werden Ihnen jetzt klar.

Mit setzen classpath "com.android.tools.build:gradle:${Versions.android_gradle_plugin}"wir eine classpathMethode, bei com.android.tools.build:gradle:${Versions.android_gradle_plugin}der es sich um eine Modulabhängigkeit handelt, die vom Build-Skript selbst und nicht von der Quelle in Ihrem Projekt verwendet wird.

Auf der anderen Seite, mit compile 'org.hibernate:hibernate-core:5.0.5.Final'uns eine Modul Abhängigkeit , die für Ihr Projekt mit der Kompilierung sind erklärt Konfiguration .

tl; dr: Die classpath, compileund implementationsind alle Schlüsselwörter , die gegen Abhängigkeiten unter verschiedenen Umständen verwendet werden kann. Ersteres wird verwendet, wenn Sie eine Abhängigkeit an das Build-Skript übergeben möchten, und letzteres ist eine der Konfigurationen, die Sie möglicherweise deklarieren möchten.

Teng-pao Yu
quelle
1
Gute Antwort. Ich muss hinzufügen, dass wir nicht nur die Schlüsselwörter selbst als das betrachten müssen, was oben gut erklärt wurde, sondern auch das angeforderte Artefakt berücksichtigen müssen, da die Schlüsselwörter allein nicht den vollständigen Kontext definieren. Hat beispielsweise 'org.projectlombok:lombok:1.18.4'keine classpathZuordnung, da es sich um ein JAR handelt, das nur während der Kompilierungszeit, javacaber nicht zur javaLaufzeit benötigt wird. Daher ist die korrekte Verwendung ein Zusammenspiel der definierten Schlüsselwörter und des Artefakts. Das heißt, man braucht a priori Wissen.
Eigenfeld