Oltre ad essere uno strumento fondamentale per la gestione delle dipendenze ed il build dei progetti, Maven offre diverse caratteristiche interessanti tra le quali la possibilità di gestire file di property con variabili, denotate dal delimitatore ${..}
, che vengono valorizzate al momento del packaging della soluzione.
Resource Folder
Maven introduce una struttura standard delle cartelle di lavoro, tra le quali la cartella delle risorse è quella destinata a contenere tutti i file (non java) che devono essere inserite nel pacchetto finale (ad esempio un JAR). Di default tale cartella è localizzata nella directory src/maven/resources
. Per modificarne il percorso o inserirne di altri è sufficiente configurarli nella sezione <build> del pom.xml:
1 2 3 4 5 6 7 8 9 10 |
<build> <resources> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>resources2</directory> </resource> </resources> </build> |
Per completezza si noti che tale gestione è realizzata dal Maven Resource Plugin, un plugin che non è necessario configurare nel pom.
Filtering
Il filtering delle risorse è la soluzione offerta da Maven per la valorizzazione delle variabili nei file di property. Innanzitutto è necessario dichiarare la risorsa come filtrabile:
1 2 3 4 |
<resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> |
Quindi possiamo inserire le variabili all’interno del file di property di interesse delimitandole con ${...}
e Maven si occuperà di valorizzarle. I valori con cui valorizzare le variabili possono provenire da diverse sorgenti:
Proprietà Implicite
Esistono diverse proprietà definite in modo implicito in un progetto maven, distinte in tre categorie:
project.* |
Referenziano proprietà definite nel pom: |
settings.* |
Referenziano proprietà definite nel file di settings /.m2/settings.xml . |
env.* |
Referenziano le variabili di ambiente: env.PATH , env.HOME , env.JAVA_HOME , etc. |
Proprietà Definite
Nel pom.xml
è possibile definire delle proprietà personalizzate nella sezione <propeteis>
.
1 2 3 |
<properties> <it.javaboss.msg>This is a test</it.javaboss.msg> </properties> |
Filtri
Uno possibile utilizzare un file di assegnazioni valiabile-valore ed utilizzarlo come filtro nella sezione <build>
del pom.
1 2 3 4 5 6 7 8 9 10 11 12 |
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <filters> <filter>src/main/filters/filter.properties</filter> </filters> </build> |
Uso dei Profili
Probabilmente lo strumento più interessante di Maven è l’utilizzo dei profili. Grazie ad essi è possibile sostituire valori differenti nei file di property in base al profilo selezionato. Molto semplicemente è sufficiente utilizzare la sezione <properties>
e/o <filters>
all’interno della definizione del profilo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<profiles> <profile> <id>dev</id> <properties> <it.javaboss.parameter>DEVELOP</it.javaboss.parameter> </properties> <build> <filters> <filter>src/main/filters/filter-dev.properties</filter> </filters> </build> </profile> <profile> <id>prod</id> <properties> <it.javaboss.parameter>PRODUCTION</it.javaboss.parameter> </properties> <build> <filters> <filter>src/main/filters/filter-prod.properties</filter> </filters> </build> </profile> </profiles> |
Esempio Pratico
Creiamo un semplice progetto Maven vuoto e strutturiamo la cartella /src
nel seguente modo:
I file nelle cartelle filters
e resources
hanno il seguente contenuto:
config.properties value.from.properties.section=${it.javaboss.msg} value.from.maven.variable=${project.version} value.from.filter.file=${test.value} value.from.profile.param=${it.javaboss.parameter} value.from.profile.filter=${env.value} |
filter.properties test.value=1000 |
filter-dev.properties env.value=DEV |
filter-prod.properties env.value=PROD |
Il file pom.xml
ha invece la seguente struttura.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<project ... > <modelVersion>4.0.0</modelVersion> <groupId>it.javaboss</groupId> <artifactId>maven</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <it.javaboss.msg>This is a test</it.javaboss.msg> </properties> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <filters> <filter>src/main/filters/filter.properties</filter> </filters> </build> <profiles> <profile> <id>dev</id> <properties> <it.javaboss.parameter>DEVELOP</it.javaboss.parameter> </properties> <build> <filters> <filter>src/main/filters/filter-dev.properties</filter> </filters> </build> </profile> <profile> <id>prod</id> <properties> <it.javaboss.parameter>PRODUCTION</it.javaboss.parameter> </properties> <build> <filters> <filter>src/main/filters/filter-prod.properties</filter> </filters> </build> </profile> </profiles> </project> |
A questo punto è sufficiente eseguire l’istruzione mvn clean package -P dev
per ottenere il file config.properties
così valorizzato:
1 2 3 4 5 |
value.from.properties.section=This is a test value.from.maven.variable=0.0.1-SNAPSHOT value.from.filter.file=1000 value.from.profile.param=PRODUCTION value.from.profile.filter=PROD |
Codice Sorgente
Il codice sorgente per l’esempio presentato è scaricabile qui maven.