Cos'è Maven? Build e gestione delle dipendenze per Java

Apache Maven è una pietra angolare dello sviluppo Java e lo strumento di gestione build più utilizzato per Java. Il modello di configurazione semplificato basato su XML di Maven consente agli sviluppatori di descrivere o comprendere rapidamente i contorni di qualsiasi progetto basato su Java, il che semplifica l'avvio e la condivisione di nuovi progetti. Maven supporta anche lo sviluppo basato su test, la manutenzione del progetto a lungo termine e la sua configurazione dichiarativa e un'ampia gamma di plug-in lo rendono un'opzione popolare per CI / CD. Questo articolo è una rapida introduzione a Maven, inclusi il POM di Maven e la struttura delle directory, nonché i comandi per creare il tuo primo progetto Maven.

Si noti che la versione più recente di Maven al momento della stesura di questo articolo è Maven 3.6.3.

Maven contro Ant e Gradle

Maven non è l'unico strumento di compilazione nell'ecosistema Java, sebbene sia il più popolare. Ant, una generazione precedente di strumento di configurazione basato su XML, manca delle pratiche standardizzate e basate sulle convenzioni di Maven e della gestione delle dipendenze, ma offre una flessibilità che non troverai con Maven. Gradle è uno strumento più recente che viene eseguito sull'ecosistema Maven (utilizzando i repository di Maven), ma supporta l'utilizzo di un DSL basato su Groovy o Kotlin per la configurazione. Tutti e tre sono buoni strumenti di costruzione a sé stanti e ciascuno può essere integrato in un processo CI / CD. Ciò che conta è scegliere quello giusto per le proprie esigenze e saperlo utilizzare in modo appropriato.

Come funziona Maven

