In questo articolo voglio descrivere come ho risolto il problema della distribuzione dei propri artefatti; come ho creato un piccolo repository Maven con un spazio Http servito da accesso Ftp. La distribuzione dei propri artefatti è un problema che si affronta quando si incomincia a strutturare il proprio progetto in qualcosa di più grande e non si possiede una infrastruttura aziendale o i requisiti per entrare in un progetto OpenSource.
Un mio amico mi ha detto
Attenzione Ale, che se ti fai prendere la mano da Maven poi non ne puoi fare più a meno
Beh aveva ragione! Ultimamente per lavoro sto apprezzando Maven ed è uno strumento di supporto che calato in un ambiente reale di produzione porta veramente interessanti frutti. Personalmente dopo un piccolo blocco iniziale dovuto al modo diverso di concepire il ciclo di vita del software (io provengo da Ant) i vantaggi di produzione e semplicità presto si sono fatti vedere.
Beh non sono qui a fare il solito elenco dei pro e contro di Maven, esistono milioni di altri articoli sicuramente migliori di questo, ma qui ora voglio suggerire come io ho affrontato e risolto quel piccolo problema della distribuzione dei propri artefatti.
In questo breve, incompleto e non esaustivo articolo mi concentrò sull’aspetto della distribuzione dei propri artefatti implementando un semplice, rozzo ma funzionante repository utilizzando un account web accessibile via ftp.
Perché questa necessità?
Di motivi, come al solito, c’è ne possono essere molti, nel mio caso si è presentato quando dovevo risolvere il problema della distribuzione del mio parent pom.
Quando si sviluppa, organizzando il proprio progetto a componenti, risulta molto utile centralizzate tutte le proprietà e le configurazioni in un progetto di tipo modules. Se voglio centralizzare tutte le configurazioni comuni a tutti i progetti che sono tra loro non correlati, in genere si utilizza la tecnica del parent pom.
Ad esempio nel mio caso tutti i progetti possiedono lo stesso skin e struttura del sito, le stesse configurazioni di utenza, le stesse regole di reportistica ed utilizzo dei plug-in comuni ed ormai consolidati. Tutte queste “configurazioni” le ho tutte raggruppate nel mio pom generale e sono evolute nel tempo!
Cosa accade se un mio progetto esce al di fuori del mio local repository (per capirci dal mio ~/.m2/repository/ ) e deve essere compilato da una persona che non possiede il mio paret pom? Le soluzioni sono 3:
- Perdere la natura originale del progetto e riportare tutte le configurazioni del parent pom all’interno del progetto stesso (BLAAAAA!!!!)
- Forzare l’utente a scaricare e compilare anche il mio parent pom ( Io non lo farei mai… )
- Fornire un repository in modo da lasciare l’onere della risoluzione della dipendenza a Maven (mi piace…)
Cosa devo fare e cosa serve?
Io ho sfruttato il più possibile la caratteristica dei distributori di Maven e infine faccio eseguire alla fase di deploy il lavoro di pubblicazione dell’artefatto, come in realtà vuole la specifica. Per poterlo eseguire mi serve solo un account ftp accessibile per me in lettura e scrittura ed accessibile per un utente pubblico tramite un qualunque protocollo gestito dal dependecy manager... nel mio caso http è più che sufficiente visto che utilizzerò proprio lo spazio web di questo sito.
ok… ma cosa devo mettere nel progetto da distribuire?
Tutto inizia dal progetto che si vuole rendere pubblico e che verrà distribuito tramite il proprio repository. Dunque, all’interno del
pom.xml
del progetto Maven basta inserire:
<project> ... <distributionManagement> <repository> <uniqueVersion>false</uniqueVersion> <id>ftp-repository-stable</id> <url>ftp://ftp.staniscia.net/htdocs/repository/release</url> <layout>default</layout> </repository> </distributionManagement> ... <repositories> <repository> <id>staniscia.net-release</id> <url>https://www.staniscia.net/repository/release</url> </repository> </repositories> ... <build> <extensions> <!-- Enabling the use of FTP --> <extension> <groupId>org.apache.maven.wagon</groupId> <artifactId>wagon-ftp</artifactId> <version>2.2</version> </extension> </extensions> ... </build> ... </project>
Questa è la configurazione più semplice che si può utilizzare, in realtà nel mio pom io lo definisco dividendo gli snapshot dalle release; per una trattazione più consona rimando al sito di Maven
… ancora un altro piccolo passo …
Chiaramente eseguita questa modifica sul pom.xml
dobbiamo indicare le credenziali a Maven per eseguire l’FTP; quindi bisognerà modificare il proprio settings.xml
che ospiterà le credenziali di accesso al server ftp.
All’interno del file ~/.m2/settings.xml andiamo ad inserire inserire le seguenti informazioni
<settings ...> ... <servers> <server> <id>ftp-repository-stable</id> <username>my_ftp_username</username> <password>my_ftp_password</password> </server> </servers> ... </settings>
e a questo punto abbiamo finito la configurazione!
Come lo utilizzo?
Nel momento in cui nel nostro pom.xml
viene dichiarata una versione stabile del progetto il comando
mvn deploy
eseguirà l’upload dell’artefatto secondo quanto abbiamo configurato. Questa operazione però non è mai così semplice, spesso assieme al codice bisogna aggiornare il sito, le reportistiche e se il progetto è di tipo modulare bisogna modificare a mane tutti i pom… perché fare a mano queste cose se esistono strumenti che lo eseguono per te? Io vi consiglio di eseguire tutta questa operazione tramite il comodissimo Maven Release Plugin…
WOW ho il mio repository! ma i futuri utenti come lo raggiungono?
Questo repository è alla pari di un qualunque altro repository presente sul web! Quindi proprio come indicato nella guida ufficiale di Maven l’unica cosa da indicare sono le coordinate del vostro nuovo repository; due sono i metodi:
- Nel pom.xml del progetto che vuole includere qualche vostro artefatto inserire le coordinate del repository (BLAAA…)
- Modificare il setting.xml in modo da aggiungere tra i pool dei repository il vostro nuovo repository (o yeaaa!)
<settings> ... <profiles> ... <profile> <id>standard-profile</id> <repositories> ... <repository> <id>staniscia.net-release</id> <url>https://www.staniscia.net/repository/release</url> </repository> .... </repositories> </profile> ... </profiles> <activeProfiles> <activeProfile>standard-profile</activeProfile> </activeProfiles> ... </settings>