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'
}
java
gradle
dependencies
java123999
źródło
źródło
classpath
nie jest prawidłowym zakresem zależności.compileOnly
zależności idą,project.configurations.compileClasspath
ale nieproject.configurations.compile
, jak wspomniano tutaj github.com/iboyko/gradle-plugins/issues/5Odpowiedzi:
Idę się domyślić, że jesteś przedstawieniu
compile
iclasspath
wewnątrzdependencies {}
bloku. Jeśli tak jest, są to konfiguracje zależności .compile
Konfiguracja jest tworzona przez wtyczkę Java.classpath
Konfiguracja jest często spotykany wbuildSrc {}
bloku, w którym trzeba deklarować zależności do build.gradle, sam (dla wtyczek, chyba).źródło
dependencies {}
Blok może zostać uznane zarówno wewnątrzbuildscript {}
jak i poza nim. Będąc w środku, używaszclasspath
konfiguracji dla zależności potrzebnych do skompilowania samego skryptu kompilacji.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
źródło
compile
a nieclasspath
?Jeśli dobrze rozumiem, mylisz
Project.dependencies
blok skryptu z blokiemProject.buildscript.dependencies
skryptu (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.dependencies
blok 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 dlaImplementation 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:
Mam nadzieję, że teraz wszystko jest dla ciebie jasne.
Dzięki temu
classpath "com.android.tools.build:gradle:${Versions.android_gradle_plugin}"
ustawiamyclasspath
metodę,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
,compile
iimplementation
są 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ć.źródło
'org.projectlombok:lombok:1.18.4'
nie maclasspath
powiązania, ponieważ jest to plik jar, który jest potrzebny tylko w czasie kompilacji,javac
ale nie jest potrzebny wjava
czasie 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.