Gradle: Jaka jest różnica między ścieżką klas a zależnościami kompilacji?

92

Dodając zależności do swojego projektu, nigdy nie jestem pewien, jaki prefiks powinienem im nadać, np. "classpath"Lub"compile".

Na przykład, czy moje zależności poniżej powinny być czasem kompilacji czy ścieżką klas?

Czy powinno to być również w moich aplikacjach build.gradle czy w konkretnym module build.gradle?

Bieżący build.gradle (na poziomie aplikacji):

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.hibernate:hibernate-core:5.0.5.Final'
    compile 'mysql:mysql-connector-java:5.1.38'
} 
java123999
źródło
1
Nie jestem pewien, czy rozumiem. classpathnie jest prawidłowym zakresem zależności.
Tunaki
Być może jestem zdezorientowany, jakie są prawidłowe zakresy zależności?
java123999
Spójrz na ten dokument: docs.gradle.org/current/userguide/…
Tunaki
Zauważyłem jedną rzecz, że compileOnlyzależności idą, project.configurations.compileClasspathale nie project.configurations.compile, jak wspomniano tutaj github.com/iboyko/gradle-plugins/issues/5
Vytenis Bivainis

Odpowiedzi:

47

Idę się domyślić, że jesteś przedstawieniu compilei classpathwewnątrz dependencies {}bloku. Jeśli tak jest, są to konfiguracje zależności .

Konfiguracja to po prostu nazwany zestaw zależności.

compileKonfiguracja jest tworzona przez wtyczkę Java. classpathKonfiguracja jest często spotykany w buildSrc {}bloku, w którym trzeba deklarować zależności do build.gradle, sam (dla wtyczek, chyba).

Eric Wendelin
źródło
Dzięki, więc dla mojego głównego build.gradle nie powinienem potrzebować ścieżki klas?
java123999
@ java123999 Nie, chyba że używasz niestandardowych wtyczek
Eric Wendelin
@EricWendelin Gdzie mówisz „w bloku {} zależności” czy masz na myśli „wewnątrz bloku {zależności {}} buildscript”? (Nie jestem pewien, tylko pytam.)
Paulo Merson
2
dependencies {}Blok może zostać uznane zarówno wewnątrz buildscript {}jak i poza nim. Będąc w środku, używasz classpathkonfiguracji dla zależności potrzebnych do skompilowania samego skryptu kompilacji.
Eric Wendelin
55

Jeśli sam buildscript potrzebuje czegoś do uruchomienia, użyj classpath .

Jeśli twój projekt potrzebuje czegoś do uruchomienia, użyj kompilacji .

buildscript{}Blok jest dla samego build.gradle.

W przypadku tworzenia wielu projektów plik kompilacji najwyższego poziomu jest przeznaczony dla projektu głównego, a konkretny plik kompilacji jest przeznaczony dla projektu podrzędnego (modułu).

Plik kompilacji najwyższego poziomu, w którym można dodać opcje konfiguracji wspólne dla wszystkich podprojektów / modułów.

Nie umieszczaj zależności aplikacji w pliku kompilacji najwyższego poziomu, należą one do poszczególnych plików build.gradle modułów

q ...
źródło
Aby potwierdzić: czy to oznacza, że proandroiddev.com/… powinno używać a, compilea nie classpath?
WillC
1
Ale dlaczego nie umieścić zależności aplikacji w samym pliku najwyższego poziomu, jeśli projekt ma tylko jeden moduł, jak typowe aplikacje na Androida?
Harsha
18

Jeśli dobrze rozumiem, mylisz Project.dependenciesblok skryptu z blokiem Project.buildscript.dependenciesskryptu (tak jak zrobiłem, kiedy dotarłem do tego pytania).

Spróbuję odpowiedzieć na to, co znalazłem.

Myślę, że powinieneś już znać Project.dependenciesblok skryptu. W tym bloku deklarujemy zależności, które są wymagane przez nasz kod źródłowy. Istnieje kilka sposobów zadeklarowania zależności, których potrzebujemy w projekcie. Zobacz samouczek Gradle: typy zależności . Wspomnę tylko o części, która jest najbardziej istotna dla tego problemu:

compile 'org.hibernate:hibernate-core:5.0.5.Final'jest deklaracją zależności modułu. Konfiguracja kompilacji (która jest teraz przestarzała przez konfigurację implementacji) jest tylko słowem kluczowym dla Implementation only dependencies.Nie jest to słowo kluczowe opisujące, jaki to typ zależności (według typu tutaj śledzę trzy typy zdefiniowane w samouczku, tj. Moduł, plik i projekt).

W samouczku Gradle: Organizowanie logiki kompilacji jest napisane:

Jeśli Twój skrypt kompilacji musi korzystać z bibliotek zewnętrznych, możesz dodać je do ścieżki klas skryptu w samym skrypcie kompilacji. Robi się to za pomocą metody buildscript (), przekazując zamknięcie, które deklaruje ścieżkę klasy skryptu budowania.

W ten sam sposób deklaruje się, na przykład, ścieżkę klas kompilacji języka Java. Możesz użyć dowolnego z typów zależności opisanych w typach zależności, z wyjątkiem zależności projektu.

Po zadeklarowaniu ścieżki klas skryptu kompilacji, możesz używać klas w swoim skrypcie kompilacji tak samo, jak innych klas w ścieżce klas.

Mam nadzieję, że teraz wszystko jest dla ciebie jasne.

Dzięki temu classpath "com.android.tools.build:gradle:${Versions.android_gradle_plugin}"ustawiamy classpathmetodę, com.android.tools.build:gradle:${Versions.android_gradle_plugin}która jest zależnością od modułu, która jest używana przez sam skrypt kompilacji, a nie źródło w twoim projekcie.

Z drugiej strony compile 'org.hibernate:hibernate-core:5.0.5.Final'deklarujemy zależność modułu wymaganą dla twojego projektu z konfiguracją kompilacji .

tl; dr: the classpath, compilei implementationsą wszystkie słowa kluczowe, które mogą być wykorzystane przeciwko zależnościami w różnych okolicznościach. Pierwsza jest używana, gdy chcesz przekazać zależność do skryptu kompilacji, a druga jest jedną z konfiguracji, które możesz chcieć zadeklarować.

Teng-pao Yu
źródło
1
Dobra odpowiedź. Muszę dodać, że nie tylko musimy wpatrywać się w same słowa kluczowe, co zostało ładnie wyjaśnione powyżej, ale dodatkowo musimy również wziąć pod uwagę artefakt, który jest wymagany, ponieważ same słowa kluczowe nie definiują pełnego kontekstu. Na przykład 'org.projectlombok:lombok:1.18.4'nie ma classpathpowiązania, ponieważ jest to plik jar, który jest potrzebny tylko w czasie kompilacji, javacale nie jest potrzebny w javaczasie wykonywania. Dlatego prawidłowe użycie jest wzajemną zależnością zdefiniowanych słów kluczowych i artefaktu. Oznacza to, że potrzebna jest wiedza a priori.
eigenfield,