<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>mvn arnaud:blog</title>
	<atom:link href="http://blog.aheritier.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.aheritier.net</link>
	<description></description>
	<lastBuildDate>Wed, 09 Jun 2010 11:24:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Je m&#8217;en vais faire ma quiche &#8230; Lorraine (Maven @ Lorraine JUG)</title>
		<link>http://blog.aheritier.net/je-men-vais-faire-ma-quiche-lorraine-maven-lorraine-jug/</link>
		<comments>http://blog.aheritier.net/je-men-vais-faire-ma-quiche-lorraine-maven-lorraine-jug/#comments</comments>
		<pubDate>Wed, 26 May 2010 16:09:18 +0000</pubDate>
		<dc:creator>Arnaud Héritier</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[Apache Maven]]></category>
		<category><![CDATA[Communauté]]></category>
		<category><![CDATA[Java User Group]]></category>

		<guid isPermaLink="false">http://blog.aheritier.net/?p=1092</guid>
		<description><![CDATA[Et oui, même les meilleures choses ont une fin. Mardi prochain, le 1er Juin, je ferai ma dernière présentation de Maven devant un JUG. Rassurez vous c&#8217;est simplement la dernière avant la pause estivale !! Je reviendrai. Cela sera donc &#8230; <a href="http://blog.aheritier.net/je-men-vais-faire-ma-quiche-lorraine-maven-lorraine-jug/">Continuer la lecture <span class="meta-nav">&#8594;</span></a><br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=9.0" /></div><div>Rating: 9.0/<strong>10</strong> (1 vote cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.aheritier.net/wp-content/uploads/2010/05/Logo-LorraineJUG-small.png"><img src="http://blog.aheritier.net/wp-content/uploads/2010/05/Logo-LorraineJUG-small.png" alt="" title="LorraineJUG" width="400" height="62" class="alignright size-full wp-image-1094" /></a>Et oui, même les meilleures choses ont une fin. Mardi prochain, le 1er Juin, je ferai ma dernière présentation de Maven devant un JUG.<br />
<span id="more-1092"></span><br />
Rassurez vous c&#8217;est simplement la dernière avant la pause estivale !! Je reviendrai. <img src='http://blog.aheritier.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Cela sera donc cette fois au <a href="http://lorrainejug.blogspot.com/">LorraineJUG</a>, près de Nancy, à l&#8217;<a href="http://maps.google.fr/maps/ms?source=s_q&#038;hl=fr&#038;geocode=&#038;ie=UTF8&#038;msa=0&#038;msid=115187017752443839405.000460975c6d0b5fb9401&#038;ll=48.669312,6.155283&#038;spn=0.012555,0.033002&#038;z=16">Ecole Supérieure d&#8217;Informatique et Applications de Lorraine (193 av. Paul Muller, 54602 Villers-lès-Nancy)</a>.<br />
Etant tout seul cette fois-ci vous n&#8217;aurez pas la &laquo;&nbsp;chance&nbsp;&raquo; (?) de nous voir faire notre numéro de Fred &#038; Jamy (C&#8217;est pas sorcier sur France3) avec <a href="http://blog.loof.fr/">Nicolas</a>, comme nous avons pu le faire au <a href="http://jduchess.org/duchess-france/paris-jug-de-mai-build-share-deploy-jusquau-bout-de-la-nuit-4/">Paris JUG</a>.<br />
En revanche nous pourrons voir beaucoup plus de choses. Le menu étant riche, vous aurez donc le choix des plats à consommer en fonction de vos envies (et pour ne pas faire une indigestion). Voici la carte :</p>
<ul>
<li>Un tour d’horizon du produit, ses différentes fonctionnalités et son positionnement par rapport à la concurrence,</li>
<li>Son histoire, retour vers le futur, ce que nous réserve Maven 3.x.</li>
<li>Son ecosystem, comme les gestionnaires de référentiels de binaires, les serveurs d’intégration continue, les tableaux de bord qualité, l’IDE,</li>
<li>Les bonnes et mauvaises pratiques d’utilisation,</li>
<li>Quelques cas d’usages méconnus (sécurisation des passwords, release d’un projet, options du réacteur),</li>
</ul>
<p>Comme à chaque session un exemplaire de notre livre<a href="http://www.pearson.fr/livre/?GCOI=27440100730370"> Apache Maven</a> sera à gagner (tombola réservée aux membres).<br />
Aprés la conférence, l&#8217;équipe du Lorraine JUG organisera un barbecue sur la terrasse de la cafétéria de l&#8217;ESIAL (en espérant que dieu Météo soit de notre coté). Si vous souhaitez y participer, envoyez un e-mail à <a href="mailto:info@lorrainejug.org">info@lorrainejug.org</a>. Une petite participation de 3€ sera demandée aux non-membres.<br />
J&#8217;espère vous retrouver nombreux et n&#8217;oubliez pas de vous <a href="http://jugevents.org/jugevents/event/27354">inscrire</a> !!!</p>
<p><b>MAJ 9 Juin : </b>Ci-dessous les slides de cette présentation.<br />
<object width="650" height="533"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=20100601-lorrainejug-maven-100531114649-phpapp02"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=20100601-lorrainejug-maven-100531114649-phpapp02"  type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="650" height="533"></embed></object></p>
<br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=9.0" /></div><div>Rating: 9.0/<strong>10</strong> (1 vote cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://blog.aheritier.net/je-men-vais-faire-ma-quiche-lorraine-maven-lorraine-jug/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Le bug Maven du jour : MRESOURCES-104</title>
		<link>http://blog.aheritier.net/le-bug-maven-du-jour-mresources-104/</link>
		<comments>http://blog.aheritier.net/le-bug-maven-du-jour-mresources-104/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 20:18:09 +0000</pubDate>
		<dc:creator>Arnaud Héritier</dc:creator>
				<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Apache Maven]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.aheritier.net/?p=1076</guid>
		<description><![CDATA[Il parait que je dis toujours que du bien de Maven (c&#8217;est tout du moins ce que certains ressentent en écoutant le podcast Les Cast Codeurs). C&#8217;est pourtant, je pense, loin d&#8217;être la vérité et ceux qui peuvent assister aux &#8230; <a href="http://blog.aheritier.net/le-bug-maven-du-jour-mresources-104/">Continuer la lecture <span class="meta-nav">&#8594;</span></a><br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=6.3" /></div><div>Rating: 6.3/<strong>10</strong> (4 votes cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p><a href="http://maven.apache.org"><img src="http://blog.aheritier.net/wp-content/uploads/2009/11/maventxt_logo_200.png" alt="Apache Maven" title="Apache Maven" width="200" height="53" class="alignright size-full wp-image-696" /></a>Il parait que je dis toujours que du bien de <a href="http://maven.apache.org">Maven</a> (c&#8217;est tout du moins ce que certains ressentent en écoutant le podcast <a href="http://lescastcodeurs.com/">Les Cast Codeurs</a>). C&#8217;est pourtant, je pense, loin d&#8217;être la vérité et ceux qui peuvent assister aux différents Java Users Groups que j&#8217;ai pu présenter doivent pouvoir confirmer que je n&#8217;hésite pas aussi à casser du sucre dessus.<br />
Certainement pour me punir voilà que je tombe ce soir sur un bug qui m&#8217;a fait perdre 30 minutes. Je ne compte pas rédiger un blog par jour pour décrire un bug Maven (même si il y aurait largement de quoi faire) mais en partageant l&#8217;information j&#8217;espère éviter à quelques autres ce soucis.<br />
<span id="more-1076"></span><br />
Tout débute par un sous projet de GateIn (WSRP) dans lequel on souhaite filtrer un fichier de ressources. Jusque là, rien d&#8217;exceptionnel, cela fait partie des fonctionnalités de Maven depuis des années.<br />
On rajoute dans le <a href="http://anonsvn.jboss.org/repos/gatein/components/wsrp/trunk/common/pom.xml">POM</a> l&#8217;activation du filtrage :<br />
<code>&lt;project<br />
&nbsp;xmlns="http://maven.apache.org/POM/4.0.0"<br />
&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;xsi:schemaLocation="http://maven.apache.org/POM/4.0.0&nbsp;http://maven.apache.org/maven-v4_0_0.xsd"&gt;<br />
&nbsp;&nbsp;&nbsp;...<br />
&nbsp;&nbsp;&nbsp;&lt;build&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;resources&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;resource&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;directory&gt;src/main/resources&lt;/directory&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;filtering&gt;true&lt;/filtering&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/resource&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/resources&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/build&gt;<br />
&lt;/project&gt;<br />
</code><br />
Nous plaçons un fichier <a href="http://anonsvn.jboss.org/repos/gatein/components/wsrp/trunk/common/src/main/resources/wsrp.properties">wsrp.properties</a> dans le répertoire src/main/resources avec la propriété ${project.version} pour que Maven la filtre :<br />
<code>#<br />
# JBoss, a division of Red Hat<br />
# Copyright 2010, Red Hat Middleware, LLC, and individual<br />
# contributors as indicated by the @authors tag. See the<br />
# copyright.txt in the distribution for a full listing of<br />
# individual contributors.<br />
#<br />
# This is free software; you can redistribute it and/or modify it<br />
# under the terms of the GNU Lesser General Public License as<br />
# published by the Free Software Foundation; either version 2.1 of<br />
# the License, or (at your option) any later version.<br />
#<br />
# This software is distributed in the hope that it will be useful,<br />
# but WITHOUT ANY WARRANTY; without even the implied warranty of<br />
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU<br />
# Lesser General Public License for more details.<br />
#<br />
# You should have received a copy of the GNU Lesser General Public<br />
# License along with this software; if not, write to the Free<br />
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA<br />
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.<br />
#<br />
wsrp.service.version=${project.version}<br />
</code><br />
On lance Maven et on s&#8217;attend à ce que la propriété soit remplacée dans le fichier properties copiée dans le répertoire target/classes&#8230;.. mais rien !!<br />
Je me mets alors à tester la syntaxe alternative @project.version@ ainsi qu&#8217;un propriété simple injectée via les POM ou la ligne de commande &#8230;. rien. Pas de filtrage.<br />
Je commence alors à tester avec différentes versions du plugin resources (le projet utilise la version 2.4.1). Je suis d&#8217;ailleurs bien content d&#8217;avoir mis sous la forme d&#8217;une propriété toutes les versions des plugins pour faire ce genre de test en passant la valeur en ligne de commande. 2.4, 2.4.1, 2.4.2 KO. Par contre la 2.3 fonctionne.<br />
C&#8217;est énorme !!!! Comment le filtrage peut ne pas fonctionner et ce sur les 3 versions du plugin ?<br />
Je cherche dans les bug ouverts et voilà que je découvre l&#8217;horrible bug <a href="http://jira.codehaus.org/browse/MRESOURCES-104">MRESOURCES-104</a> !!<br />
Les délimiteurs des tokens/propriétés à remplacer/filtrer sont par défaut @XXXX@ ou ${XXXX}. Le bug se trouve au niveau du parsing des fichiers car si le plugin trouve un délimiteur de début sans fin, il s&#8217;emmele les pinceaux et arrête de filtrer.<br />
De ce fait si dans le fichier à filtrer on trouve un caractère @ seul, comme dans l&#8217;entête JBoss, le filtrage ne fonctionne pas.<br />
Il existe cependant un contournement indiqué dans les commentaires qui consiste à désactiver les délimiteurs par défaut pour ne définir que la version ${} :<br />
<code>&lt;project<br />
&nbsp;xmlns="http://maven.apache.org/POM/4.0.0"<br />
&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;xsi:schemaLocation="http://maven.apache.org/POM/4.0.0&nbsp;http://maven.apache.org/maven-v4_0_0.xsd"&gt;<br />
&nbsp;&nbsp;&nbsp;...<br />
&nbsp;&nbsp;&nbsp;&lt;build&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;resources&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;resource&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;directory&gt;src/main/resources&lt;/directory&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;filtering&gt;true&lt;/filtering&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/resource&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/resources&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;plugins&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;WORKAROUND&nbsp;for&nbsp;:&nbsp;http://jira.codehaus.org/browse/MRESOURCES-104&nbsp;--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;plugin&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;artifactid&gt;maven-resources-plugin&lt;/artifactid&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;delimiters&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;delimiter&gt;${*}&lt;/delimiter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/delimiters&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;usedefaultdelimiters&gt;false&lt;/usedefaultdelimiters&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/plugin&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/plugins&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/build&gt;<br />
&lt;/project&gt;<br />
</code><br />
Et voilà comment j&#8217;ai perdu 30 minutes. Et oui Maven n&#8217;est pas magique et il existe des bugs !! Le mythe est tombé.<br />
Mais une fois de plus lorsque l&#8217;on propose des services de plus en plus haut complexes on s&#8217;expose à créer des bugs encore plus pervers. Maintenant je n&#8217;ai plus qu&#8217;à voir si en 30 minutes j&#8217;arrive à le corriger.<br />
Est ce que c&#8217;est pour cela que je vais remettre en cause les fondements de Maven ? Et bien non. Rien n&#8217;est parfait mais je crois en la nécessité de standardiser le build et je ne pense pas que les autres solutions existantes soient aujourd&#8217;hui exemptes de bug. En tout cas je regarde toujours ce qui se passe à coté et j&#8217;espère bien que tout ou tard la compétition renaitra pour motiver encore plus l&#8217;équipe Maven.</p>
<br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=6.3" /></div><div>Rating: 6.3/<strong>10</strong> (4 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://blog.aheritier.net/le-bug-maven-du-jour-mresources-104/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Domptez vos versions</title>
		<link>http://blog.aheritier.net/domptez-vos-versions/</link>
		<comments>http://blog.aheritier.net/domptez-vos-versions/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 13:14:41 +0000</pubDate>
		<dc:creator>Arnaud Héritier</dc:creator>
				<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Apache Maven]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.aheritier.net/?p=1053</guid>
		<description><![CDATA[Dans un soucis de qualité et de traçabilité Apache Maven a introduit et imposé dès le départ la notion de version pour identifier les projets et leurs livrables. Cependant il faut bien avouer que pendant longtemps il n&#8217;y avait pas &#8230; <a href="http://blog.aheritier.net/domptez-vos-versions/">Continuer la lecture <span class="meta-nav">&#8594;</span></a><br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=9.0" /></div><div>Rating: 9.0/<strong>10</strong> (7 votes cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p><a href="http://maven.apache.org"><img src="http://blog.aheritier.net/wp-content/uploads/2009/11/maventxt_logo_200.png" alt="Apache Maven" title="Apache Maven" width="200" height="53" class="alignright size-full wp-image-696" /></a>Dans un soucis de qualité et de traçabilité Apache Maven a introduit et imposé dès le départ la notion de version pour identifier les projets et leurs livrables. Cependant il faut bien avouer que pendant longtemps il n&#8217;y avait pas d&#8217;outil à la disposition des équipes pour analyser et manipuler les différentes versions utilisées dans les descripteurs Maven. Ce manque a été en partie comblé il y a un peu plus d&#8217;un an par la  création du <a href="http://mojo.codehaus.org/versions-maven-plugin/">plugin versions</a>, hébergé sur <a href="http://mojo.codehaus.org">http://mojo.codehaus.org</a> que je me propose de vous présenter.<br />
<a href="http://lescastcodeurs.com/" target="_blank"><img src="http://lescastcodeurs.com/img/entendu_sur_castcodeurs_200px.png" alt="Entendu sur Les Cast Codeurs" class="alignright size-full"/></a>Cet article est un complément aux explications que j&#8217;ai pu donner dans <a href="http://lescastcodeurs.com/2010/01/les-cast-codeurs-podcast-episode-16-le-seul-podcast-java-cette-semaine-qui-ne-parle-pas-du-webcast-de-snoracle/">la rubrique &quot;les mains dans le cambouis&quot; de l&#8217;épisode 16</a> du podcast <a href="http://lescastcodeurs.com/">Les Cast Codeurs</a>.</p>
<p>Cet article est basé sur la version 1.1 du plugin versions publiée en octobre 2009.</p>
<p><span id="more-1053"></span></p>
<h1>Abracadabra, de version tu changeras !</h1>
<p>Le fait que Maven considère que dans un projet tout module doive pouvoir être construit indépendamment des autres, toutes les références internes (héritages, dépendances, &#8230;) répètent inlassablement le numéro de version du projet. Il existe bien des palliatifs comme utiliser la propriété ${project.version} pour ne pas répeter cette information au niveau des dépendances. Pourtant cela ne fonctionne pas au niveau de l&#8217;héritage car on retombe sur le problème de la poule et de l&#8217;oeuf. Si ma version n&#8217;est que dans le pom parent de mon projet, comment mon module va trouver son parent sans connaitre sa version ?</p>
<p>Cela crée donc souvent la panique à bord dans l&#8217;équipe projet lorsque pour une raison X ou Y il est nécessaire de changer la version en cours de développement. Les plus geek sortiront des commandes find, sed ou autre mais cela n&#8217;est pas toujours sans erreurs surtout si l&#8217;on a la malchance d&#8217;avoir notre numéro de version à remplacer utilisé par ailleurs (dans une dépendances externe par exemple).</p>
<p>Le plugin versions propose donc le mojo:set pour simplifier cette opération. </p>
<p><code>versions:set<br />
   Sets the current projects version, updating the details of any child modules<br />
   as necessary.</code></p>
<p>Il suffit de passer en paramètre la nouvelle version à utiliser pour que le plugin remplace partout (héritage, dépendances, &#8230;) l&#8217;ancienne valeur par la nouvelle.</p>
<p><code>  mvn versions:set -DnewVersion=1.2.3-SNAPSHOT</code></p>
<p>
  Mais que faire si l&#8217;on avoulu faire la modification à la main et que l&#8217;on s&#8217;est planté ? Si par exemple la chaine d&#8217;héritage est rompue au sein de vos modules vous risquez de vous retrouver avec ce genre d&#8217;erreur (C&#8217;est promis on à amélioré la qualité des erreurs remontées dans Maven 3) :</p>
<p><code>[INFO] Scanning for projects...<br />
   [INFO] ------------------------------------------------------------------------<br />
   [ERROR] FATAL ERROR<br />
   [INFO] ------------------------------------------------------------------------<br />
   [INFO] Error building POM (may not be this project's POM).<br />
Project ID: com.foo.bar:bar-child:jar:null<br />
Reason: Cannot find parent: com.foo.bar:bar for project: com.foo.bar:bar-child:jar:null</code></p>
<p> Une fois de plus le plugin versions vient à vote secours avec le mojo versions:update-child-modules</p>
<p><code>versions:update-child-modules<br />
   Scans the current projects child modules, updating the versions of any which<br />
   use the current project to the version of the current project.</code></p>
<p>Lancez la commande mvn -N versions:update-child-modules et votre soucis se sera envolé (attention à ne pas oublier l&#8217;option -N car sinon maven essaiera de résoudre vos modules et il echouera à cause du problème).</p>
<p>Références :</p>
<ul>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/examples/set.html">http://mojo.codehaus.org/versions-maven-plugin/examples/set.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/examples/update-child-modules.html">http://mojo.codehaus.org/versions-maven-plugin/examples/update-child-modules.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/set-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/set-mojo.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/update-child-modules-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/update-child-modules-mojo.html</a></li>
</ul>
<h1>Boule de cristal : Dis-moi si j&#8217;utilise les dernières versions de mes dépendances ou plugins ?</h1>
<p>Tôt ou tard dans la vie d&#8217;un projet se pose la question de savoir si nous utilisons des versions récentes des plugins Maven ou des dépendances. Cela peut être suite à la découverte d&#8217;un bug, ou alors tout simplement pour essayer de rester à jour afin de conserver un support actif sur des livrables open-sources par exemple (essayez donc de demander à un véritable développeur open-source &#8211; qui le fait  de bon coeur sur son temps libre &#8211; de corriger un bug et livrer un correctif sur une version<br />
  qui a plusieurs années !!). Le nombre important de plugins et de dépendances rentrant en compte dans un projet est vite faramineux et cette tâche devient vite une peine si l&#8217;on doit aller consulter un à un tous les sites web impartis ou si l&#8217;on doit rechercher ou naviguer dans le repository central Maven pour identifier les mises à jour. </p>
<p>Pour répondre à ce besoin le plugin versions fournit   une série de mojo qui vont automatiquement analyser les plugins et dépendances que vous utilisez pour  comparer vos versions actuelles avec celles disponibles sur les référentiels d&#8217;artifacts que vous avez déclaré dans votre projet ou paramètres utilisateurs. Le plugin vous permet de visualiser le résultat soit sous la forme d&#8217;un rapport en ligne de commande (versions:display-dependency-updates, versions:display-plugin-updates) soit dans le site web du projet généré par Maven (versions:display-dependency-report, versions:display-plugin-report). Cela fonctione aussi si vous avez stocké vos numéros de versions dans des propriétés (versions:display-property-updates, versions:property-updates-report).</p>
<p><code>versions:display-dependency-updates<br />
 Displays all dependencies that have newer versions available.<br />
versions:dependency-updates-report<br />
 Generates a report of available updates for the dependencies of a project.<br />
versions:display-plugin-updates<br />
   Displays all plugins that have newer versions available.<br />
versions:plugin-updates-report<br />
   Generates a report of available updates for the dependencies of a project.<br />
versions:display-property-updates<br />
   Sets properties to the latest versions of specific artifacts.<br />
versions:property-updates-report<br />
   Generates a report of available updates for properties of a project which are<br />
   linked to the dependencies and/or plugins of a project.</code></p>
<p>Exemple de rapport en ligne de commande pour les mises à jour de dépendances :</p>
<p><code>   [INFO] --- versions-maven-plugin:1.1:display-dependency-updates (default-cli) @ maven-my-plugin ---<br />
   [INFO] The following dependencies in Dependencies are using the newest version:<br />
   [INFO]   org.apache.maven:maven-core .................................... 2.2.1<br />
   [INFO]   org.apache.maven:maven-toolchain ................................. 1.0<br />
   [INFO]   org.apache.maven.shared:maven-common-artifact-filters ............ 1.2<br />
   [INFO]   plexus:plexus-utils ............................................ 1.0.1<br />
   [INFO]   rhino:js ....................................................... 1.7R1<br />
   [INFO]<br />
   [INFO] The following dependencies in Dependencies have newer versions:<br />
   [INFO]   org.apache.maven:maven-artifact ................. 2.2.1 -&gt; 3.0-alpha-7<br />
   [INFO]   org.apache.maven:maven-plugin-api ............... 2.2.1 -&gt; 3.0-alpha-7</code></p>
<p>Exemple de rapport intégré dans le site web maven pour les mises à jour de dépendances :</p>
<p><a href="http://blog.aheritier.net/wp-content/uploads/2010/04/maven-versions-updates.png"><img src="http://blog.aheritier.net/wp-content/uploads/2010/04/maven-versions-updates-300x172.png" alt="" title="maven-versions-updates" width="300" height="172" class="aligncenter size-medium wp-image-1056" /></a></p>
<p>Vous noterez que ce rapport est bien plus complet et vous permet de facilement identifier les dernières versions majeurs, mineurs,correctives disponibles. Je vous conseille de configurer le plugin pour utiliser la méthode de comparaison &quot;Mercury&quot; (celle de maven 3) plutot que la version par defaut (celle de maven 2) pour obtenir des résultats plus judicieux sur certaines librairies qui ont publié des livrables avec des versions exotiques.</p>
<p>Autre chose très utile, le rapport  sur les mises à jour de plugin vous alerte si les versions des plugins utilisés ne sont pas définies dans votre projet (ce qui est une mauvaise pratique Maven  puisque vous risquez d&#8217;avoir une mise à jour qui détériore votre build.</p>
<p><code>   [INFO] [versions:display-plugin-updates]<br />
   [INFO]<br />
   [INFO] The following plugin updates are available:<br />
   [INFO]   maven-checkstyle-plugin .................................. 2.1 -&gt; 2.2<br />
   [INFO]   maven-clean-plugin ....................................... 2.1 -&gt; 2.2<br />
   [INFO]   maven-deploy-plugin ...................................... 2.3 -&gt; 2.4<br />
   [INFO]   maven-javadoc-plugin ..................................... 2.4 -&gt; 2.5<br />
   [INFO]   maven-site-plugin .......................... 2.0-beta-6 -&gt; 2.0-beta-7<br />
   [INFO]<br />
   [WARNING] The following plugins do not have their version specified:<br />
   [WARNING]   maven-compiler-plugin ..................... (from super-pom) 2.0.2<br />
   [WARNING]   maven-deploy-plugin ......................... (from super-pom) 2.3<br />
   [WARNING]   maven-install-plugin ........................ (from super-pom) 2.2<br />
   [WARNING]   maven-javadoc-plugin ........................ (from super-pom) 2.4<br />
   [WARNING]   maven-site-plugin .................... (from super-pom) 2.0-beta-6<br />
   [WARNING]   org.codehaus.mojo:build-helper-maven-plugin .................. 1.2</code></p>
<p>Exemple de rapport sur les mises à jour de propriétés qui contiennent des versions :</p>
<p><code>   [INFO] [versions:display-property-updates]<br />
   [INFO]<br />
   [INFO] The following version property updates are available:<br />
   [INFO]   ${doxiaVersion} ........................................ 1.0 -&gt; 1.1.1<br />
   [INFO]   ${doxia-sitetoolsVersion} .............................. 1.0 -&gt; 1.1.1<br />
</code></p>
<p>&nbsp;</p>
<p>Références : </p>
<ul>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/examples/display-dependency-updates.html">http://mojo.codehaus.org/versions-maven-plugin/examples/display-dependency-updates.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/examples/display-plugin-updates.html">http://mojo.codehaus.org/versions-maven-plugin/examples/display-plugin-updates.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/examples/display-property-updates.html">http://mojo.codehaus.org/versions-maven-plugin/examples/display-property-updates.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/dependency-updates-report-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/dependency-updates-report-mojo.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/display-dependency-updates-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/display-dependency-updates-mojo.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/display-plugin-updates-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/display-plugin-updates-mojo.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/display-property-updates-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/display-property-updates-mojo.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/plugin-updates-report-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/plugin-updates-report-mojo.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/property-updates-report-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/property-updates-report-mojo.html</a></li>
</ul>
<h1>Je suis ton père !</h1>
<p>Avec le mécanisme d&#8217;héritage des descripteurs de projets, il est simple de mettre en place des descripteurs parents au niveau d&#8217;une entreprise, d&#8217;une forge ou simplement de plsuieurs projets pour partager un certain nombre de paramètres communs. Ces descripteurs ont leur propre cycle de vie, mais il est souvent conseillé d&#8217;utiliser la dernière version disponible. Au lieu d&#8217;aller voir manuellement quelle est la dernière version disponible il suffit d&#8217;appeler la commande versions:update-parent</p>
<p>Exemple :</p>
<p><code><br />
   [INFO] [versions:update-parent]<br />
   ...<br />
   [INFO] artifact org.codehaus.mojo:mojo: checking for updates from codehaus.org<br />
   [INFO] artifact org.codehaus.mojo:mojo: checking for updates from central<br />
   [INFO] Updating parent from 14 to 17</code></p>
<p>Cela ne vous évitera pas cependant d&#8217;aller chercher la release note associée à la nouvelle version pour comprendre les impacts espérés (ou non) sur votre build.</p>
<p>Vous pouvez aussi préciser un intervalle pour la mise à jour :</p>
<p><code>mvn versions:update-parent -DparentVersion=&quot;[14,16)&quot;</code></p>
<p>Et même autoriser les SNAPSHOTs :</p>
<p><code>mvn versions:update-parent -DallowSnapshots=true</code></p>
<p>Références :</p>
<ul>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/examples/update-parent.html">http://mojo.codehaus.org/versions-maven-plugin/examples/update-parent.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/update-parent-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/update-parent-mojo.html</a></li>
</ul>
<h1>Maitrisez le chaos !</h1>
<p>Le concept de versions dans Maven propose deux types de versions qui ne sont pas stables dans le temps :</p>
<ul>
<li>Les SNAPSHOTs : Elles représentent les projets en cours de développement. Les livrables avec des versions dites SNASPHOT sont régulièrement actualisées par Maven (une fois par jour par défaut). Ces livrables sont stockés avec un identifiant unique lorsqu&#8217;ils sont déployés sur un référentiel distant.</li>
<li>Les ranges : Ce sont des intervals de versions. Au lieu de dire que l&#8217;on veut une version donnée d&#8217;un livrable, on laisse le choix à maven de choisir la version la plus récente dans un ensemble prédéfini.</li>
</ul>
<p>Le principale problème en utilisant ces types de versions dans votre projet c&#8217;est que du jour au lendemain Maven peut les mettre à jour et que cela peut entrainer des régressions. Pour l&#8217;éviter il est utile de pouvoir figer ces versions soit en définissant exactement avec leurs identifiants uniques les SNASPHOTs que l&#8217;on utilise, soit en choisissant les versions aujourd&#8217;hui utilisées dans les intervales (ranges).</p>
<p>Pour cela le plugin versions propose les mojos versions:lock-snapshots, versions:unlock-snapshots et versions:resolve-ranges qui vous permettent d&#8217;éditer ces versions. </p>
<p><code>versions:lock-snapshots<br />
   Attempts to resolve unlocked snapshot dependency versions to the locked<br />
   timestamp versions used in the build. For example, an unlocked snapshot<br />
   version like '1.0-SNAPSHOT' could be resolved to '1.0-20090128.202731-1'. If a<br />
   timestamped snapshot is not available, then the version will remained<br />
   unchanged. This would be the case if the dependency is only available in the<br />
   local repository and not in a remote snapshot repository.<br />
versions:unlock-snapshots<br />
   Attempts to resolve unlocked snapshot dependency versions to the locked<br />
   timestamp versions used in the build. For example, an unlocked snapshot<br />
   version like '1.0-SNAPSHOT' could be resolved to '1.0-20090128.202731-1'. If a<br />
   timestamped snapshot is not available, then the version will remained<br />
   unchanged. This would be the case if the dependency is only available in the<br />
   local repository and not in a remote snapshot repository.<br />
versions:resolve-ranges<br />
   Attempts to resolve dependency version ranges to the specific version being<br />
   used in the build. For example a version range of '[1.0, 1.2)' would be<br />
   resolved to the specific version currently in use '1.1'.<br />
</code></p>
<p>Vous y trouverez aussi des options pour inclures ou exclures certaines dépendances afin de cibler vos mises à jour.</p>
<p><code>mvn versions:lock-snapshots -Dincludes=org.codehaus.plexus:*,junit:junit</code></p>
<p>Références :</p>
<ul>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/examples/lock-snapshots.html">http://mojo.codehaus.org/versions-maven-plugin/examples/lock-snapshots.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/examples/unlock-snapshots.html">http://mojo.codehaus.org/versions-maven-plugin/examples/unlock-snapshots.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/examples/resolve-ranges.html">http://mojo.codehaus.org/versions-maven-plugin/examples/resolve-ranges.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/lock-snapshots-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/lock-snapshots-mojo.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/resolve-ranges-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/resolve-ranges-mojo.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/unlock-snapshots-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/unlock-snapshots-mojo.html</a></li>
</ul>
<h1>Mettez à jour ce que vous voulez !</h1>
<p>Pour terminer le plugin mojo offre toute une série de mojos pour mettre à jour vos dépendances vers les versions suivantes ou les toutes dernières versions. On peu utiliser soit la prochaine version release ou snapshot. On peut aussi controler/filtrer les dépendances à mettre à jour.</p>
<p><code>versions:update-properties<br />
   Sets properties to the latest versions of specific artifacts.<br />
versions:use-latest-releases<br />
   Replaces any release versions with the latest release version.<br />
versions:use-latest-snapshots<br />
   Replaces any release versions with the latest snapshot version (if it has been<br />
   deployed).<br />
versions:use-latest-versions<br />
   Replaces any version with the latest version.<br />
versions:use-next-releases<br />
   Replaces any release versions with the next release version (if it has been<br />
   released).<br />
versions:use-next-snapshots<br />
   Replaces any release versions with the next snapshot version (if it has been<br />
   deployed).<br />
versions:use-next-versions<br />
   Replaces any version with the latest version.<br />
versions:use-releases<br />
   Replaces any -SNAPSHOT versions with the corresponding release version (if it<br />
   has been released).</code></p>
<p>Références : </p>
<ul>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/examples/advancing-dependency-versions.html">http://mojo.codehaus.org/versions-maven-plugin/examples/advancing-dependency-versions.html</a> </li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/examples/update-properties.html">http://mojo.codehaus.org/versions-maven-plugin/examples/update-properties.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/examples/use-releases.html">http://mojo.codehaus.org/versions-maven-plugin/examples/use-releases.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/update-properties-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/update-properties-mojo.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/use-latest-releases-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/use-latest-releases-mojo.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/use-latest-snapshots-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/use-latest-snapshots-mojo.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/use-latest-versions-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/use-latest-versions-mojo.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/use-next-releases-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/use-next-releases-mojo.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/use-next-snapshots-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/use-next-snapshots-mojo.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/use-next-versions-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/use-next-versions-mojo.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/use-releases-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/use-releases-mojo.html</a></li>
</ul>
<h1>Oopps !!!!</h1>
<p>Même si une large partie des projets sont supposés être gérés dans un gestionaire de versions de sources, le plugin versions intègre par défaut sont propre système de validation/annulation pour toutes les opérations dans lesquelles il modifie vos descripteurs de projets. Pour cela il crée des copies de sauvegarde de vos descripteurs. Vous pouvez alors les supprimer (et donc valider ses changements) avec la commande versions:commit, ou vous pouvez tout annuler avec versions:revert. ATTENTION, cette sauvegarde ne gère pas d&#8217;historique. Elle ne conserve que la dernière modification. Pensez à valider ou rejeter vos changements après chaque modification.</p>
<p><code>versions:commit<br />
   Removes the initial backup of the pom, thereby accepting the changes.<br />
versions:revert<br />
   Restores the pom from the initial backup.</code></p>
<p>Références :</p>
<ul>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/commit-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/commit-mojo.html</a></li>
<li><a href="http://mojo.codehaus.org/versions-maven-plugin/revert-mojo.html">http://mojo.codehaus.org/versions-maven-plugin/revert-mojo.html</a></li>
</ul>
<br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=9.0" /></div><div>Rating: 9.0/<strong>10</strong> (7 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://blog.aheritier.net/domptez-vos-versions/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>RivieraJug : Le soleil, Maven et la mer</title>
		<link>http://blog.aheritier.net/rivierajug-le-soleil-maven-et-la-mer/</link>
		<comments>http://blog.aheritier.net/rivierajug-le-soleil-maven-et-la-mer/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 22:58:17 +0000</pubDate>
		<dc:creator>Arnaud Héritier</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[Apache Maven]]></category>
		<category><![CDATA[Communauté]]></category>
		<category><![CDATA[Java User Group]]></category>

		<guid isPermaLink="false">http://blog.aheritier.net/?p=1042</guid>
		<description><![CDATA[Mardi soir je serai à nouveau sur la route des JUGs pour m&#8217;arrêter cette fois-ci à Nice au RivieraJUG. Cette soirée se déroulera dans les locaux de l’INRIA Sophia-Antipolis. La soirée devait être, il y a encore quelques minutes, une &#8230; <a href="http://blog.aheritier.net/rivierajug-le-soleil-maven-et-la-mer/">Continuer la lecture <span class="meta-nav">&#8594;</span></a><br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=7.5" /></div><div>Rating: 7.5/<strong>10</strong> (2 votes cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.rivierajug.org/xwiki/bin/view/Main/201004%2Dbuild"><img src="http://blog.aheritier.net/wp-content/uploads/2010/04/rivierajug-logo-1-moyen.png" alt="RivieraJUG" title="RivieraJUG" width="200" height="51" class="alignright size-full wp-image-1044" /></a>Mardi soir je serai à nouveau sur la route des JUGs pour m&#8217;arrêter cette fois-ci à Nice au RivieraJUG. Cette soirée se déroulera dans les locaux de l’<a href="http://www.rivierajug.org/xwiki/bin/view/Main/201004%2Dbuild">INRIA Sophia-Antipolis</a>.<br />
<span id="more-1042"></span><br />
La soirée devait être, il y a encore quelques minutes, une présentation de <a href="http://maven.apache.org/">Maven</a> par votre humble serviteur et de <a href="http://gradle.org/">Gradle</a> par Hans Dockter son créateur. Malheureusement il vient de nous informer que le dernier vol qu&#8217;il avait pu prévoir pour venir venait d&#8217;être annulé <img src='http://blog.aheritier.net/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' />  (cochonnerie de nuage).<br />
<a href="http://maven.apache.org"><img src="http://blog.aheritier.net/wp-content/uploads/2009/11/maventxt_logo_200.png" alt="Apache Maven" title="Apache Maven" width="200" height="53" class="alignright size-full wp-image-696" /></a>Il pourrait toujours être drôle que je fasse moi-même la présentation Gradle mais je ne le connais pas encore assez pour pouvoir en parler et m&#8217;en moquer. On va donc se contenter de faire la fête à Maven !.<br />
En fonction de vos envies et de vos connaissances j&#8217;adapterai le contenu pour vous parler de Maven, son ecosystème, son avenir. Nous pourrons aussi passer en revue les diverses bonnes et mauvaises pratiques que j&#8217;ai pu voir.<br />
Je vous dis donc à mardi soir. Venez nombreux et n&#8217;oubliez surtout pas de vous <a href="http://www.rivierajug.org/xwiki/bin/view/Main/201004%2Dbuild">inscrire</a> !!</p>
<p><strong>MAJ 25 avril 2010</strong> : Les slides de la session<br />
<object width="650" height="533"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=20100420-rivierajug-maven-100424181055-phpapp02"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=20100420-rivierajug-maven-100424181055-phpapp02"  type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="650" height="533"></embed></object></p>
<br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=7.5" /></div><div>Rating: 7.5/<strong>10</strong> (2 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://blog.aheritier.net/rivierajug-le-soleil-maven-et-la-mer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Build partiel avec Maven : Construire moins pour aller plus vite.</title>
		<link>http://blog.aheritier.net/construire-moins-pour-aller-plus-vite/</link>
		<comments>http://blog.aheritier.net/construire-moins-pour-aller-plus-vite/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 20:05:00 +0000</pubDate>
		<dc:creator>Arnaud Héritier</dc:creator>
				<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Apache Maven]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[LesCastCodeurs]]></category>

		<guid isPermaLink="false">http://blog.aheritier.net/?p=977</guid>
		<description><![CDATA[Apache Maven permet nativement de découper un projet en sous-modules. Chaque module est un élément autonome avec son propre cycle de vie. Maven utilise ce que l&#8217;on appel le &#171;&#160;reactor&#160;&#187; pour orchestrer dans un projet l&#8217;appel des différents modules en &#8230; <a href="http://blog.aheritier.net/construire-moins-pour-aller-plus-vite/">Continuer la lecture <span class="meta-nav">&#8594;</span></a><br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=9.8" /></div><div>Rating: 9.8/<strong>10</strong> (6 votes cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p><a href="http://maven.apache.org" target="_blank"><img src="http://blog.aheritier.net/wp-content/uploads/2009/11/maventxt_logo_200.png" alt="Apache Maven" title="Apache Maven" width="200" height="53" class="alignright size-full wp-image-696" />Apache Maven</a> permet nativement de découper un projet en sous-modules. Chaque module est un élément autonome avec son propre cycle de vie. Maven utilise ce que l&#8217;on appel le &laquo;&nbsp;reactor&nbsp;&raquo; pour orchestrer dans un projet l&#8217;appel des différents modules en fonction de leurs dépendances.</p>
<p>Le concept de module, permet d&#8217;affiner la granularité des livrables et de rendre plus flexible et évolutive l&#8217;architecture de l&#8217;application. Cependant lorsque le nombre de modules d&#8217;un projet augmente cela va souvent de pair avec le nombre de lignes de code, de tests et de packages à créer. La construction du projet prend donc de plus en plus de temps à en devenir un frein pour la productivité du développeur <em>(moi je ne trouve rien de plus énervant lorsque je développe que de devoir attendre que ma machine me rende la main)</em>.</p>
<p><a href="http://lescastcodeurs.com/" target="_blank"><img src="http://lescastcodeurs.com/img/entendu_sur_castcodeurs_200px.png" alt="Entendu sur Les Cast Codeurs" class="alignright size-full"/></a>Il existe pourtant des fonctionnalités du &laquo;&nbsp;reactor&nbsp;&raquo; qui permettent à Maven de contrôler finement quels sont les modules d&#8217;un projet sur lesquels on souhaite appeler un traitement. Même si elles existent depuis près de deux ans, ces fonctionnalités sont encore peu connues et utilisées malgré leurs utilités indéniables (faute à la documentation ?). Ce billet illustre mes rapides explications de <a href="http://lescastcodeurs.com/2010/04/les-cast-codeurs-podcast-episode-20-oracle-je-taime-moi-non-plus-et-linvasion-des-lapins/">l&#8217;épisode 20 du podcast Les Cast Codeurs</a>. Il détaille l&#8217;utilisation de 4 options de la ligne de commande pour Maven 2.1 et versions ultérieures. Vous pouvez très bien faire la même chose avec le <a href="http://maven.apache.org/plugins/maven-reactor-plugin/" target="_blank">plugin reactor</a> et les versions 2.0.x de Maven mais il faudra taper sur plus de touches de votre clavier car la syntaxe est bien moins synthétique.<br />
<span id="more-977"></span></p>
<h1>Le projet exemple</h1>
<p><img src="http://blog.aheritier.net/wp-content/uploads/2010/04/Pom-Reactor-min.png" alt="Le Projet" title="Le Projet" width="307" height="258" class="alignright" /><br />
Pour illustrer l&#8217;article je prend volontairement un projet simple sans complexité dans les dépendances entre les modules.<br />
Ce projet est composé de 6 sous-modules (A à F) avec les dépendances suivantes </p>
<ul>
<li>Module F dépend de Module E,</li>
<li>Module E dépend de Module D,</li>
<li>Module D dépend de Module C,</li>
<li>Module C dépend de Module B,</li>
<li>Module B dépend de Module A.</li>
</ul>
<p>Dans cet article j&#8217;utilise le verbe &laquo;&nbsp;construire&nbsp;&raquo; pour nommer une exécution Maven sur un module/projet mais il faut se rappeler que Maven fait bien plus que cela nativement : exécution des tests, génération de site web, etc. Ces options s&#8217;appliquent à n&#8217;importe quelle phase ou plugin que l&#8217;on souhaite appeler sur le projet.</p>
<table style="width:100%">
<tr>
<td>
<strong>A noter</strong> que les commandes Maven doivent être impérativement appelées depuis le projet principal où sont déclarés tous les modules afin qu&#8217;il connaisse le graphe complet de l&#8217;exécution des modules et n&#8217;extrait que les parties qui vous intéressent.<br />
Dans notre exemple, compte tenu des dépendances entre modules, une exécution complète de Maven va suivre l&#8217;ordre alphabétique.<br />
<code>arnaud@mbp-arnaud:~$ mvn install<br />
[INFO] ------------------------------------------------<br />
[INFO] Reactor Summary:<br />
[INFO]<br />
[INFO] Project ....................... SUCCESS [2.132s]<br />
[INFO] ModuleA ....................... SUCCESS [5.574s]<br />
[INFO] ModuleB ....................... SUCCESS [0.455s]<br />
[INFO] ModuleC ....................... SUCCESS [0.396s]<br />
[INFO] ModuleD ....................... SUCCESS [0.462s]<br />
[INFO] ModuleE ....................... SUCCESS [0.723s]<br />
[INFO] ModuleF ....................... SUCCESS [0.404s]<br />
[INFO]<br />
</code>
</td>
<td style="width:310px">
<img src="http://blog.aheritier.net/wp-content/uploads/2010/04/Reactor-min.png" alt="Reactor" title="Reactor" width="308" height="393" />
</td>
</tr>
</table>
<h1>Sélectionner les modules à construire. L&#8217;option -pl.</h1>
<p><code>arnaud@mbp-arnaud:~$ mvn --help<br />
usage: mvn [options] [&lt;goal (s)&gt;] [&lt;phase (s)&gt;]<br />
Options:<br />
...<br />
 -pl,--projects &lt;arg&gt;                   Build specified reactor projects<br />
                                        instead of all projects<br />
...<br />
</code><br />
Cette option permet de choisir spécifiquement les modules du projet à construire. Cela évite de naviguer de répertoire en répertoire pour lancer chaque module ou d&#8217;utiliser plusieurs lancements successifs avec l&#8217;option &laquo;&nbsp;-f chemin_vers_un_pom.xml&nbsp;&raquo;. Cela vous fait gagner aussi du temps en évitant de charger Maven et la JVM plusieurs fois. Enfin le fait que Maven utilise son &laquo;&nbsp;reactor&nbsp;&raquo;, c&#8217;est lui qui ordonne les modules en fonctions des dépendances et ça n&#8217;est pas à vous de faire ce calcule.<br />
La liste de modules est séparée par des virgules. Pour identifier chaque module, nous pouvons soit utiliser son chemin relatif par rapport à la racine du projet soit son artifactId.</p>
<table style="width:100%">
<tr>
<td>
<code>arnaud@mbp-arnaud:~$ mvn install –pl moduleE,moduleB<br />
[INFO] -------------------------------------------<br />
[INFO] Reactor Summary:<br />
[INFO]<br />
[INFO] ModuleB .................. SUCCESS [2.774s]<br />
[INFO] ModuleE .................. SUCCESS [1.008s]<br />
[INFO]<br />
</code><br />
Dans note exemple nous demandons à Maven d&#8217;executer le cycle de vie jusqu&#8217;à la phase &laquo;&nbsp;install&nbsp;&raquo; pour les modules E et B. Maven calcule automatiquement l&#8217;ordre et construits le module B puis le module E.
</td>
<td style="width:310px">
<img src="http://blog.aheritier.net/wp-content/uploads/2010/04/reactor-pl-min.png" alt="Reactor avec liste de modules" title="Reactor avec liste de modules" width="308" height="393" class="size-full wp-image-985" />
</td>
</tr>
</table>
<h1>Construire tous les modules impactant la construction d&#8217;une liste de modules. L&#8217;option -am</h1>
<p><code>arnaud@mbp-arnaud:~$ mvn --help<br />
usage: mvn [options] [&lt;goal (s)&gt;] [&lt;phase (s)&gt;]<br />
Options:<br />
 -am,--also-make                        If project list is specified, also<br />
                                        build projects required by the<br />
                                        list<br />
...<br />
</code><br />
Cette option s&#8217;utilise conjointement à l&#8217;option -pl. En plus de construire les modules demandés par l&#8217;option -pl, Maven va construire tous les modules nécessaires à ceux-ci (donc ceux qui apparaissent dans leurs dépendances).</p>
<table style="width:100%">
<tr>
<td>
<code>arnaud@mbp-arnaud:~$ mvn install –pl moduleD -am<br />
[INFO] ------------------------------------------<br />
[INFO] Reactor Summary:<br />
[INFO]<br />
[INFO] ModuleA ................. SUCCESS [4.075s]<br />
[INFO] ModuleB ................. SUCCESS [0.468s]<br />
[INFO] ModuleC ................. SUCCESS [0.354s]<br />
[INFO] ModuleD ................. SUCCESS [0.384s]<br />
[INFO]<br />
</code><br />
<strong>Cas d&#8217;usage : </strong>Imaginons que vous développiez une application JEE avec de nombreux JARs, quelques WARs et EARs. Si vous travaillez sur un war en particulier et que vous êtes capable de ne déployer que ce dernier pour tester vos développements, vous n&#8217;avez pas besoin de reconstruire tout votre projet. Demandez à Maven de reconstruire que les modules nécessaires à la construction du WAR en passant ce dernier en paramètre de l&#8217;option -pl et en ajoutant l&#8217;option -am.<br />
<code>mvn install –pl monWAR -am</code>
</td>
<td style="width:310px">
<img src="http://blog.aheritier.net/wp-content/uploads/2010/04/reactor-pl-am-min.png" alt="Reactor avec dépendances des modules" title="Reactor avec dépendances du module" width="308" height="393" class="size-full wp-image-986" />
</td>
</tr>
</table>
<h1>Construire tous les modules impactés par la construction d&#8217;une liste de module. L&#8217;option -amd</h1>
<p><code>arnaud@mbp-arnaud:~$ mvn --help<br />
usage: mvn [options] [&lt;goal (s)&gt;] [&lt;phase (s)&gt;]<br />
Options:<br />
...<br />
 -amd,--also-make-dependents            If project list is specified, also<br />
                                        build projects that depend on<br />
                                        projects on the list<br />
...<br />
</code><br />
Cette option s&#8217;utilise conjointement à l&#8217;option -pl. En plus de construire les modules demandés par l&#8217;option -pl, Maven va construire tous les modules qui dépendent de ces derniers.</p>
<table style="width:100%">
<tr>
<td>
<code>arnaud@mbp-arnaud:~$ mvn install –pl moduleD -amd<br />
[INFO] ------------------------------------------<br />
[INFO] Reactor Summary:<br />
[INFO]<br />
[INFO] ModuleD ................. SUCCESS [4.881s]<br />
[INFO] ModuleE ................. SUCCESS [0.478s]<br />
[INFO] ModuleF ................. SUCCESS [0.427s]<br />
[INFO]<br />
</code><br />
<strong>Cas d&#8217;usage : </strong>Vous travaillez sur un module et vous voulez vérifier que vos modifications n&#8217;impactent pas les autres modules qui l&#8217;utilisent. Vous demandez donc à Maven de reconstruire ce module (-pl monModule) et tous ceux qui l&#8217;utilisent (-amd). Ainsi la compilation et les tests des autres modules valideront vos changements.<br />
<code>mvn install –pl monModule -amd</code>
</td>
<td style="width:310px">
<img src="http://blog.aheritier.net/wp-content/uploads/2010/04/reactor-pl-amd-min.png" alt="Reactor avec modules dépendants" title="Reactor avec modules dépendants" width="308" height="393" class="alignright size-full wp-image-987" />
</td>
</tr>
</table>
<h1>Reprennez où vous voulez. L&#8217;option -rf</h1>
<p><code>arnaud@mbp-arnaud:~$ mvn --help<br />
usage: mvn [options] [@lt;goal (s)&gt;] [&lt;phase (s)&gt;]<br />
Options:<br />
...<br />
 -rf,--resume-from &lt;arg&gt;                Resume reactor from specified<br />
                                        project<br />
...<br />
</code><br />
Cette option permet de reprendre à un point donné (un module) l&#8217;ensemble de la construction du projet. Tout comme l&#8217;option -pl, le module passé en paramètre de l&#8217;option -rf est identifié à partir de son chemin relatif ou de son artifactId.</p>
<table style="width:100%">
<tr>
<td>
<code>arnaud@mbp-arnaud:~$ mvn install –rf moduleD<br />
[INFO] ------------------------------------------<br />
[INFO] Reactor Summary:<br />
[INFO]<br />
[INFO] ModuleD ................. SUCCESS [9.707s]<br />
[INFO] ModuleE ................. SUCCESS [0.625s]<br />
[INFO] ModuleF ................. SUCCESS [0.679s]<br />
[INFO] Project ................. SUCCESS [2.467s]<br />
[INFO]<br />
</code><br />
<strong>Cas d&#8217;usage : </strong>Vous travaillez sur votre projet et vous voulez le reconstruire entièrement pour valider vos changements. Vous lancez la construction et elle échoue dans le module D. Vous trouvez le problème et corrigez le module D erroné. A quoi bon relancer la construction complète alors que vous savez que les modules construits avant le module D n&#8217;ont pas été modifiés et ne peuvent pas être affecté par votre modification. Vous demandez donc à Maven de relancer toute la construction à partir du module D.<br />
<code>mvn install –rf moduleD</code>
</td>
<td style="width:310px">
<img src="http://blog.aheritier.net/wp-content/uploads/2010/04/reactor-pl-amd-min.png" alt="Reactor avec démarage depuis un module" title="Reactor avec démarage depuis un module" width="308" height="393" class="alignright size-full wp-image-987" />
</td>
</tr>
</table>
<br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=9.8" /></div><div>Rating: 9.8/<strong>10</strong> (6 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://blog.aheritier.net/construire-moins-pour-aller-plus-vite/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>En manque de chocolat &#8230;</title>
		<link>http://blog.aheritier.net/en-manque-de-chocolat/</link>
		<comments>http://blog.aheritier.net/en-manque-de-chocolat/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 21:14:47 +0000</pubDate>
		<dc:creator>Arnaud Héritier</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[Apache Maven]]></category>
		<category><![CDATA[Communauté]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Java User Group]]></category>

		<guid isPermaLink="false">http://blog.aheritier.net/?p=960</guid>
		<description><![CDATA[&#8230; je n&#8217;ai pas d&#8217;autre choix que de retourner en Suisse me réapprovisionner. Après les sessions à l&#8217;AlpesJUG et GenevaJUG de la semaine dernière, je m&#8217;en retourne ce jeudi soir à Lausanne présenter Maven en général et sa troisième version &#8230; <a href="http://blog.aheritier.net/en-manque-de-chocolat/">Continuer la lecture <span class="meta-nav">&#8594;</span></a><br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=10.0" /></div><div>Rating: 10.0/<strong>10</strong> (1 vote cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p><a href="http://jugl.ch"><img src="http://blog.aheritier.net/wp-content/uploads/2010/04/jugl-logo_transp_small2.png" alt="" title="JUG Lausanne" width="153" height="101" class="alignright size-full wp-image-965" /></a>&#8230; je n&#8217;ai pas d&#8217;autre choix que de retourner en Suisse me réapprovisionner.<br />
Après les sessions à <a href="http://www.alpesjug.fr/?p=249">l&#8217;AlpesJUG</a> et <a href="http://www.genevajug.ch/">GenevaJUG</a> de la semaine dernière, je m&#8217;en retourne ce jeudi soir à <a href="http://jugl.ch">Lausanne</a> présenter <a href="http://jugl.ch/xwiki/bin/view/Main/Prochaines+Réunions">Maven en général et sa troisième version majeure en particulier</a>.</p>
<p><span id="more-960"></span></p>
<p>Comme de coutume j&#8217;ai bien plus de slides et de contenu que le temps imparti. J&#8217;essaierai donc de spécialiser la session en fonction des attentes de l&#8217;auditoire présent.<br />
Au menu nous pourrons aborder différents thèmes comme :<br />
<img src="http://blog.aheritier.net/wp-content/uploads/2010/04/toblerone-150x150.jpg" alt="" title="toblerone" width="150" height="150" class="alignright size-thumbnail wp-image-964" /></p>
<ul>
<li>Son histoire, un tour d&#8217;horizon du produit, ses différentes fonctionnalités et son positionnement par rapport à la concurrence,</li>
<li>Son ecosystem, comme les gestionnaires de référentiels de binaires, les serveurs d&#8217;intégration continue, les tableaux de bord qualité, l&#8217;IDE,</li>
<li>Les bonnes et mauvaises pratiques d&#8217;utilisation,</li>
<li>Quelques cas d&#8217;usages méconnus (sécurisation des passwords, release d&#8217;un projet, options du réacteur),</li>
<li>Retour vers le futur, que nous réserve Maven 3.x.</li>
</ul>
<p>N&#8217;oubliez pas de vous <a href="http://www.jugevents.org/jugevents/event/show.html?id=25730">inscrire</a> et rejoignez-nous nombreux !!</p>
<p><b>MAJ 13 Avril 2010</b> : Voici les slides de la présentation. Une fois de plus ceux-ci ont été mis à jour depuis la <a href="http://blog.aheritier.net/presentations-maven-3-a-lalpesjug-et-au-genevajug/" title="Présentations Maven (3) à l’AlpesJUG et au GenevaJUG" >précédente présentation à Genève</a>.<br />
<object width="650" height="533"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=20100408-lausannejug-maven-100412100223-phpapp01"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=20100408-lausannejug-maven-100412100223-phpapp01"  type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="650" height="533"></embed></object></p>
<br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=10.0" /></div><div>Rating: 10.0/<strong>10</strong> (1 vote cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://blog.aheritier.net/en-manque-de-chocolat/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>3Moopydelfy passe à la vitesse supérieure</title>
		<link>http://blog.aheritier.net/3moopydelfy-passe-a-la-vitesse-superieure/</link>
		<comments>http://blog.aheritier.net/3moopydelfy-passe-a-la-vitesse-superieure/#comments</comments>
		<pubDate>Sat, 03 Apr 2010 08:40:20 +0000</pubDate>
		<dc:creator>Arnaud Héritier</dc:creator>
				<category><![CDATA[Ma vie]]></category>

		<guid isPermaLink="false">http://blog.aheritier.net/?p=949</guid>
		<description><![CDATA[@3Moopydelfy, super maman blogueuse sur le net, et ma femme à la ville, entame une nouvelle aventure en ouvrant un second blog. Vous retrouverez désormais sur son premier blog Bonbon Bisous tout le contenu orienté super-maman, avec par exemple les &#8230; <a href="http://blog.aheritier.net/3moopydelfy-passe-a-la-vitesse-superieure/">Continuer la lecture <span class="meta-nav">&#8594;</span></a><br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>10</strong> (0 votes cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p><a href="http://twitter.com/3Moopydelfy">@3Moopydelfy</a>, super maman blogueuse sur le net, et ma femme à la ville, entame une nouvelle aventure en ouvrant un second blog.<br />
<span id="more-949"></span></p>
<table>
<tr>
<td>
<a href="http://www.bonbonbisous.com/"><img src="http://blog.aheritier.net/wp-content/uploads/2010/04/chocobo-300x208-150x150.jpg" alt="" title="Bonbon Bisous" width="150" height="150" class="alignleft size-thumbnail wp-image-951" /></a><br />
Vous retrouverez désormais sur son premier blog <a href="http://www.bonbonbisous.com/">Bonbon Bisous</a> tout le contenu orienté super-maman, avec par exemple les loisirs pour enfants, ou la cuisine. Ce blog orienté &laquo;&nbsp;famille&nbsp;&raquo; devrait intéresser en priorité les papas et mamans que vous pouvez être au quotidien.
</td>
</tr>
<tr>
<td>
<a href="http://www.newkidsonthegeek.com/"><img src="http://blog.aheritier.net/wp-content/uploads/2010/04/domo__amigos-150x150.jpg" alt="" title="New Kids On The Geek" width="150" height="150" class="alignleft size-thumbnail wp-image-950" /></a><br />
Sur son nouveau blog <a href="http://www.newkidsonthegeek.com/">New Kids On The Geek</a> vous retrouverez son coté super-femme ou elle parlera de ses loisirs. Mangas, comics, séries télé ou cinéma en sont quelques-uns.
</td>
</tr>
</table>
<p>En espérant que vous y trouverez votre bonheur, au moins vous êtes certain de ne jamais trouver sur ses blogs un POM ou une ligne de commande Maven !<br />
Bon week-end à tous !</p>
<br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>10</strong> (0 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://blog.aheritier.net/3moopydelfy-passe-a-la-vitesse-superieure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subversion : Exclure en masse les fichiers et répertoires générés d&#8217;un projet Maven</title>
		<link>http://blog.aheritier.net/subversion-exclure-en-masse-les-fichiers-et-repertoires-generes-dun-projet-maven/</link>
		<comments>http://blog.aheritier.net/subversion-exclure-en-masse-les-fichiers-et-repertoires-generes-dun-projet-maven/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 13:42:09 +0000</pubDate>
		<dc:creator>Arnaud Héritier</dc:creator>
				<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Apache Maven]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Unix]]></category>

		<guid isPermaLink="false">http://blog.aheritier.net/?p=906</guid>
		<description><![CDATA[Une chose ennuyeuse lorsque l&#8217;on démarre un nouveau projet Maven avec différents sous-modules et que l&#8217;on veut en gérer les versions dans Subversion c&#8217;est qu&#8217;il faut pour chaque module configurer la propriété svn:ignore afin de lui dire de ne jamais &#8230; <a href="http://blog.aheritier.net/subversion-exclure-en-masse-les-fichiers-et-repertoires-generes-dun-projet-maven/">Continuer la lecture <span class="meta-nav">&#8594;</span></a><br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>10</strong> (0 votes cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p>Une chose ennuyeuse lorsque l&#8217;on démarre un nouveau projet <a href="http://maven.apache.org/">Maven</a> avec différents sous-modules et que l&#8217;on veut en gérer les versions dans <a href="http://subversion.apache.org/">Subversion</a> c&#8217;est qu&#8217;il faut pour chaque module configurer la propriété svn:ignore afin de lui dire de ne jamais publier sur le serveur les fichiers ou répertoires que l&#8217;on ne veut pas partager avec le reste de l&#8217;équipe.<br />
Le gros avantage de Maven ce sont ses conventions et en particulier sur l&#8217;organisation des répertoires (sans cela autant faire du script).<br />
La force des OS Unix-like (Linux, Macos, &#8230;) c&#8217;est la panoplie d&#8217;outils super-puissants en ligne de commande.<br />
<span id="more-906"></span><br />
Tirons parti de ces derniers pour faire cela en moins de 10 secondes.<br />
Il suffit de créer à la racine du projet un ficher module.svn-ignore dans lequel on va lister les fichiers ou répertoires à ignorer :<br />
<code><br />
.settings<br />
.project<br />
.classpath<br />
.idea<br />
*.iml<br />
*.ipr<br />
*.iws<br />
bin<br />
target<br />
</code><br />
Et ensuite de lancer la commande :<br />
<code><br />
find . -name pom.xml -exec dirname {} \; | xargs svn ps svn:ignore -F module.svn-ignore<br />
</code><br />
Il ne vous reste plus qu&#8217;à publier (commit) vos changements sur le serveur subversion et le tour est joué.</p>
<p><strong>Plus de détails ?</strong><br />
Dans le fichier d&#8217;exclusions je choisis de mettre </p>
<ul>
<li>le répertoire target de maven,</li>
<li>le répertoire bin souvent (toujours ?) utilisé par <a href="http://m2eclipse.sonatype.org/">m2eclipse</a></li>
<li>le répertoire .settings et les fichiers .project , .classpath pour les utilisateurs <a href="http://eclipse.org/">d&#8217;eclipse</a>.</li>
<li>le répertoire .idea et les fichiers *.iml, *.iws, *.ipr pour les utilisateurs d&#8217;<a href="http://www.jetbrains.com/idea/">IntelliJ Idea</a></li>
</ul>
<p>Le script recherche ensuite tous les descripteurs de projets (pom.xml) et applique l&#8217;exclusion au répertoire dans lequel il se trouve.<br />
PS : Pour les malheureux contraints à développer sous windows, vous pouvez installer <a href="http://www.cygwin.com/">cygwin</a> pour avoir un environnement shell potable.<br />
MAJ 27 Mars 2010 : Ajout de l&#8217;exclusion des fichiers *.iws de IntelliJ Idea (cf. commentaire de Gregory Boissinot)</p>
<br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>10</strong> (0 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://blog.aheritier.net/subversion-exclure-en-masse-les-fichiers-et-repertoires-generes-dun-projet-maven/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Présentations Maven (3) à l&#8217;AlpesJUG et au GenevaJUG</title>
		<link>http://blog.aheritier.net/presentations-maven-3-a-lalpesjug-et-au-genevajug/</link>
		<comments>http://blog.aheritier.net/presentations-maven-3-a-lalpesjug-et-au-genevajug/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 22:25:27 +0000</pubDate>
		<dc:creator>Arnaud Héritier</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[Apache Maven]]></category>
		<category><![CDATA[Communauté]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Java User Group]]></category>

		<guid isPermaLink="false">http://blog.aheritier.net/?p=910</guid>
		<description><![CDATA[La semaine prochaine je reprends ma tournée des JUGs francophones pour vous parler de Maven à Grenoble et à Genève. Je serai, lundi soir, le 29 Mars à l&#8217;AlpesJUG, à Grenoble. L&#8217;accueil aura lieu à partir de 18H30 dans l’amphithéâtre &#8230; <a href="http://blog.aheritier.net/presentations-maven-3-a-lalpesjug-et-au-genevajug/">Continuer la lecture <span class="meta-nav">&#8594;</span></a><br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=10.0" /></div><div>Rating: 10.0/<strong>10</strong> (1 vote cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p><a href="http://maven.apache.org"><img src="http://blog.aheritier.net/wp-content/uploads/2009/06/maventxt_logo_200.png" alt="" title="maventxt_logo_200" width="200" height="53" class="alignright size-full wp-image-568" /></a>La semaine prochaine je reprends ma tournée des JUGs francophones pour vous parler de Maven à Grenoble et à Genève.<br />
<span id="more-910"></span><br />
<a href="http://www.alpesjug.fr"><img src="http://blog.aheritier.net/wp-content/uploads/2010/03/LogoAlpesJuggy.png" alt="" title="LogoAlpesJuggy" width="108" height="117" class="alignleft size-full wp-image-923" /></a><br />
 Je serai, lundi soir, <a href="http://www.alpesjug.fr/?p=187">le 29 Mars à l&#8217;AlpesJUG</a>, à Grenoble. L&#8217;accueil aura lieu à partir de 18H30 dans <a href="http://ensimag.grenoble-inp.fr/adminsite/photo.jsp?ID_PHOTO=1200660700685">l’amphithéâtre E de l&#8217;ENSIMAG, rue de la Chimie</a>. La conférence débutera à 19H00. La soirée se terminera par un diner au restaurant <a href="http://doodle.com/rfc9iwwd5ywchhmu">La Charbonnade, 10 Rue Marcel Porte, 38000 Grenoble</a> (04 76 47 43 07‎).  N&#8217;oubliez pas de vous inscrire pour la <a href="http://www.jugevents.org/jugevents/event/24851">présentation</a> et pour le <a href="http://doodle.com/rfc9iwwd5ywchhmu">restaurant</a>, les places sont limitées.</p>
<p><a href="http://www.genevajug.ch/"><img src="http://blog.aheritier.net/wp-content/uploads/2010/03/LogoGenevaJuggy.png" alt="" title="LogoGenevaJuggy" width="200" height="117" class="alignright size-full wp-image-914" /></a><br />
Le lendemain, mardi 30 Mars je serai en Suisse au <a href="http://www.genevajug.ch">GenevaJUG</a>. Dépéchez-vous de vous <a href="http://www.jugevents.org/jugevents/event/24908">inscrire</a>, il ne reste déjà plus que 10 places. La présentation aura lieu <a href="http://maps.google.ch/maps?f=q&#038;source=s_q&#038;hl=fr&#038;geocode=&#038;q=+rue+du+Général-Dufour+24,+1204+Genève&#038;sll=46.362093,9.036255&#038;sspn=5.996937,9.876709&#038;ie=UTF8&#038;hq=&#038;hnear=Rue+du+Général+Dufour+24,+1204+Genève&#038;ll=46.19958,6.143095&#038;spn=0.005874,0.009645&#038;z=17">salle U259 à l&#8217;Uni-Dufour</a> à partir de 18h30 et sera aussi suivi d&#8217;un diner.</p>
<p>Lors de ces présentations nous aborderons comment Maven intervient pour chacune de ces étapes:</p>
<ul>
<li>le build du projet sur le poste du développeur</li>
<li>la gestion des dépendances et des dépôts</li>
<li>la mise en place de l’intégration continue</li>
<li>l’utilisation des métriques et des rapports de qualité</li>
<li>le déploiement continu</li>
</ul>
<p>Je reviendrai aussi sur les nouveautés à attendre de Maven 3 qui sera la prochaine version majeure et qui verra le jour dans quelques mois (pas folle la guêpe, elle reste vague <img src='http://blog.aheritier.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ).</p>
<p>En fonction de l&#8217;auditoire et de son niveau de connaissances sur Maven j&#8217;adapterai le contenu et la durée de la séance de questions/réponses. &laquo;&nbsp;C&#8217;est vous qui voyez&nbsp;&raquo; comme dirait <a href="http://www.dailymotion.com/video/x1eqf7_c-est-vous-qui-voyez-laspalès_fun">Laspalès</a>.</p>
<p>D&#8217;autres sessions sont dores et déjà planifiées dans plusieurs JUG, et je vous en parlerai plus en détail d&#8217;ici peu :</p>
<ul>
<li><a href="http://jugl.ch/xwiki/bin/view/Main/WebHome">LausanneJUG</a> le 8 avril,</li>
<li><a href="http://www.rivierajug.org/xwiki/bin/view/Main/201004%2Dbuild">RivieraJUG</a> (Nice) le 20 Avril,</li>
<li><a href="http://www.parisjug.org/xwiki/bin/view/Meeting/20100511">ParisJUG</a> le 11 Mai,</li>
<li><a href="http://lorrainejug.blogspot.com/">LorraineJUG</a> le 1 juin.</li>
</ul>
<p><strong>Mise à jour (23 Mars) :</strong> J&#8217;ai oublié de préciser qu&#8217;une librairie partenaire du GenevaJUG devrait proposer à la vente sur place notre livre <a href="http://blog.aheritier.net/publications/" title="Publications" >&laquo;&nbsp;Apache Maven&nbsp;&raquo;</a>.</p>
<p><strong>Mise à jour N°2 (23 Mars) :</strong> : La salle pour l&#8217;AlpesJUG à changé. La session aura lieu <a href="http://ensimag.grenoble-inp.fr/adminsite/photo.jsp?ID_PHOTO=1200660700685">dans l’amphithéâtre E de l&#8217;ENSIMAG, rue de la Chimie</a>.</p>
<p><strong>Mise à jour N°3 (30 Mars) :</strong> : Ci-dessous la présentation au AlpesJUG<br />
<object width="650" height="533"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=20100329-alpesjug-maven-v0-100330025545-phpapp01"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=20100329-alpesjug-maven-v0-100330025545-phpapp01"  type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="650" height="533"></embed></object></p>
<p><strong>Mise à jour N°4 (1 Avril) :</strong> : Ci-dessous la présentation au GenevaJUG (quelques ajouts/modifications/corrections)<br />
<object width="650" height="533"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=20100329-genevajug-maven-100331142449-phpapp01"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=20100329-genevajug-maven-100331142449-phpapp01"  type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="650" height="533"></embed></object><br />
et les <a href="http://picasaweb.google.fr/xavierbourguignon/GenevaJUGMaven30032010?feat=directlink">photos</a>.</p>
<br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=10.0" /></div><div>Rating: 10.0/<strong>10</strong> (1 vote cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://blog.aheritier.net/presentations-maven-3-a-lalpesjug-et-au-genevajug/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Convertir en masse les notifications standard Hudson par celles du plugin Email-Ext</title>
		<link>http://blog.aheritier.net/convertir-en-masse-les-notifications-standard-hudson-par-celles-du-plugin-email-ext/</link>
		<comments>http://blog.aheritier.net/convertir-en-masse-les-notifications-standard-hudson-par-celles-du-plugin-email-ext/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 07:00:23 +0000</pubDate>
		<dc:creator>Arnaud Héritier</dc:creator>
				<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Hudson]]></category>

		<guid isPermaLink="false">http://blog.aheritier.net/?p=891</guid>
		<description><![CDATA[Chez eXo platform nous utilisons Hudson pour notre intégration continue. La combinatoire entre les différents types de builds (intégration continue, reporting, packaging), les différents projets et leurs différentes branches de maintenance représente des dizaines de jobs dans Hudson. Jusqu&#8217;à présent &#8230; <a href="http://blog.aheritier.net/convertir-en-masse-les-notifications-standard-hudson-par-celles-du-plugin-email-ext/">Continuer la lecture <span class="meta-nav">&#8594;</span></a><br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=8.0" /></div><div>Rating: 8.0/<strong>10</strong> (1 vote cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.aheritier.net/wp-content/uploads/2010/02/butler.png"><img src="http://blog.aheritier.net/wp-content/uploads/2010/02/butler.png" alt="" title="butler" width="96" height="96" class="alignright size-full wp-image-875" /></a>Chez <a href="http://www.exoplatform.com">eXo platform</a> nous utilisons <a href="https://hudson.dev.java.net/">Hudson</a> pour notre <a href="http://builder.exoplatform.org">intégration continue</a>.<br />
La combinatoire entre les différents types de builds (intégration continue, reporting, packaging), les différents projets et leurs différentes branches de maintenance représente des dizaines de jobs dans Hudson.<br />
Jusqu&#8217;à présent nous utilisions les notifications standards de Hudson pour recevoir les emails avec les statuts courant des jobs.<br />
Il faut cependant avouer que celles-ci offrent très peu souplesse en ce qui concerne le contenu et les conditions de notification.<br />
<span id="more-891"></span><br />
J&#8217;ai donc installé le plugin <a href="http://wiki.hudson-ci.org/display/HUDSON/Email-ext+plugin">Hudson Email Extension Plugin</a> qui est beaucoup plus paramétrable.<br />
Après quelques tests concluant sur un nombre limité de projets, j&#8217;en viens donc au déploiement global sur l&#8217;ensemble des jobs hudson.<br />
Et là c&#8217;est la catastrophe !!!! Hudson ne propose pas d&#8217;édition en masse de ses jobs (à part le plugin <a href="http://wiki.hudson-ci.org/display/HUDSON/Configuration+Slicing+Plugin">Configuration Slicing plugin</a> mais qui ne gère qu&#8217;un nombre très restreint d&#8217;éléments de configuration).<br />
Alors comment faire ?<br />
Après un rapide tour sur la liste de diffusion du projet  on me conseil &laquo;&nbsp;tout simplement&nbsp;&raquo; d&#8217;utiliser la capacité de modification à chaud du serveur à l&#8217;aide de sa console Groovy.<br />
Celle-ci est effectivement bien plus puissante qu&#8217;un simple &laquo;&nbsp;Bulk change&nbsp;&raquo; puisque l&#8217;on peut accéder à l&#8217;ensemble des objets en mémoire sur le serveur (et donc à la configuration des jobs).<br />
Le gros avantage de cette solution &laquo;&nbsp;codée&nbsp;&raquo; c&#8217;est aussi qu&#8217;elle me permet de reprendre les listes de destinataires utilisées par le mécanisme de notification standard afin de les injecter dans la nouvelle configuration.</p>
<p>Ce script execute donc pour chaque job les étapes suivantes :</p>
<ul>
<li>Si le job est de type Maven alors j&#8217;enregistre la liste de destinataires depuis le &laquo;&nbsp;reporter&nbsp;&raquo; et je le retire du job.</li>
<li>Dans tous les cas je regarde les &laquo;&nbsp;publishers&nbsp;&raquo; actuels et si il y a les notifications standards ou du plugin mail-ext j&#8217;enregistre la liste de destinataires (donc la liste de mail-ext écrase celle de la notification standard si elle existait qui elle même écrase celle de maven si elle existait) et je retire le ou les &laquo;&nbsp;publishers&nbsp;&raquo;.</li>
<li>Je crée et rajoute au job mon nouveau &laquo;&nbsp;publisher&nbsp;&raquo; mail-ext configuré selon mes besoins.</li>
</ul>
<p>J&#8217;ai ainsi pu mettre à jour tous les jobs de mon serveur sans erreur et sans tâche manuelle fastidieuse.</p>
<p>Ci dessous le script groovy (n&#8217;étant ni expert en groovy et encore moins dans les APIs d&#8217;Hudson que je découvre, ce code doit être facilement améliorable).</p>
<pre class="brush: groovy">
import hudson.plugins.emailext.*
import hudson.plugins.emailext.plugins.trigger.*
import hudson.plugins.jira.*
import hudson.model.*
import hudson.maven.*
import hudson.maven.reporters.*
import hudson.tasks.*

// For each project
for(item in Hudson.instance.items) {
  def recipients
  println(&quot;JOB : &quot;+item.name);

  // Find current recipients defined in project

  if(item instanceof MavenModuleSet) {
    println(&quot;&gt;MAVEN MODULE SET&quot;);

    // Search for Maven Mailer Reporter
    println(&quot;&gt;&gt;Reporters&quot;);
    for(reporter in item.reporters) {
      println(&quot;&gt;&gt;&gt; &quot;+reporter);
      if(reporter instanceof MavenMailer) {
        recipients = reporter.recipients
        // remove it
        item.reporters.remove(reporter)
      }
    }
  } else
  if(item instanceof FreeStyleProject) {
    println(&quot;&gt;FREESTYLE PROJECT&quot;);
  }

  println(&quot;&gt;&gt;Publishers&quot;);
  for(publisher in item.publishersList) {
    println(&quot;&gt;&gt;&gt; &quot;+publisher);
    // Search for default Mailer Publisher
    if(publisher instanceof Mailer) {
      recipients = publisher.recipients
      // remove it
      item.publishersList.remove(publisher)
    } else
    // Or for Extended Email Publisher
    if(publisher instanceof ExtendedEmailPublisher) {
      recipients = publisher.recipientList
      item.publishers.remove(publisher)
      // remove it
      item.publishersList.remove(publisher)
    }
  }

  // If we found recipients list to send mail
  if(recipients!=null){
    println (&quot;&gt;CURRENT RECIPIENT : &quot;+recipients)
    // We create a new Extended Email Publisher
    def eep = new ExtendedEmailPublisher();
    eep.recipientList = recipients
    eep.defaultSubject = &quot;\$DEFAULT_SUBJECT&quot;
    eep.defaultContent = &quot;\$DEFAULT_CONTENT&quot;
    // With some triggers
    eep.configuredTriggers.add(new FailureTrigger(
      email : new EmailType(sendToRecipientList : true,
        body : ExtendedEmailPublisher.PROJECT_DEFAULT_BODY_TEXT,
        subject : ExtendedEmailPublisher.PROJECT_DEFAULT_SUBJECT_TEXT )))
    eep.configuredTriggers.add(new FixedTrigger(
      email : new EmailType(sendToRecipientList : true,
        body : ExtendedEmailPublisher.PROJECT_DEFAULT_BODY_TEXT,
        subject : ExtendedEmailPublisher.PROJECT_DEFAULT_SUBJECT_TEXT )))
    eep.configuredTriggers.add(new StillFailingTrigger(
      email : new EmailType(sendToRecipientList : true,
        body : ExtendedEmailPublisher.PROJECT_DEFAULT_BODY_TEXT,
        subject : ExtendedEmailPublisher.PROJECT_DEFAULT_SUBJECT_TEXT )))
    eep.configuredTriggers.add(new StillUnstableTrigger(
      email : new EmailType(sendToRecipientList : true,
        body : ExtendedEmailPublisher.PROJECT_DEFAULT_BODY_TEXT,
        subject : ExtendedEmailPublisher.PROJECT_DEFAULT_SUBJECT_TEXT )))
    eep.configuredTriggers.add(new UnstableTrigger(
      email : new EmailType(sendToRecipientList : true,
         body : ExtendedEmailPublisher.PROJECT_DEFAULT_BODY_TEXT,
        subject : ExtendedEmailPublisher.PROJECT_DEFAULT_SUBJECT_TEXT )))
    // And we add/replace it in the project
    item.publishersList.replace(eep);
  }else{
    println (&quot;&gt;NO RECIPIENT&quot;)
  }

  println(&quot;\n=======\n&quot;);
}
</pre>
<br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=8.0" /></div><div>Rating: 8.0/<strong>10</strong> (1 vote cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://blog.aheritier.net/convertir-en-masse-les-notifications-standard-hudson-par-celles-du-plugin-email-ext/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 1.934 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2010-09-09 06:46:03 -->
