Creare un plugin con Maven

Maven è uno dei sistemi di build più noti per lo sviluppo di applicazioni Java. Aggiungere un comportamento specifico per la nostra build può essere più semplice di quello che sembra, creando quello che viene chiamato plugin.

I plugin Maven sono quella miriade di programmi che vengono utilizzati durante la fase di build per fare tutto ciò che gira intorno a questa fase, come quelli riportati per esempio nella seguente lista

  1. maven-surefire-plugin : plugin che viene utilizzato per default nella fase di esecuzione degli unit test
  2. maven-resources-plugin : gestisce la copia/filtraggio/esclusione delle risorse (cartelle resources) del nostro progetto
  3. maven-jar-plugin : crea il pacchetto jar
  4. maven-war-plugin : crea il pacchetto war
  5. maven-release-plugin : utilizzato per effettuare i rilasci nel proprio SCM e preparare il relativo tag

In realtà proprio lo stesso Maven può essere considerato come una serie di plugin messi tutti insieme che permettono di gestire tutto il ciclo di vita di un progetto. Il componente base di ogni plugin, ovvero la singola classe che verrà eseguita a fronte di uno specifico goal, è quello che viene chiamato MOJO (come POJO con Maven al posto di Plain). Esistono moltissimi plugin ma può capitare che ci serva quel comportamento particolare a cui nessuno ha mai pensato e quindi conviene capire come realizzarne uno nostro.

Generazione

Per generare lo scheletro del nostro plugin Maven possiamo ovviamente usare un plugin Maven 🙂
Esiste infatti il plugin archetype che può essere usato da riga di comando per generare per il progetto di partenza per il nostro plugin

 

In questo modo viene generato un progetto Maven dove è presente il seguente POM

 

 

e il MOJO d’esempio MyMojo che se richiamato crea un file txt nella directory di output del progetto

 

 

Nei commenti della classe troviamo i metadati che servono per qualificare meglio il nostro plugin ovvero

  1. goal: specifica il goal con il quale potremo richiamare questo MOJO
  2. phase: la fase di default a cui verrà associato questo goal, che potrebbe anche essere sovrascritta

A questa classe d’esempio viene inoltre passata l’informazione relativa alla build directory, utilizzando anche in questo caso un metadato @parameter expression=”${project.build.directory}” riportato prima della variabile che conterrà quest’informazione. Proviamo quindi a compilare il progetto e successivamente a richiamare il plugin da riga di comando con la sintassi mvn GROUPID:ARTIFACTID:GOAL

 

 

Andando nella directory di output troveremo il file touch.txt creato dal nostro plugin.

 

Mojo con annotation

Le stesse informazioni che vengono gestite tramite i metadati che abbiamo visto nell’esempio base, possono essere specificate usando alcune annotation. Per fare ciò prima di tutto dobbiamo importare la nuova dipendenza nel progetto

 

poi vediamo un esempio, banale più o meno come il precedente, dove andiamo a stampare un Hello World

 

 

Abbiamo definito solo il goal utizzando l’annotation Mojo e invece per quanto riguarda la variabile msg prendiamo il valore definito dalla variabile d’ambiente msg, ma abbiamo definito anche un valore di default. Provando quindi a lanciare il progetto prima senza nessun parametro e poi con un semplice parametro passato dalla console (avremmo lo stesso risultato anche definendo il plugin in un altro progetto e inserendo nella configurazione la variabile msg)

 

 

Generare ulteriori risorse

Per provare a creare qualcosa di leggermente più complesso di un Hello World possiamo vedere il seguente MOJO. Maven già all’interno del MANIFEST riporta alcune informazioni relative alla build, però potremmo aver bisogno di riportare alcune informazioni custom che potrebbero esserci utili in seguito.

 

In questo esempio definiamo la fase di default in cui verrà lanciato il MOJO (generate resources) e andiamo semplicemente a create un file testuale con qualche informazione che finirà nel pacchetto finale. Ora per utilizzare questo plugin in un nostro progetto possiamo configurarlo nel seguente modo

 

 

Nel progetto Github di seguito è possibile vedere questi semplici esempi che sono stati riportati, ma ovviamente per creare degli esempi più interessanti dovreste pensare principalmente alle necessità che avete nei vostri progetti e cercare di riportarle all’interno si un semplice plugin Maven

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *