JavaRush /Java Blog /Random-IT /Una rapida introduzione a Gradle
Viacheslav
Livello 3

Una rapida introduzione a Gradle

Pubblicato nel gruppo Random-IT

introduzione

L'argomento di questa recensione sarà il sistema di compilazione automatica Gradle. In inglese i sistemi di compilazione si chiamano Build Tools . Una rapida introduzione a Gradle - 1Perché è necessario? La creazione manuale di progetti in Java è un processo piuttosto laborioso. È necessario indicare correttamente le librerie e i framework di cui il progetto necessita e da cui dipende il progetto. Qui potete leggere un ottimo articolo su Habré: “ Lavorare con Java dalla riga di comando ”. Prima o poi inizierai a creare alcuni script per automatizzare questo processo. Ora immagina che tutti gli sviluppatori del mondo facciano questo e tutti scrivano di nuovo ciò che qualcuno ha già scritto per il proprio progetto. E poi sono comparsi sistemi di assemblaggio del progetto che automatizzano questo processo. Inoltre, da un lato ti permettono di assemblare un progetto nel modo in cui lo desideri, dall'altro ti mettono a disposizione strumenti più o meno standardizzati. Un'alternativa a Gradle è il sistema di compilazione automatizzato Maven. Questi due sistemi di assemblaggio sono, da un lato, diversi, ma dall'altro presentano numerose somiglianze. C'è materiale su questo argomento sul sito web di Gradle: " Migrating from Maven to Gradle ". Come affermato in questo tutorial, Gradle e Maven hanno una prospettiva diversa su come costruire un progetto. Gradle si basa su un grafico di attività, che possono dipendere l'una dall'altra. Le attività svolgono una sorta di lavoro. Maven utilizza un modello di determinate fasi, a cui sono collegati determinati "obiettivi". Questi obiettivi sono dove viene svolto un po’ di lavoro. Tuttavia, con questi approcci diversi, entrambi i sistemi di compilazione seguono la stessa convenzione e la gestione delle dipendenze è simile. Per iniziare a utilizzare Gradle è necessario scaricarlo. In Google o Yandex inseriamo "Gradle Build Tool" e nei primi risultati vediamo il sito ufficiale: https://gradle.org . Nella pagina principale di Gradle è presente un collegamento con il testo "Docs", che porta alla documentazione di Gradle . Per prima cosa dobbiamo installare (Installa) Gradle, quindi siamo interessati alla sezione " Installazione di Gradle " della documentazione. Esistono molti metodi di installazione, incluso il metodo “vecchio stile”, ovvero manualmente (“ Installazione manuale ”). Secondo le istruzioni, scarica un file del tipo “ solo binario ”, che avrà un nome come gradle-5.1.1-bin.zip. Successivamente, decomprimi l'archivio e configura la variabile d'ambiente PATH secondo le istruzioni. La cosa principale è che dopo aver eseguito le istruzioni, il comando gradle -vmostra la versione di Gradle installata. Potrebbe esserci un problema che quando determina la posizione, il sistema troverà Gradle non dove desideri. Pertanto, su Windows puoi fare (su *nix ci sono analoghi): for %i in (gradle.bat) do @echo. %~$PATH:i ora, forse, possiamo iniziare a fare conoscenza.
Una rapida introduzione a Gradle - 2

Inizializzazione di un progetto Gradle

