Maven2

Un article de Agora2ia.


logo_maven.jpg


Sommaire

TODO


Dependency search engine

Here are 2 such sites: http://www.mvnregistry.com http://mvnrepository.com

Also, if the artifact you're looking for is in your local m2 repo, Jerome Lacoste posted a blog entry on how to search it for things: http://www.coffeebreaks.org/blogs/?p=47

Autres pages

  • Maven
  • Voir les articles de la catégorie Maven (voir en bas de la page !).

Présentation

  • Conventions over configuration

Les repositories




POMs et Settings

Il existe deux type de fichiers de configuration Maven :

  1. pom.xml propre à un projet (obligatoire, définit à la racine d'un projet / module Maven)
  2. settings.xml propre à un tilisateur ou une machine (facultatif, définition à 3 endroits possibles : <TODO>)

Pour mettre à plat ces fichiers :

mvn help:effective-pom

mvn help:effective-settings




Structure, arborescence

Un module maven, un niveau hierarchique de l'arborescence Maven, c'est un artefact, un livrable. Cela se fait au moyen de la balise {{<packaging>}}.

A noter que si le projet est un projet Web, il existe deux arborescences supplémentaires :

  1. src/main/webapp pour contenir les ressources web,
  2. src/main/resources/WEB-INF pour contenir les ressources protégées de l'application web (web.xml par exemple).


Project Object Model : le POM

C'est le POM qui definit explicitement le type du livrable.


Modules

L'utilisation de Maven permet également de résoudre le problème de modularité. En effet, par défaut, Maven génère un artefact par projet.

De plus, un POM de haut niveau (parent)permet de construire chacun des artefacts enfants : on parle alors de POM multi-modules. Celui-ci référence explicitement chacun des POM enfants.


Profiles

http://maven.apache.org/guides/introduction/introduction-to-profiles.html

Parfois, les composants qui dépendent d'un JAR commun doivent le référencer en fonction de leur situation.

Maven permet par l'intermédiaire de profils de construire des livrables paramétrés. Par exemple, il est nécessaire de construire certains types de livrables en fonction du serveur d'application.

Les profiles ont été introduits dans Maven 2 pour assurer une plus grande portabilité.

Lorsqu'un profile est détecté pour la configuration courante d'exécution de Maven, le POM est modifié au runtime. Une commande utile pour visualiser le POM véritablement exécuter sur un module donné est :

mvn help:effective-pom


Et pour obtenir la liste des profils actifs :

mvn help:active-profiles


Les profils peuvent être définit :

  • Par Projet -> dans le POM lui-même (pom.xml)
  • Par Utilisateur -> dans les settings Maven (%USER_HOME%/.m2/settings.xml)).
  • Global -> dans les settings Maven global (%M2_HOME%/conf/settings.xml) .
  • Profile descripteur -> un descripteur situé dans le basedir du projet (profiles.xml)


L'activation de profiles peut également se faire de différentes façons :

  • Via la ligne de commande : mvn groupId:artifactId:goal -P profile-1,profile-2
    • Et l'on désactive un profile de la même façon : mvn groupId:artifactId:goal -P !profile-1,!profile-2
  • Dans les settings Maven :
    • Explicitement :
   <settings>
     ...
     <activeProfiles>
       <activeProfile>profile-1</activeProfile>
     </activeProfiles>
     ...
   </settings>
    • Conditionnelement :
   <profiles>
     <profile>
       <activation>
         <jdk>1.4</jdk>
       </activation>
       ...
     </profile>
   </profiles>

Java Web Start (JWS / JNLP)

Lancement de l'application avec commande javaws

  • Javaws 5.0 (version standard) : Le passage d'arguments à javaws doit se faire par une variable d'environnement :
   set JAVAWS_VM_ARGS=-Dapp.serverUrl=ormi://localhost/ept 
   javaws http://localhost:8888/fmktuteur/jnlp/fmktuteur.jnlp


  • Javaws 6.0 (pas encore disponible) Le passage d'arguments à javaws doit se faire avec le switch -J
   javaws 
       -J"-Dapp.serverUrl=opmn:ormi://gvasdbfi15:tech/testfmkapp" 
       -J"-Dapp.user=ops$saem/toto01" 
       http://gvasdbfi15.ch.net.intra/testfmkapp/jnlp/testfmkapp.jnlp