Come molti ottimi strumenti, Maven prende ciò che una volta era troppo complicato (l'inferno di configurazione) e lo semplifica in parti digeribili. Maven è costituito da tre componenti:

  • Il POM: il file che descrive un progetto Maven e le sue dipendenze.
  • La directory: il formato standardizzato per descrivere un progetto Maven nel POM.
  • Archivi: dove viene archiviato e scoperto il software di terze parti.

Il Maven POM : ogni progetto Java che utilizza Maven ha un file POM (project object model) nella sua directory principale. La pom.xmldescrive le dipendenze del progetto e ti dice come costruirlo. (Le dipendenze sono software di terze parti richiesto dal progetto. Alcuni esempi comuni sono JUnit e JDBC. Vedere il Maven Central Repository per un elenco di tutti gli strumenti disponibili e le dipendenze più diffuse.)

La directory Maven : la directory Maven implementa la cosiddetta convenzione sulla configurazione , un'elegante soluzione all'inferno della configurazione. Piuttosto che richiedere agli sviluppatori di definire il layout e configurare manualmente i componenti per ogni nuovo progetto (come nel caso di makefilee Ant), Maven istituisce una struttura di progetto comune e offre un formato di file standard per descrivere come funziona. Devi solo collegare i tuoi requisiti e Maven chiama le dipendenze e configura il progetto per te.

Repository centralizzati : infine, Maven utilizza repository centralizzati sia per scoprire che per pubblicare i pacchetti del progetto come dipendenze. Quando fai riferimento a una dipendenza nel tuo progetto, Maven la scoprirà nel repository centralizzato, la scaricherà in un repository locale e la installerà nel tuo progetto. Il più delle volte, tutto questo è invisibile per te come sviluppatore.

Accesso alle dipendenze di Maven

Per impostazione predefinita, Maven risolve le dipendenze dal Maven Central Repository. Un'alternativa comune è JCenter, che ha un set più ampio di pacchetti disponibili. Le organizzazioni pubblicano e ospitano anche archivi interni, che possono essere pubblici o privati. Per accedere a un repository, specificarne l'URL nel Maven POM, oppure puoi istruire Maven a cercare in altri repository.

Installazione di Maven

Maven è un progetto Java, quindi prima di installarlo dovrai avere JDK installato nel tuo ambiente di sviluppo. (Vedere "Che cos'è JDK? Introduzione a Java Development Kit" per ulteriori informazioni sul download e l'installazione di JDK.)

Dopo aver configurato l'ambiente di sviluppo Java, puoi installare Maven in pochi passaggi:

  1. Scarica l'ultima versione di Maven (Maven 3.6.3 al momento della stesura di questo documento).
  2. Estrai il apache.mavenfile .zip in una posizione comoda.
  3. Metti quel file sul tuo percorso. Ad esempio, su un sistema Unix o Linux: esporta PATH=$PATH:/home/maven/.

Ora dovresti avere accesso al mvncomando. Digita mvn -vper assicurarti di aver installato correttamente Maven.

Il Maven POM

La radice di ogni progetto Maven è il pom.xmlfile. Nonostante la sua reputazione di essere noioso, XML in realtà funziona abbastanza bene per questo caso d'uso. Il POM di Maven è facile da leggere e rivela gran parte di ciò che sta accadendo in un progetto. (Se hai lavorato con JavaScript, lo pom.xmlscopo è simile al package.jsonfile di Node NPM .)

Il listato 1 mostra un Maven molto semplice pom.xml.

Listato 1. POM Maven semplice

   4.0.0 com.javaworld what-is-maven 1.0-SNAPSHOT Simple Maven Project jar   junit junit 4.12 test    

Capire il Maven POM

Una volta capito, il POM non è misterioso. Per iniziare, puoi scorrere il preambolo XML, che fa semplicemente riferimento allo schema POM ufficiale. Notare tuttavia l'XML che inizia con modelVersion. Questo dice a Maven quale versione del POM usare, in questo caso Maven POM 4.0.0.

Successivamente, si hanno groupId, artifactIde version. Insieme, questi tre attributi identificano in modo univoco ogni risorsa gestita da Maven nel repository. Questi attributi nella parte superiore del file descrivono il tuo progetto Maven.

Ora, dai un'occhiata alla dependenciessezione del POM, dove descriviamo le dipendenze del progetto. In questo caso finora abbiamo inserito solo una dipendenza, JUnit. Si noti che JUnit è anche descritta in termini di groupId, artifactIde version.

Sia che tu stia descrivendo il tuo progetto o una dipendenza del progetto, questi valori indicano costantemente a Maven dove trovare un progetto nel repository Maven e quale versione è disponibile per l'uso.

Ospitare il tuo progetto in un repository Maven

Tieni presente che il POM definisce tutto ciò di cui il tuo progetto ha bisogno per essere eseguito, ma descrive anche il tuo progetto come una potenziale dipendenza. Se stai costruendo un progetto che sarà una dipendenza, ad esempio creando una libreria per altri progetti da utilizzare, dovrai renderlo disponibile in uno dei quattro modi seguenti:

  1. Rendilo disponibile localmente.
  2. Pubblica su un repository remoto gestito privatamente.
  3. Pubblica in un repository privato basato su cloud.
  4. Pubblica su un repository pubblico come Maven Central.

Nel primo caso, non utilizzi affatto un repository remoto. Invece, altri sviluppatori scaricheranno e installeranno il tuo progetto localmente nel loro repository Maven, usando il mvn installcomando.

Nel secondo caso, utilizzi un repository Maven ospitato, utilizzando un server controllato privatamente per pubblicare e scaricare le dipendenze. Per questo è necessario un gestore di repository, come Apache Archiva.

Un'alternativa più recente è quella di utilizzare un repository remoto privato, ma fare affidamento su un servizio basato su cloud per gestirlo, ad esempio Cloudsmith. Ciò offre il vantaggio delle dipendenze ospitate in remoto senza il lavoro di installare un server repo. Quel servizio è a pagamento, ovviamente.

Infine, una piccola percentuale di progetti finirà nel Central Maven Repository o JCenter, che sono destinati a pacchetti pubblici ampiamente utilizzati. Se stai creando una dipendenza open source per essere utilizzata da altri, avrai bisogno di uno di questi repository centralizzati per rendere il tuo lavoro disponibile al mondo.

  • Scopri di più sull'hosting del tuo progetto in un repository Maven e ottieni un elenco dei repository disponibili.
  • Consulta la documentazione ufficiale di Maven sul plug-in di rilascio Maven, utilizzato per preparare e gestire il software pubblicato in un repository Maven.

Compila il pacchetto Maven

Se crei il pom.xmldal Listato 1 e lo metti in una directory, sarai in grado di eseguire comandi Maven su di esso. Maven ha una moltitudine di comandi e altri sono disponibili tramite plug-in, ma per iniziare devi conoscerne solo una manciata.

Per il tuo primo comando, prova a eseguire mvn package. Anche se non hai ancora alcun codice sorgente, l'esecuzione di questo comando dice a Maven di scaricare la dipendenza JUnit. Puoi controllare l'output di registrazione di Maven per vedere che la dipendenza è stata caricata.

Ambito di dipendenza

Potresti aver notato che la dipendenza JUnit nell'esempio POM è contrassegnata come scope test. L'ambito è un concetto importante nella gestione delle dipendenze, che consente essenzialmente di definire e limitare il modo in cui ciascuna dipendenza verrà chiamata e utilizzata nel progetto. L' testambito garantisce che la dipendenza sia disponibile durante l'esecuzione dei test, ma non quando l'app è inclusa nel pacchetto per la distribuzione.

Un altro ambito comune è provided, che indica al framework che la dipendenza è fornita dall'ambiente di runtime. Questo è spesso visto con i JAR servlet durante la distribuzione in un contenitore servlet, poiché il contenitore fornirà quei JAR. Vedere la documentazione di Apache Maven per un elenco completo degli ambiti di dipendenza di Maven.

La struttura delle directory di Maven

Al termine del comando, notare che Maven ha creato una /targetdirectory. Questa è la posizione standard per l'output del progetto. Le dipendenze scaricate risiederanno nella /targetdirectory, insieme agli artefatti dell'applicazione compilata.

Successivamente si desidera aggiungere un file Java, che verrà inserito nella src/directory Maven . Crea un /src/main/java/com/javaworld/Hello.javafile, con il contenuto del Listato 2.

Listato 2. Hello.java

 com.javaworld public class Hello { public static void main(String[] args){ System.out.println("Hello, JavaWorld"); } } 

Il /srcpercorso è lo spot standard per i file sorgente del progetto. La maggior parte dei progetti inserisce i propri file principali /src/main/, con i file Java che vanno nel classpath sotto /java. Inoltre, se desideri includere risorse che non sono codice, come file di configurazione o immagini, puoi utilizzare /src/main/resources. Le risorse in questo percorso verranno aggiunte al classpath principale. I file di test vengono inseriti in /src/test/java.

Per rivedere, ecco alcune parti chiave della struttura di un progetto Maven (come definito dalla struttura di directory standard Maven):

Parti chiave della struttura delle directory standard di Maven

pom.xml Il file descrittore del progetto
/ src / main / java Posizione dei file di origine
/ src / main / resources Posizione delle risorse non di origine
/ src / test / java Posizione dei file di origine del test
/bersaglio Posizione dell'output di compilazione

Gestire il tuo progetto Maven

Il mvn packagecomando ordina a Maven di raggruppare il progetto. Emetti questo comando quando sei pronto per raccogliere tutti i file di progetto in un unico posto. Ricorda che nel file POM per questo progetto, abbiamo impostato il tipo jardi pacchetto su essere , quindi questo comando dice a Maven di impacchettare i file dell'applicazione in un JAR.

Maven offre una varietà di opzioni aggiuntive per controllare come viene gestito il JAR, indipendentemente dal fatto che si tratti di un JAR grasso o sottile, e per specificare un eseguibile mainclass. Consulta i documenti di Maven per saperne di più sulla gestione dei file in Maven.

Dopo aver raggruppato un progetto, probabilmente vorrai emettere un file mvn install. Questo comando inserisce il progetto nel repository Maven locale. Una volta che è nel repository locale, è disponibile per altri progetti Maven nel tuo sistema locale. Ciò è utile per gli scenari di sviluppo in cui tu e / o il tuo team state creando file JAR di dipendenza non ancora pubblicati in un repository centrale.

Comandi Maven aggiuntivi

Inserisci mvn testquando sei pronto per eseguire gli unit test che hai definito nella /src/java/testdirectory.

Entra mvn compilequando sei pronto per compilare i file di classe del progetto. Se stai eseguendo una configurazione di distribuzione a caldo, questo comando attiva il programma di caricamento classi per la distribuzione a caldo. (Lo strumento di distribuzione a caldo, come il mvn spring-boot:runcomando di Spring Boot, controllerà i file di classe per le modifiche e la compilazione comporterà la compilazione dei file sorgente e l'applicazione in esecuzione rifletterà tali modifiche.)

Avvio di un nuovo progetto: Archetypes in Maven and Spring

Un archetipo Maven è un modello per l'avvio di nuovi progetti basati su una varietà di impostazioni predefinite. Ogni archetipo offre dipendenze preconfezionate, come per un progetto di applicazione Web Java EE o Java. Puoi anche creare un nuovo archetipo da un progetto esistente, quindi usarlo per creare rapidamente nuovi progetti basati su quei layout predefiniti. Consulta i documenti di Maven per saperne di più sugli archetipi di Apache Maven.

Il framework Spring, che funziona bene con Maven, offre funzionalità aggiuntive e sofisticate per eliminare nuovi progetti. Ad esempio, Spring Initializr è uno strumento che ti consente di definire molto rapidamente gli elementi che desideri in una nuova app. Initializr non è un archetipo Maven, di per sé, ma ha lo stesso scopo di generare un layout di progetto basato su specifiche iniziali. Dall'interno di Initializr, puoi digitare mvn archetype:generatee scorrere le opzioni per trovare un archetipo adatto a ciò che stai costruendo.

Aggiunta di dipendenze