Liigu peamise sisu juurde

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()
}
hoiatus

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:

PistikprogrammKirjeldus.
javacompileJava, test, jar + src/main/java struktuur
applicationKõ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 konfiguratsioonMaveni vasteMillal sõltuvus saadaval
implementationcompileKompileerimisel + käitamisel
testImplementationtestTestide kompileerimisel + käitamisel
compileOnlyprovidedAinult kompileerimisel
runtimeOnlyruntimeAinult 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
nõuanne

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äsklusKirjeldus.
./gradlew buildKompileerib, käivitab testid, loob JAR faili
./gradlew runKompileerib ja käivitab mainClass (vajab application-i)
./gradlew testKompileerib ja käivitab testid
./gradlew cleanKustutab build/ kataloogi
./gradlew tasksKuvab kõik olemasolevad ülesanded
./gradlew dependenciesKuvab 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:

StatusMeaning
(tühjus)Ülesanne käivitati tavapäraselt
UP-TO-DATESisendid ja väljundid pole muutunud - ülesanne jäeti vahele
FROM-CACHEVä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

AspektMavenGradle
Konfiguratsiooni vormXML (pom.xml)Groovy/Kotlin DSL (build.gradle)
FilosoofiaConvention over configurationKonventsioon + programmeeritavus
Inkrementaalne ehitaminePiiratudTäielik tugi sisendite/väljundite jälgimisega
VahemäluSisseehitatud vahemälu puudubKohalik ja kaug-vahemälu
Kohandatud ehitusloogikaVajab plugina kirjutamistSaab kirjutada otse build.gradle-is
ÕpikõverMadalam — kindel struktuur, vähem õppidaKõrgem — võimsam, rohkem mõista
ÖkosüsteemSuurem pluginate ökosüsteemKasvav, 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.