fichier template

   $explicitTimestamp
   <?xml version="1.0" encoding="UTF-8"?>
   
   <jnlp codebase="$$codebase" href="$$codebase$$name">
   
     <information>
       <title>$informationTitle</title>
       <vendor>$informationVendor</vendor>
       <description>$informationDescription</description>
       <offline-allowed/>
     </information>
   
     <security>
       <all-permissions/>
     </security>
   
     <resources>
       <j2se version="1.5" java-vm-args="-Xmx256M"/>
   	<property name="java.naming.factory.initial" value="oracle.j2ee.rmi.RMIInitialContextFactory"/>
       <property name="app.serverUrl" value="ormi://$$hostname/era"/>
   
   	<jar href="era-client-${project.version}.jar" version="$project.version" download="eager" main="true"/>
   
        $dependencies
     </resources>
   
     <application-desc main-class="$mainClass" />
   
   </jnlp>


Utilisation de variable : filtre des ressources

   <plugin>
       <groupId>org.codehaus.mojo</groupId>
       <artifactId>webstart-maven-plugin</artifactId>
       
       <configuration>
           <templateDirectory>${project.basedir}/src/main/jnlp</templateDirectory>
           <jnlp>
               <mainClass>com.bnpparibas.bfi.era.client.app.StrapApp</mainClass>
               <outputFile>${project.parent.artifactId}.jnlp</outputFile>
           </jnlp>
       </configuration>
   </plugin>



Modules et reacteur

...


Les référentiels / repositories / proxies


Structure

Un référentiel Maven comporte une structure bien définie :

groupId
 |_ artifactId
     |_ version


Par exemple, cela peut donner :

hibernate/
 |_ hibernate/
     |_ 1.2/
     |_ ...
     |_ 3.1rc2/
         |_ hibernate-3.1rc2.jar
         |_ hibernate-3.1rc2.pom
         |...


ou encore

com/
 |_ ma-societe/
     |_ mon-projet/
         |_ mon-module/
             |_ 1.0/
                 |_ mon-module-1.0.jar
                 |_ mon-module-1.0.pom
                 |...


Natures

Un référentiel Maven peut être de plusieurs natures :

  • Chaque développeur possède sur sa machine un référentiel local. Lorsque l'artefact demandé n'existe pas sur cette dernière, Maven va chercher sur un référentiel distant.
  • Il est possible de définir des référentiels Maven internes à l'entreprise. Ces derniers se présent sous forme de proxies Maven.
  • Enfin, il existe un super-référentiel sur ibiblio (et les mirroirs).


Proposition d'architecture

On peut assigner à chaque proxy des droits : un proxy interne permet le stockage des livrables de la société et un autre proxy interne, accessible uniquement en lecture par les développeurs, comporte les JAR externes nécessaires. De cette manière, il est possible à la société de maîtriser, voire verrouiller, les composants et leurs versions.


Implémentations / proxies

Il existe plusieurs implémentations de référentiel Maven :


Quelques liens sur le sujet :

Les plugins

L'une des forces de Maven 1.x était son ouverture via la notion de plugins. On retrouve cette notion dans Maven2.

Cependant, autant le nombre de plugins est rapidement devenu important, apportant autant de fonctionnalités à Maven, autant de le développement d'un plugin et la gestion de ces plugins au sein du processus de build pouvait souffrir de quelques lacunes.

Comme dans m1, les plugins continuent d'utiliser à la fois les informations du projet et les configurations de l'utilisateur. De plus, c'est toujours le moteur de build qui organise et exécute les plugins selon une séquence déterminée, en respectant les plugins pré-requis pour l'exécution d'un plugin donné.

Mais leur gestion a été revue en profondeur dans Maven2.


Ressources


TODO

  • Rapport avec les phases de build.


La notion de MOJO

Dans Maven 1.x un plugin était une extension de Maven, regroupant un ensemble de fonctionnalités ou goals.

Dans Maven2, les goals s'appellent désormais des MOJO, ce qui correspond donc à un goal dans Maven 1.x. Maven2 encourage le développement de plugins en Java, sachant qu'il est également possible d'utiliser Ant ou le langage de script Beanshell. En Java, le MOJO correspond à une classe avec des annotations, qui permettent d'indiquer des méta-données du goal :

  • Nom du goal,
  • Phase du cycle de vie dans laquelle d'intègre le goal,
  • Paramètres du goal et ses caractéristiques : valeur par défaut, requis ou pas...


Injection de dépendances et acces au POM

Repose sur l'InversionOfControl ou IoC.

Add this to your mojo:

/**
* Project instance, used to add new source directory to the build.
* @parameter default-value="${project}"
* @required
* @readonly
*/
private MavenProject project;


To get the source directories directly you can add:

/**
* List of source roots containing non-test code.
* @parameter default-value="${project.compileSourceRoots}"
* @required
* @readonly
*/
private List sourceRoots;

La Plugin Registry

Plugins disponibles

Et les autres langages


Tips

Voir la page MavenTips...

Ressources