Gradle
Sissejuhatus
Gradle on ehitusinstrument, mis kasutab samu sõltuvuste halduse ja elutsükli kontseptsioone nagu Maven, kuid asendab XML-i programmeeritava skriptiga. Selle asemel, et kirjeldada projekti staatilises konfiguratsioonifailis, kirjutad skripti Groovy või Kotlini keeles, mis seadistab ja laiendab ehitusprotsessi.
Gradle on Androidi rakenduste arenduses vaikimisi ehitusinstrument ning muutub üha tavalisemaks ka serveripoolsetes Java projektides. Selle peamised eelised Maveni ees on kiirus (inkrementaalsed ehitused, vahemälu) ja paindlikkus (kohandatud ehitus-loogika ilma pistikprogramme kirjutamata).
Minimaalne build.gradle faili näide
Sarnaselt eelmisele peatükile, tutvuge järgneva build.gradle (Groovy DSL)
failiga Java 17 projekti jaoks, mis kasutab Gson-it sõltuvusena:
plugins {
id 'java'
id 'application'
}
application {
mainClass = 'ee.taltech.iti0202.buildtools.Main'
}
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
repositories {
mavenCentral()
}
dependencies {
implementation 'com.google.code.gson:gson:2.10.1'
testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2'
}
test {
useJUnitPlatform()
}
Gradle 9+ ei lisa enam JUnit Platform Launcher'it automaatselt testide classpath'i.
Kui kasutad Gradle 9 või uuemat versiooni, lisa dependencies plokki järgmine rida:
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
Ilma selleta ebaõnnestub testide käivitamine veaga: "Could not start Gradle Test Executor: Failed to load JUnit Platform."
Võrreldes sama funktsionaalsusega pom.xml-iga on siin sama info väljendatud
umbes poole vähemate ridadega ning ilma üleliigse XML-boilerplate’ita.
Pistikprogrammid
Gradle’i funktsionaalsus tuleb pistikprogrammidest. Ilma nendeta ei tea Gradle, kuidas Java koodi kompileerida, teste käivitada või JAR-faile luua. Kasutatavad pistikprogrammid määravad, millised ülesanded (tasks) on saadaval.
Kaks kõige levinumat pistikprogrammi Java projektide jaoks on:
| Pistikprogramm | Kirjeldus. |
|---|---|
java | compileJava, test, jar + src/main/java struktuur |
application | Kõik java-st + run käsklus + mainClass konfiguratsioon |
java pistikprogrammist piisab teekide loomise jaoks.
application pistikprogramm lisab võimaluse projekti otse käivitada käsuga ./gradlew run.
See on kasulik projektide puhul, millel on main-meetod.
Sõltuvused ja konfiguratsioonid
Gradle kasutab Maveni skoopide asemel konfiguratsioone. Vastavus on sarnane:
| Gradle konfiguratsioon | Maveni vaste | Millal sõltuvus saadaval |
|---|---|---|
implementation | compile | Kompileerimisel + käitamisel |
testImplementation | test | Testide kompileerimisel + käitamisel |
compileOnly | provided | Ainult kompileerimisel |
runtimeOnly | runtime | Ainult käitamisel |
Sõltuvuste märgitakse ühe sõnena, kus koordinaadid on eraldatud koolonitega:
implementation 'com.google.code.gson:gson:2.10.1'
// groupId:artifactId:version
Repositooriumid
Erinevalt Mavenist ei eelda Gradle vaikimisi ühtegi repositooriumi. See tähendab, et sõltuvuste otsimiseks peab repositooriumi selgesõnaliselt määrama:
repositories {
mavenCentral()
}
See ütleb Gradle’ile, et sõltuvused tuleb alla laadida Maven Centralist. Lisaks võib lisada ka muid repositooriume, näiteks ettevõttesisesed repositooriumid, Google’i Androidi repositooriumi või teised.
Gradle Wrapper
Enamik Gradle’i projekte sisaldab wrapper’it — väikest skripti (gradlew Linuxis/macOS-is, gradlew.bat Windowsis),
mis laadib alla ja kasutab kindlat Gradle’i versiooni.
See tagab, et kõik, kes projekti ehitavad, kasutavad täpselt sama Gradle’i versiooni,
sõltumata sellest, mis versioon nende süsteemi on paigaldatud.
./gradlew build # instead of: gradle build
Kasuta alati ./gradlew käsku, mitte süsteemi paigaldatud gradle käsku.
Wrapper tagab reprodutseeritavad ehitusprotsesse.
Wrapper’i konfiguratsiooni leiad failist gradle/wrapper/gradle-wrapper.properties, kus on määratud Gradle’i versioon.
Levinud käsklused
| Käsklus | Kirjeldus. |
|---|---|
./gradlew build | Kompileerib, käivitab testid, loob JAR faili |
./gradlew run | Kompileerib ja käivitab mainClass (vajab application-i) |
./gradlew test | Kompileerib ja käivitab testid |
./gradlew clean | Kustutab build/ kataloogi |
./gradlew tasks | Kuvab kõik olemasolevad ülesanded |
./gradlew dependencies | Kuvab sõltuvuste puu |
build/ kataloog on Gradle vaste of Maveni target/ kataloogile.
Inkrementaalne ehitamine
Üks Gradle’i peamisi eeliseid on inkrementaane ehitamine.
Kui käivitad ./gradlew build kaks korda järjest ilma midagi muutmata,
on teine käivitamine peaaegu hetkeline.
Iga ülesanne (task) annab ühe järgmistest olekutest:
| Status | Meaning |
|---|---|
| (tühjus) | Ülesanne käivitati tavapäraselt |
UP-TO-DATE | Sisendid ja väljundid pole muutunud - ülesanne jäeti vahele |
FROM-CACHE | Väljund taastati vahemälust |
SKIPPED | Ülesanne on keelatud või tingimus ei olnud täidetud |
Gradle jälgib iga ülesande sisendeid ja väljundeid. Kui ülesande sisendid pole muutunud ja selle väljundid on endiselt olemas, jäetakse ülesanne täielikult vahele. See on oluline suurte projektide puhul, kus täielik ehitusprotsess võib võtta minuteid.
Gradle ja Maveni võrdlus
| Aspekt | Maven | Gradle |
|---|---|---|
| Konfiguratsiooni vorm | XML (pom.xml) | Groovy/Kotlin DSL (build.gradle) |
| Filosoofia | Convention over configuration | Konventsioon + programmeeritavus |
| Inkrementaalne ehitamine | Piiratud | Täielik tugi sisendite/väljundite jälgimisega |
| Vahemälu | Sisseehitatud vahemälu puudub | Kohalik ja kaug-vahemälu |
| Kohandatud ehitusloogika | Vajab plugina kirjutamist | Saab kirjutada otse build.gradle-is |
| Õpikõver | Madalam — kindel struktuur, vähem õppida | Kõrgem — võimsam, rohkem mõista |
| Ökosüsteem | Suurem pluginate ökosüsteem | Kasvav, Androidi vaikimisi tööriist |
Kumbki tööriist pole universaalselt parem. Maveni jäikus on eelis, kui soovid etteaimatavat ja standardset lõpptoodet. Gradle’i paindlikkus on eelis, kui vajad kohandatud käitumist või kiiremaid ehitisi.