Gradle: Quelle est la différence entre classpath et compiler les dépendances?

92

Lors de l'ajout de dépendances à mon projet, je ne suis jamais sûr du préfixe que je devrais leur donner, par exemple "classpath"ou"compile".

Par exemple, mes dépendances ci-dessous doivent-elles être le moment de la compilation ou le chemin de classe?

Aussi, devrait-il être dans mes applications build.gradle ou dans le module build.gradle spécifique?

Build.gradle actuel (au niveau de l'application):

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.hibernate:hibernate-core:5.0.5.Final'
    compile 'mysql:mysql-connector-java:5.1.38'
} 
java123999
la source
1
Je ne suis pas sûr de comprendre. classpathn'est pas une étendue de dépendance valide.
Tunaki
Peut-être que je suis confus, quelles sont les étendues de dépendance valides?
java123999
Jetez un œil à ce document: docs.gradle.org/current/userguide/…
Tunaki
Une chose que j'ai remarquée, c'est que les compileOnlydépendances vont project.configurations.compileClasspathmais pas vers project.configurations.compile, comme mentionné ici github.com/iboyko/gradle-plugins/issues/5
Vytenis Bivainis

Réponses:

47

Je vais deviner que vous faites référence compileet classpathdans le dependencies {}bloc. Si tel est le cas, ce sont des configurations de dépendances .

Une configuration est simplement un ensemble nommé de dépendances.

La compileconfiguration est créée par le plugin Java. La classpathconfiguration est généralement vue dans le buildSrc {}bloc où il faut déclarer les dépendances pour le build.gradle lui-même (pour les plugins, peut-être).

Eric Wendelin
la source
Merci, donc pour mon build.gradle principal, je ne devrais pas avoir besoin d'utiliser classpath?
java123999
@ java123999 Non, sauf si vous utilisez des plugins personnalisés
Eric Wendelin
@EricWendelin Où vous dites "dans le bloc de dépendances {}" voulez-vous dire "dans le bloc de buildscript {dépendances {}}"? (Je ne suis pas sûr, il suffit de demander.)
Paulo Merson
2
Un dependencies {}bloc peut être déclaré à la fois à l'intérieur buildscript {}et à l'extérieur de celui-ci. À l'intérieur, vous utilisez la classpathconfiguration des dépendances nécessaires pour compiler le script de construction lui-même.
Eric Wendelin
55

Si buildscript lui-même a besoin de quelque chose pour s'exécuter, utilisez classpath .

Si votre projet a besoin de quelque chose pour s'exécuter, utilisez compile .

Le buildscript{}bloc est pour le build.gradle lui-même.

Pour la construction multi-projets, le fichier de construction de niveau supérieur est pour le projet racine, le fichier de construction spécifique est pour le sous-projet (module).

Fichier de construction de niveau supérieur dans lequel vous pouvez ajouter des options de configuration communes à tous les sous-projets / modules.

Ne placez pas vos dépendances d'application dans le fichier de construction de niveau supérieur, elles appartiennent aux fichiers build.gradle du module individuel

q ...
la source
Pour confirmer: cela signifie- t- il que proandroiddev.com/… devrait utiliser un compileet non un classpath?
WillC
1
Mais pourquoi ne pas placer les dépendances d'application dans le fichier de niveau supérieur lui-même si le projet ne comporte qu'un seul module, comme les applications Android classiques?
Harsha
18

Si je comprends bien, vous confondez le Project.dependenciesbloc de script avec le Project.buildscript.dependenciesbloc de script (tout comme je l'ai fait lorsque j'ai atteint cette question).

Je vais essayer de répondre avec ce que j'ai trouvé.

Je pense que vous devriez déjà être familier avec le Project.dependenciesbloc de script. Dans ce bloc, nous déclarons les dépendances requises par notre code source. Il existe plusieurs façons de déclarer une dépendance dont nous avons besoin pour le projet. Voir Didacticiel Gradle: types de dépendances . Je ne mentionnerai que la partie la plus pertinente à ce problème:

compile 'org.hibernate:hibernate-core:5.0.5.Final'est une déclaration de dépendance de module. La configuration de compilation (qui est maintenant obsolète par la configuration de l'implémentation.) Est simplement un mot-clé pour Implementation only dependencies.Ce n'est pas un mot-clé décrivant de quel type de dépendance il s'agit (par type ici, je suis les trois types définis dans le tutoriel, à savoir le module, fichier et projet.)

Dans le didacticiel Gradle: organiser la logique de construction, il est dit:

Si votre script de construction doit utiliser des bibliothèques externes, vous pouvez les ajouter au chemin de classe du script dans le script de construction lui-même. Pour ce faire, utilisez la méthode buildscript (), en passant une fermeture qui déclare le chemin de classe du script de construction.

C'est de la même manière que vous déclarez, par exemple, le chemin de classe de compilation Java. Vous pouvez utiliser l'un des types de dépendance décrits dans Types de dépendance, à l'exception des dépendances de projet.

Après avoir déclaré le chemin de classe du script de construction, vous pouvez utiliser les classes dans votre script de construction comme vous le feriez pour toute autre classe sur le chemin de classe.

J'espère que les choses deviennent claires pour vous maintenant.

Avec classpath "com.android.tools.build:gradle:${Versions.android_gradle_plugin}"nous définissons la classpathméthode avec com.android.tools.build:gradle:${Versions.android_gradle_plugin}laquelle une dépendance de module est utilisée par le script de construction lui-même plutôt que par la source de votre projet.

D'un autre côté, compile 'org.hibernate:hibernate-core:5.0.5.Final'nous déclarons une dépendance de module requise pour votre projet avec la configuration de compilation .

tl; dr: Le classpath, compileet implementationsont tous les mots clés qui peuvent être utilisés contre les dépendances dans des circonstances différentes. Le premier est utilisé lorsque vous souhaitez transmettre une dépendance au script de construction, et le second est l'une des configurations que vous voudrez peut-être déclarer.

Teng-pao Yu
la source
1
Bonne réponse. Je dois ajouter que non seulement nous devons regarder les mots-clés eux-mêmes comme ce qui est bien expliqué ci-dessus, mais en outre, nous devons également prendre en considération l'artefact demandé car les mots-clés seuls ne définissent pas le contexte complet. Par exemple, 'org.projectlombok:lombok:1.18.4'n'a pas d' classpathassociation car il s'agit d'un fichier jar qui n'est nécessaire qu'au moment de la compilation javac, mais non nécessaire à l' javaexécution. Par conséquent, une utilisation correcte est une interaction des mots-clés définis et de l'artefact. Cela signifie qu'il faut des connaissances a priori.
eigenfield