Vorrei subito notare che Gradle riguarda l'esecuzione di compiti chiamati compiti (li chiamerò compiti). Le attività sono fornite da vari plugin . Ti consiglio di leggere di più sui plugin nella documentazione ufficiale: " Utilizzo dei plugin Gradle ". Esiste una serie di "Plugin core" che sono sempre disponibili quando è installato Gradle. Esistono diverse categorie di questi plugin, ma a noi interessa la categoria " Utilità ". Questo set include il plugin " Build Init Plugin ", che fornisce attività per inizializzare un progetto Gradle. Siamo interessati a creare un tipo di progetto: " applicazione-java ". Eseguiamo l'attività Gradle: gradle init --type java-application rispondiamo ad alcune domande lungo il percorso, ad esempio, che vogliamo utilizzare Groovy DSL (linguaggio di descrizione delle attività standard per Gradle) e il framework di test JUnit (ne parleremo in un'altra recensione). Dopo la creazione riceveremo il seguente set di file:
Una rapida introduzione a Gradle - 3
Innanzitutto, dopo l'inizializzazione riceviamo uno speciale wrapper preconfigurato per la nostra versione di Gradle: si tratta di uno script speciale. Ti consiglio di leggere di più nella documentazione ufficiale - " The Gradle Wrapper ". In secondo luogo, vediamo il Gradle Build Script: il file build.gradle. Questo è il file principale, che descrive quali librerie e framework utilizza il nostro progetto, quali plugin devono essere collegati al progetto e descrive le varie attività. Ti consiglio di leggere di più su questo file nella documentazione ufficiale: " Build Script Basics ".
Una rapida introduzione a Gradle - 4

Plugin e attività

Se guardiamo ora il contenuto del Build Script, vedremo la sezione dei plugin:
plugins {
    id 'java'
    id 'application'
}
Questi sono gli stessi plugin di cui abbiamo parlato prima. E se ci sono plugin, allora ci sono attività che ora sono a nostra disposizione. Possiamo eseguire il comando gradle task e vedere cosa possiamo fare ora con il progetto:
Una rapida introduzione a Gradle - 5
Ad esempio, eseguendo gradle runlanceremo la classe principale della nostra applicazione Java:
Una rapida introduzione a Gradle - 6
Come possiamo vedere qui sotto è scritto lo stesso, 2 actionable tasks: 1 executed, 1 up-to-date cosa significa? Ciò significa che sono state completate in totale 2 attività: inoltre, 1 è stata effettivamente completata e l'altra non è stata eseguita, perché... è aggiornato, cioè lo stato è attuale e non è stato fatto nulla. Possiamo eseguire il cosiddetto "Dry Run": gradle run -m Eseguiamo questo comando, vedremo quali attività verranno eseguite per eseguire l'attività di esecuzione:
Una rapida introduzione a Gradle - 7
Come possiamo vedere, sono state completate un totale di 4 attività: prima di essere eseguita, run ha eseguito le classi di attività di dipendenza. La classe stessa ha 2 dipendenze e quindi ha eseguito anche compileJava e processResources. Quando eseguiamo un'attività, possiamo eseguirla visualizzando un certo livello di log (il livello di registrazione determina quanto siano importanti i messaggi che vogliamo vedere). Ad esempio, possiamo fare gradle run -i. Questo ci mostrerà anche messaggi informativi come:
Task :classes UP-TO-DATE
Skipping task ':classes' as it has no actions.
Per maggiori informazioni sul logging in Gradle, ti consiglio di fare riferimento alla documentazione ufficiale: " Gradle Logging ". Come possiamo vedere, l'attività della classe è stata saltata perché è UP-TO-DATE , cioè lo stato è attuale, non è necessario fare nulla, quindi non c'erano azioni. Questo perché per impostazione predefinita Gradle ha " Controlli aggiornati " o la cosiddetta build incrementale. Puoi leggere ulteriori informazioni su questo meccanismo nella documentazione di Gradle: " Controlli aggiornati (AKA Incremental Build) ". Ma questo meccanismo può essere disabilitato eseguendo un'attività specificando il flag --rerun-tasks. Per esempio, gradle run --rerun-tasks. Quindi vedremo: 2 attività eseguibili: 2 eseguite Come puoi vedere, il numero di attività eseguite tiene conto solo del primo livello del grafico, ovvero l'attività eseguita stessa e quelle attività da cui dipende direttamente, ovvero , classi. Le attività da cui dipendono le classi non vengono conteggiate qui (anche se vengono eseguite quando viene eseguita l'attività delle classi). Dovresti anche leggere le attività:
Una rapida introduzione a Gradle - 8

Dipendenze

Uno dei compiti principali di qualsiasi sistema di compilazione è la gestione delle dipendenze, ovvero di quali librerie/framework ha bisogno il nostro progetto. Il sistema di build deve garantire che siano disponibili al momento giusto e assemblare l'artefatto finale della nostra applicazione nel modo giusto. Per impostazione predefinita, dopo gradle init per l'applicazione Java, vedremo il seguente contenuto nello script di build:
dependencies {
    implementation 'com.google.guava:guava:26.0-jre'
    testImplementation 'junit:junit:4.12'
}
Qui è subito chiaro cosa stiamo collegando. Ma senza una certa comprensione, non è chiaro cosa siano l'implementazione e il testImplementation? Qui dobbiamo tornare nuovamente alla documentazione di Gradle, poiché la documentazione di Gradle è ben scritta. Si chiama " Gestione delle configurazioni delle dipendenze ". Come indicato nella documentazione, ogni dipendenza viene dichiarata con un determinato ambito: l'area all'interno della quale questa dipendenza sarà disponibile. Questo ambito è designato da alcune configurazioni, ognuna delle quali ha un nome univoco. È anche interessante notare che molti plugin Gradle aggiungono configurazioni predefinite. Per scoprire quali configurazioni abbiamo possiamo eseguire: gradle --console plain dependencies In questo modo vedremo un elenco di tutte le configurazioni disponibili e le loro dipendenze. Possiamo filtrare questo elenco in modo da vedere solo le configurazioni disponibili: gradle --console plain dependencies | find " - " come facciamo a sapere cosa usare? Dovrai leggere un po' qui. Perché Utilizziamo il plugin "Java", quindi iniziamo con la sua documentazione e la sezione " Gestione delle dipendenze ". Qui vediamo che esisteva una configurazione (nota anche come scope) chiamata "compile" e significava "dipendenza necessaria durante la compilazione". Ma poi è stato sostituito (in inglese Superseded) con l'implementazione. Puoi leggere ulteriori informazioni sulla sostituzione nella sezione " Separazione API e implementazione ". Si scopre che questa dipendenza sarà sul "percorso di classe di compilazione". Ma a volte vogliamo che la nostra dipendenza sia inclusa nell'artefatto finale. Per quello? Ad esempio, avremo un jar eseguibile, che dovrebbe contenere a sua volta tutto il necessario. Cosa dovremmo fare allora? In primo luogo, non esiste un supporto di questo tipo “pronto all'uso” (ovvero, per impostazione predefinita, senza alcuna azione aggiuntiva). Ciò è spiegato dal fatto che ognuno vuole raccogliere l'archivio a modo suo e Gradle cerca di essere minimalista. Inoltre, non possiamo utilizzare gli archivi jar sul classpath (senza ulteriori manipolazioni nel codice), perché non funziona in questo modo (vedere " Oracle: aggiunta di classi al percorso di classe del file JAR " per maggiori dettagli). Pertanto, il modo più bello è il seguente codice nello script di build:
jar {
    manifest {
        attributes 'Main-Class': 'jrgradle.App'
    }
    from configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
Nelle impostazioni dell'attività jar specifichiamo cosa verrà aggiunto al manifest del file jar (vedi " Oracle: impostazione del punto di ingresso di un'applicazione "). E poi diciamo che tutte le dipendenze necessarie per la compilazione verranno incluse nel jar. Un'alternativa è utilizzare il " Gradle Shadow Plugin ". Può sembrare complicato, ma altri plugin possono semplificarti la vita. Ad esempio, quando creiamo un'applicazione web (al contrario di una normale applicazione Java in esecuzione), utilizzeremo un plugin speciale - " Gradle War Plugin ", che ha un comportamento diverso e lì la nostra vita sarà più semplice (tutte le dipendenze necessarie verranno essere inserito in una directory speciale separata dal plugin stesso. Tale lavoro è regolato da come dovrebbero essere strutturate le applicazioni web. Ma questa è una storia completamente diversa).
Una rapida introduzione a Gradle - 9

Risultati

Gradle è una scelta eccellente per i sistemi di creazione di progetti. Ciò è confermato dal fatto che viene utilizzato dagli sviluppatori di progetti noti come Spring e Hibernate. Sopra sono state discusse solo le cose più basilari. Dietro di loro si nascondono un milione di funzionalità e opportunità a disposizione degli sviluppatori. Gradle supporta anche la creazione di progetti multi-modulo, che non è trattato in questa recensione, ma Gradle stesso ha un eccellente tutorial: " Creazione di build multi-progetto ". Spero che questa recensione dimostri anche che la documentazione di Gradle è scritta in 5+ e puoi trovare facilmente ciò di cui hai bisogno se capisci dove cercare. E questo avverrà quando capirai le basi. Inoltre, Gradle ha ottimi tutorial. Vorrei concludere con un piccolo elenco di cos'altro puoi vedere usando Gradle:
Una rapida introduzione a Gradle - 10
#Viacheslav
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION