Introduzione
Con questo articolo si conclude la presentazione di uno dei principali componenti di Maven: il file pom.xml (Project Object Model, modello ad oggetti del progetto). Che, come visto nel corso dell'articolo precedente, contiene i meta-dati del progetto memorizzati utilizzando il formato xml. La struttura di questo file è molto articolata e spesso di non immediata comprensione. Tuttavia ciò non deve spaventare, sia perché non è necessario impostare, per ogni progetto, tutte i vari elementi, sia perché Maven fornisce una serie di comportamenti di default utilizzabili per la maggior parte dei progetti. Inoltre, una volta preparati i vari file POM per un progetto, è possibile adattarli per i successivi con minime variazioni. Infine, nel corso dell'ultimo anno si è assistito ad un proliferare di ambienti grafici e plug-in Maven che ne semplificano ulteriormente l'utilizzo. La ricchezza del file POM, per molte persone, rappresenta invece un punto di forza in quanto offre tantissimi punti in cui è possibile alterare il comportamento di default di Maven. Pertanto, questa elevata versatilità, se da un lato può presentare un rallentamento dell'iniziale apprendimento, dall'altro dovrebbe conferire un certo grado di sicurezza: è difficile trovarsi di fronte a scenari di build, non previsti o di fronte ad integrazioni/problematiche, non gestibili dalla struttura del POM. Questo articolo conclude la presentazione avviata nel corso del precedente. In particolare, sono illustrate i seguenti componenti: la sezione con le informazioni supplementari del progetto, le impostazioni d'ambiente e le impostazioni proprie di Maven.
More information (ulteriori informazioni)
La sezione delle informazioni supplementari ha un ruolo quasi esclusivamente descrittivo: è possibile specificare informazioni aggiuntive come il nome interno del progetto, la descrizione, l'URL di riferimento, etc. che Maven si limita a riportare nei vari report senza attribuirne alcun valore semantico.
<< figura1.ext - Figura 1 - Rappresentazione grafica della sezione delle informazioni supplementari >>
<< figura1.ext - Figura 1 - Rappresentazione grafica della sezione delle informazioni supplementari >>
Informazioni generali del progetto
Questa sezione prevede i seguenti elementi:
- name: permette di specificare il nome "interno" del progetto utilizzato dal team di sviluppo. Non è infrequente il caso in cui un progetto preveda un nome diverso da quello specificato nel campo artifactId. Per esempio, le varie versioni del JDK Java, oltre al nome ufficiale, prevedono come nome interno il nome di un animale. Per esempio, Java 6 è stato denominato Delphine
- description: in questo campo si può impostare una breve descrizione del progetto. Non si tratta assolutamente di una sostituzione della documentazione ufficiale, bensì permette di specificare un breve commento ad uso e consumo del POM
- inceptionYear: indica l'anno di avvio/ideazione del progetto.
License (licenze)
I file delle licenze rappresentano documenti legali che sanciscono importanti accordi, per esempio come e quando i relativi progetti, o loro parti, possano essere utilizzati. Informazioni del genere, chiaramente, non sono di alcun interesse per il framework Maven che si limita a riportarle nel sito generato. Per ogni singola licenza, è possibile specificare: name, url, comments e distribution. Mentre il significato dei primi tre campi dovrebbe essere immediato, per quanto attiene al campo distribution è necessario evidenziare che si tratta di un campo enumerato in cui è possibile impostare uno dei seguenti due valori: repo e manual. Il primo indica che il progetto prevede la possibilità di essere scaricato da un repository di Maven, mentre il secondo indica l'obbligatorietà di un'installazione manuale. Si veda il seguente listato:
<licenses>
<license>
<name>Apache 2</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
<comments>A business-friendly OSS license</comments>
</license>
</licenses>
Organization
<project>
...
<organization>
<name>MokaByte</name>
<url>www.mokabyte.it</url>
</organization>
</project>
Developers
<project>
...
<developers>
<developer>
<id>LucaVT</id>
<name>Luca Vetti Tagliati</name>
<email>Luca_V_T@yahoo.it</email>
<url>http://LucaVettiTagliati.co.uk</url>
<organization>Mokabyte</organization>
<organizationUrl>www.Mokabyte.it</organizationUrl>
<roles>
<role>project manager</role>
<role>senior architect</role>
<role>senior developer</role>
</roles>
<timezone>0</timezone>
<properties>
<picUrl>http://www2.mokabyte.it/cms/writer-popup.run?id=i_YKY-6Z5-H61-OVT_7f000001_17035775_5b5429af</picUrl>
</properties>
</developer>
</developers>
...
</project>
Issue Management
<project>
...
<issueManagement>
<system>Jira</system>
<url>http://127.0.0.1/Jira</url>
</issueManagement>
...
</project>
Continuous Integration Management
<project>
...
<ciManagement>
<system>continuum</system>
<url>http://127.0.0.1:8080/continuum</url>
<notifiers>
<notifier>
<type>mail</type>
<sendOnError>true</sendOnError>
<sendOnFailure>true</sendOnFailure>
<sendOnSuccess>false</sendOnSuccess>
<sendOnWarning>false</sendOnWarning>
<configuration>
<address>continuum@127.0.0.1</address>
</configuration>
</notifier>
</notifiers>
</ciManagement>
...
</project>
Mailing Lists
<project>
...
<mailingLists>
<mailingList>
<name>Development List</name>
<subscribe>developer-subscribe@127.0.0.1</subscribe>
<unsubscribe>developer-unsubscribe@127.0.0.1</unsubscribe>
<post>developer@127.0.0.1</post>
<archive>http://127.0.0.1/user/</archive>
<otherArchives>
<otherArchive>http://base.google.com/base/1/127.0.0.1</otherArchive>
</otherArchives>
</mailingList>
</mailingLists>
...
</project>
Source Control Management
<project>
...
<scm>
<connection>scm:svn:https://subversion.scmsever.com/svn/myPrj/trunk/</connection>
<developerConnection>scm:svn:https://subversion.scmsever.com/svn/myPrj/trunk/</developerConnection>
<tag>trunk</tag>
<url>scm:svn:https://subversion.scmsever.com/svn/myPrj/trunk/myPrj</url>
</scm>
...
</project>
Prerequisites
In questa sezione, come lascia intuire il nome, è possibile specificare eventuali condizioni il cui soddisfacimento è propedeutico per un corretto funzionamento di Maven. Un esempio tipico è la necessità di utilizzare eventuali fix. Qualora questi prerequisiti non siano soddisfatti Maven termina il build con un fallimento anche prima di avviare il build vero e proprio. L'unico elemento che attualmente è possibile specificare in questa sezione è l'elemento maven che permette di specificare il numero di versione:
<project>
...
<prerequisites>
<maven>2.0.4</maven>
</prerequisites>
...
</project>
Repositories
<project>
...
<repositories>
<repository>
<releases>
<enabled>false</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
<id>codehausSnapshots</id>
<name>Codehaus Snapshots</name>
<url>http://snapshots.maven.codehaus.org/maven2</url>
<layout>default</layout>
</repository>
</repositories>
<pluginRepositories>
...
</pluginRepositories>
...
</project>
Distribution Management
<project>
...
<distributionManagement>
<repository>
<uniqueVersion>false</uniqueVersion>
<id>corp1</id>
<name>Corporate Repository</name>
<url>scp://repo1/maven2</url>
<layout>default</layout>
</repository>
<snapshotRepository>
<uniqueVersion>true</uniqueVersion>
<id>propSnap</id>
<name>Propellors Snapshots</name>
<url>sftp://propellers.net/maven</url>
<layout>legacy</layout>
</snapshotRepository>
...
</distributionManagement>
...
</project>
<project>
...
<distributionManagement>
...
<downloadUrl>http://www.mokabyte.it/mokatips</downloadUrl>
<status>deployed</status>
</distributionManagement>
...
</project>
<project>
...
<distributionManagement>
...
<site>
<id>mojo.website</id>
<name>Mojo Website</name>
<url>scp://beaver.codehaus.org/home/projects/mojo/public_html/</url>
</site>
...
</distributionManagement>
...
</project>
<project>
...
<distributionManagement>
...
<relocation>
<groupId>com.mokabyte</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
<message>This project has been donated to Mokabyte</message>
</relocation>
...
</distributionManagement>
...
</project>
Profiles
<project>
...
<profiles>
<profile>
<id>test</id>
<activation>...</activation>
<build>...</build>
<modules>...</modules>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<dependencies>...</dependencies>
<reporting>...</reporting>
<dependencyManagement>...</dependencyManagement>
<distributionManagement>...</distributionManagement>
</profile>
</profiles>
</project>
Profile Activation
<project>
...
<profiles>
<profile>
<id>test</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.5</jdk>
<os>
<name>Windows XP</name>
<family>Windows</family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
<property>
<name>mavenVersion</name>
<value>2.0.3</value>
</property>
<file>
<exists>${basedir}/file2.properties</exists>
<missing>${basedir}/file1.properties</missing>
</file>
</activation>
...
</profile>
</profiles>
</project>
Gli elementi di attivazione dei profili sono:
- jdk: questo elemento esegue la verifica della versione del jdk. In particolare, il controllo è soddisfatto qualora il numero di versione del jdk in esecuzione risulti compatibile con quello impostato. Se per esempio si impostasse l'elemento jdk al valore 1.5 e l'ambiente di esecuzione riportasse un valore 1.5.0_06, il controllo risulterebbe soddisfatto.
- os: in questo caso l'obiettivo dell'elemento è verificare il sistema operativo di esecuzione. Gli elementi utilizzabili sono: arch (ossia l'architettura hardware di riferimento); family (famiglia, per la quale i valori ammessi sono dos, mac, netware, os/2, tandem, unix, windows, win9x, z/os, os/400); name (il nome del sistema operativo); version (la versione); display (flag per individuare il sistema operativo).
- property: in questo caso questa particolare attivazione è soddisfatta qualora Maven individui una proprietà (${name}) con lo stesso valore specificato.
- file: questa attivazione è soddisfatta qualora Maven riesca ad individuare l'esistenza (sezione exists) o l'assenza (sezione missings) di un determinato file.
