<?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>aheritier.net &#187; Apache Maven</title>
	<atom:link href="http://blog.aheritier.net/tag/apache-maven/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.aheritier.net</link>
	<description></description>
	<lastBuildDate>Mon, 30 Jan 2012 16:35:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Clone all repositories from a github organization</title>
		<link>http://blog.aheritier.net/clone-all-repositories-from-a-github-organization/</link>
		<comments>http://blog.aheritier.net/clone-all-repositories-from-a-github-organization/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 22:42:47 +0000</pubDate>
		<dc:creator>Arnaud Héritier</dc:creator>
				<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Apache Maven]]></category>
		<category><![CDATA[Communauté]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Jenkinsci]]></category>

		<guid isPermaLink="false">http://blog.aheritier.net/?p=1349</guid>
		<description><![CDATA[Tomorrow I will attend the first Hackergarten at Paris. This is an event where active open-source committers can met potential contributors and help them to submit a (first) contribution. I&#8217;ll be here to help those who would like to contribute &#8230; <a href="http://blog.aheritier.net/clone-all-repositories-from-a-github-organization/">Continue reading <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>Tomorrow I will attend the first <a href="http://hackergarten-paris.eventbrite.com/" target="_blank">Hackergarten at Paris</a>.<br />
This is an event where active open-source committers can met potential contributors and help them to submit a (first) contribution.<br />
I&#8217;ll be here to help those who would like to contribute on <a href="http://jenkins-ci.org/" target="_blank">JenkinsCI</a> and <a href="http://maven.apache.org/" target="_blank">Apache Maven</a>.<br />
To prepare this event I wanted to prepare a checkout of all sources and a local repository with all required dependencies to avoid to see contributors losing their time by downloading the earth with Maven or checking out Subversion (and to not be blocked if we had some network issues).<br />
For Maven which is hosted on Subversion it is long but easy because we have a special SVN directory using svn:externals to checkout all trunks in one step : <a href="https://svn.apache.org/repos/asf/maven/trunks/" target="_blank">https://svn.apache.org/repos/asf/maven/trunks/</a><br />
But for Jenkins with several thousands of plugins and thus git repositories it is less easy to clone all of them.<span id="more-1349"></span><br />
I saw that there was everything needed in github APIs but it was late and I didn&#8217;t want to start to write a new script (One teacher told me a long long time ago that it was a quality to be idle &#8211; do it with less and less you&#8217;ll have to maintain).<br />
I asked on jenkinsci IRC channel and thanks to <a href="https://twitter.com/#!/jorgenpt" title="Jørgen P. Tjernø" target="_blank">Jørgen P. Tjernø</a> I had my reply quickly.<br />
With Ruby 1.8 (default version on Macos) :<br />
<code><br />
sudo gem install json<br />
curl -s https://github.com/api/v2/json/repos/show/jenkinsci | ruby -rubygems -e 'require "json"; JSON.load(STDIN.read)["repositories"].each {|repo| %x[git clone #{repo["url"]} }'<br />
</code><br />
With Ruby 1.9+, the json library is by default thus you just use :<br />
<code><br />
curl -s https://github.com/api/v2/json/repos/show/jenkinsci | ruby -rjson -e 'JSON.load(STDIN.read)["repositories"].each {|repo| %x[git clone #{repo["url"]} }'<br />
</code><br />
With that I&#8217;m able to clone all repositories from jenkinsci github organization.<br />
Tomorrow I&#8217;ll just have to launch a command like this to download all dependencies :<br />
<code><br />
find . -name pom.xml -maxdepth 2 -exec mvn -f {} -Dmaven.repo.local=./maven-local-repo dependency:go-offline \;<br />
</code><br />
<strong>Update :</strong> As there are more than 30 repositories in JenkinsCI Github organization, I had to call the clone command several times by adding ?page=X (X=2,..) after the url https://github.com/api/v2/json/repos/show/jenkinsci to grab all results pages.</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/clone-all-repositories-from-a-github-organization/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Graven &#8211; The best of Apache Maven and Gradle</title>
		<link>http://blog.aheritier.net/graven-the-best-of-apache-maven-and-gradle/</link>
		<comments>http://blog.aheritier.net/graven-the-best-of-apache-maven-and-gradle/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 16:24:09 +0000</pubDate>
		<dc:creator>Arnaud Héritier</dc:creator>
				<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Apache Maven]]></category>
		<category><![CDATA[Gradle]]></category>

		<guid isPermaLink="false">http://blog.aheritier.net/?p=1190</guid>
		<description><![CDATA[I&#8217;m back !!! I have a lot of things to share and I would like to restart this blog in english. I don&#8217;t yet know which frequency of publication I&#8217;ll be able to have but I will do my best &#8230; <a href="http://blog.aheritier.net/graven-the-best-of-apache-maven-and-gradle/">Continue reading <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.5" /></div><div>Rating: 8.5/<strong>10</strong> (2 votes cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m back !!! I have a lot of things to share and I would like to restart this blog in english. I don&#8217;t yet know which frequency of publication I&#8217;ll be able to have but I will do my best to keep this blog alive.<br />
To start I wanted to share with you something we developed few months ago with Gregory Boissinot (<a href="http://www.twitter.com/gboissinot">@gboissinot</a>). While we were traveling everywhere in France to show Maven and Gradle in various Java User Groups we had a strange idea : &#8220;And if we tried to do a new tool taking the best of Gradle and Apache Maven&#8221;.<span id="more-1190"></span> While we had a lot of train we started to develop it and Graven was born. For now it is only at early stage of development but you&#8217;ll find below a quick demo of it. I hope you&#8217;ll enjoy.</p>
<p><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" WIDTH="1024" HEIGHT="800" id="graven" ALIGN=""><param NAME=movie VALUE="graven.swf"></param><param NAME=quality VALUE=high></param><param NAME=bgcolor VALUE=#333399><embed src="/wp-content/uploads/2011/10/graven1.swf" quality=high bgcolor=#333399 WIDTH="1024" HEIGHT="800" NAME="graven" ALIGN="" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></embed></param></object></p>
<p>Ok, nothing is perfect and we may have to improve few things but isn&#8217;t it a good start ?<br />
As we love OpenSource spirit, we published our work on <a href="https://github.com/aheritier/graven" target="_blank">Github</a>. Feel free to contribute.</p>
<br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=8.5" /></div><div>Rating: 8.5/<strong>10</strong> (2 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://blog.aheritier.net/graven-the-best-of-apache-maven-and-gradle/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Maven : How mojo executions are ordered in a phase</title>
		<link>http://blog.aheritier.net/maven-how-mojo-executions-are-ordered-in-a-phase/</link>
		<comments>http://blog.aheritier.net/maven-how-mojo-executions-are-ordered-in-a-phase/#comments</comments>
		<pubDate>Fri, 14 Jan 2011 23:10:52 +0000</pubDate>
		<dc:creator>Arnaud Héritier</dc:creator>
				<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Apache Maven]]></category>

		<guid isPermaLink="false">http://blog.aheritier.net/?p=1153</guid>
		<description><![CDATA[Note that I&#8217;m switching to english for this blog entry but I&#8217;m not yet sure it will be always the case &#8230; I&#8217;m testing After reporting a regression in M2 -> M3 upgrade (see MNG-4975) I discovered I didn&#8217;t understood &#8230; <a href="http://blog.aheritier.net/maven-how-mojo-executions-are-ordered-in-a-phase/">Continue reading <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.5" /></div><div>Rating: 6.5/<strong>10</strong> (2 votes cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p><i>Note that I&#8217;m switching to english for this blog entry but I&#8217;m not yet sure it will be always the case &#8230; I&#8217;m testing <img src='http://blog.aheritier.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  </i><br />
After reporting a regression in M2 -> M3 upgrade (see <a href="http://jira.codehaus.org/browse/MNG-4975">MNG-4975</a>) I discovered I didn&#8217;t understood how is computed the execution order of mojos in a Maven phase (Thanks Benjamin Bentmann).<br />
<span id="more-1153"></span><br />
As you know Maven is built around the notion of <a href="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html">build lifecycle</a>. You call a maven phase in your project and Maven will execute all phases to go up to the one you asked. For each phase it will execute a set of Mojos bound on it.<br />
The question is what happens if several mojos (from the same or different plugins) are bound to the same phase. In which order are they executed ?<br />
The reply is : <strong>in the order of declaration in the POM</strong>. Thus the important thing to understand is that <strong>the id used for an execution to bind a mojo to a phase isn&#8217;t used to compute this order</strong>.<br />
And what about inheritance ? <strong>Executions of the parent are done before the child executions.</strong><br />
Our team will add a clear documentation about this <a href="http://maven.apache.org/guides/mini/guide-configuring-plugins.html">in plugins configuration documentation</a>. What is important to understand it is that there is no magic in Maven (just few holes in the documentation and we are doing our best to fill them).</p>
<br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=6.5" /></div><div>Rating: 6.5/<strong>10</strong> (2 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://blog.aheritier.net/maven-how-mojo-executions-are-ordered-in-a-phase/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Soirée build au Lyon JUG</title>
		<link>http://blog.aheritier.net/soiree-build-au-lyon-jug/</link>
		<comments>http://blog.aheritier.net/soiree-build-au-lyon-jug/#comments</comments>
		<pubDate>Mon, 22 Nov 2010 10:09:50 +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=1125</guid>
		<description><![CDATA[Ce mardi soir je serai au LyonJUG pour une soirée build. La soirée commencera à 19h et aura lieu à l&#8217;EPITECH. En première partie de soirée Grégory Boissinot de Zénika (sponsor de la soirée, merci à eux) vous montrera comment &#8230; <a href="http://blog.aheritier.net/soiree-build-au-lyon-jug/">Continue reading <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.0" /></div><div>Rating: 7.0/<strong>10</strong> (3 votes cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lyonjug.org/"><img src="http://blog.aheritier.net/wp-content/uploads/2010/11/LyonJUG1.png" alt="LyonJUG" title="LyonJUG" width="150" height="62" class="alignright size-full wp-image-1138" /></a>Ce mardi soir je serai au <a href="http://www.lyonjug.org/evenements-a-venir/gradle-maven3">LyonJUG</a> pour une soirée build.<br />
La soirée commencera à 19h et aura lieu à l&#8217;<a href="http://maps.google.fr/maps/ms?ie=UTF8&#038;hl=fr&#038;msa=0&#038;msid=106617408127832779365.0004920117ae42c9b37f3&#038;t=h&#038;ll=45.754873,4.858789&#038;spn=0,0&#038;source=embed">EPITECH</a>.<br />
<span id="more-1125"></span><br />
<a href="http://gradle.org/"><img src="http://blog.aheritier.net/wp-content/uploads/2010/11/gradle_logo.png" alt="Gradle" title="Gradle" width="150" height="66" class="alignleft size-full wp-image-1136" /></a>En première partie de soirée <a href="http://www.boissinot.net/">Grégory Boissinot</a> de <a href="http://www.zenika.com/">Zénika</a> (sponsor de la soirée, merci à eux) vous montrera comment <a href="http://gradle.org/">Gradle</a> révolutionera l&#8217;avenir du build &#8230; ( ou pas <img src='http://blog.aheritier.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  )</p>
<p><a href="http://maven.apache.org/"><img src="http://blog.aheritier.net/wp-content/uploads/2010/11/maventxt_logo_200.png" alt="Apache Maven" title="Apache Maven" width="200" height="53" class="alignright size-full wp-image-1139" /></a>Pour ma part, dans la seconde partie, je me concentrerai sur <a href="http://maven.apache.org/">Maven 3</a>. Je vous ferai découvrir ce que la toute nouvelle version 3.0 peut déjà vous apporter aujourd&#8217;hui (La 3.0.1 sera très bientôt dans tous les bacs !) et ce que les prochaines versions 3.x vont apporter dans l&#8217;année qui vient. </p>
<p>A demain et n&#8217;oubliez surtout pas de vous <a href="http://www.jugevents.org/jugevents/event/show.html?id=31514">inscrire</a> !</p>
<br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=7.0" /></div><div>Rating: 7.0/<strong>10</strong> (3 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://blog.aheritier.net/soiree-build-au-lyon-jug/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Séance Dédicace à la librairie Le Monde en Tique</title>
		<link>http://blog.aheritier.net/seance-dedicace-a-la-librairie-le-monde-en-tique/</link>
		<comments>http://blog.aheritier.net/seance-dedicace-a-la-librairie-le-monde-en-tique/#comments</comments>
		<pubDate>Wed, 20 Oct 2010 05:00:03 +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>

		<guid isPermaLink="false">http://blog.aheritier.net/?p=1113</guid>
		<description><![CDATA[Roulements de tambours, faites sonner les trompettes, je sors de chez moi Ce samedi 23 octobre de 15h à 18h je serai à la librairie Le Monde en Tique pour une séance dédicace EXCEPTIONNELLE !! Bien sur vous pourrez y &#8230; <a href="http://blog.aheritier.net/seance-dedicace-a-la-librairie-le-monde-en-tique/">Continue reading <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>Roulements de tambours, faites sonner les trompettes, je sors de chez moi <img src='http://blog.aheritier.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Ce samedi 23 octobre de 15h à 18h je serai à la librairie <a href="http://www.lmet.fr/">Le Monde en Tique</a> pour une séance dédicace EXCEPTIONNELLE !!<br />
Bien sur vous pourrez y retrouver mon livre <a href="http://www.pearson.fr/livre/?GCOI=27440100730370">Apache Maven aux éditions Pearson</a>, mais je sais que vous l&#8217;avez déjà tous sous votre oreiller.<br />
Alors je n&#8217;y serai pas seul. Je serai accompagné par deux pointures, que dis-je ! Deux monstres sacrés de la communauté Java francophone.<br />
<a href="http://blog.aheritier.net/wp-content/uploads/2010/10/dedicace.jpg"><img src="http://blog.aheritier.net/wp-content/uploads/2010/10/dedicace.jpg" alt="" title="dedicace" width="416" height="166" class="aligncenter size-full wp-image-1114" /></a><br />
<span id="more-1113"></span></p>
<p>Le premier n&#8217;est autre qu&#8217;<a href="http://emmanuelbernard.com/About%20me.html">Emmanuel Bernard</a>, surnommé <a href="http://www.parisjug.org/xwiki/bin/view/Meeting/20100309">&#8220;Chuck Norris&#8221;</a> ! Cependant ses amis ont plutôt tendance à l&#8217;appeler l&#8217;homme aux mitaines depuis les révélations qu&#8217;il a pu faire dans le podcast <a href="http://lescastcodeurs.com/">Les CastCodeurs</a> qu&#8217;il a crée l&#8217;année dernière. Contributeur OpenSource depuis les origines du monde il a fortement contribué à <a href="http://hibernate.org/">Hibernate</a> et se consacre aujourd&#8217;hui à <a href="http://www.hibernate.org/subprojects/search.html">Hibernate Search</a> pour lequel il a publié un ouvrage : <a href="http://www.manning.com/bernard/">Hibernate Search in Action aux éditions Manning</a>.</p>
<p>Mon deuxième compère est une figure de la communauté Java Francophone. C&#8217;est à lui que l&#8217;on doit la revolution des Java User Group en France qui se sont sont mis à fleurir après qu&#8217;il ait lancé <a href="http://www.parisjug.org/">l&#8217;instance parisienne</a> qui accueille désormais 200 personnes chaque mois. Il participa à travers le <a href="http://jcp.org/">JCP</a> (JSR 316, JSR 317, JSR 318) à la création de JEE6 qu&#8217;il vous décrit, dissect, explique dans son ouvrage<a href="http://apress.com/book/view/143022889X"> Java EE 6 aux éditions Apress</a> qui en est déjà à sa seconde édition. Dans un tout autre registre il nous a promis de faire sur place une démonstration de ses talents de danseur avec entorse à la clef. </p>
<p>Alors si vous voulez venir discuter avec nous, manger quelques petits gateaux ou encore rencontrer les pom-pom girls qu&#8217;Antonio nous a promis, rejoignez nous ce samedi 23 octobre de 15h à 18h à la librairie <a href="http://www.lmet.fr/">Le Monde en Tique</a> (6 Rue Maître Albert, 75005 Paris).<br />
Nous ne ferons pas de discrimination. Nous accepterons de discuter même avec ceux qui ne font pas du Java et qui n&#8217;ont pas acheté nos 3 livres.</p>
<p><iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.fr/maps?hl=&amp;q=6 rue Maître Albert paris&amp;ie=UTF8&amp;hnear=6 Rue Maître Albert, 75005 Paris, Ile-de-France&amp;z=14&amp;ll=48.850881,2.349899&amp;output=embed"></iframe><br /><small><a href="http://maps.google.fr/maps?hl=&amp;q=6 rue Maître Albert paris&amp;ie=UTF8&amp;hnear=6 Rue Maître Albert, 75005 Paris, Ile-de-France&amp;z=14&amp;ll=48.850881,2.349899&amp;source=embed" style="color:#0000FF;text-align:left">View Larger Map</a></small></p>
<p><b>Un invité mystère pourrait être présent ce jour là et dans ce cas vous pourriez avoir des copies de mon livre d&#8217;une valeur unique <img src='http://blog.aheritier.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </b></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/seance-dedicace-a-la-librairie-le-monde-en-tique/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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/">Continue reading <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 &#8220;chance&#8221; (?) 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 />
<iframe src="http://www.slideshare.net/slideshow/embed_code/4365708" width="650" height="526" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/></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/">Continue reading <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.6" /></div><div>Rating: 6.6/<strong>10</strong> (5 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.6" /></div><div>Rating: 6.6/<strong>10</strong> (5 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://blog.aheritier.net/le-bug-maven-du-jour-mresources-104/feed/</wfw:commentRss>
		<slash:comments>10</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/">Continue reading <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>14</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/">Continue reading <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 />
<iframe src="http://www.slideshare.net/slideshow/embed_code/3843621" width="650" height="526" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/></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 &#8220;reactor&#8221; 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/">Continue reading <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.9" /></div><div>Rating: 9.9/<strong>10</strong> (9 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 &#8220;reactor&#8221; 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 &#8220;reactor&#8221; 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 &#8220;construire&#8221; 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>
<p>
<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.
</p>
<pre>arnaud@mbp-arnaud:~$ mvn install
[INFO] ------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Project ....................... SUCCESS [2.132s]
[INFO] ModuleA ....................... SUCCESS [5.574s]
[INFO] ModuleB ....................... SUCCESS [0.455s]
[INFO] ModuleC ....................... SUCCESS [0.396s]
[INFO] ModuleD ....................... SUCCESS [0.462s]
[INFO] ModuleE ....................... SUCCESS [0.723s]
[INFO] ModuleF ....................... SUCCESS [0.404s]
[INFO]
</pre>
</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 &#8220;-f chemin_vers_un_pom.xml&#8221;. Cela vous fait gagner aussi du temps en évitant de charger Maven et la JVM plusieurs fois. Enfin le fait que Maven utilise son &#8220;reactor&#8221;, 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 &#8220;install&#8221; 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.9" /></div><div>Rating: 9.9/<strong>10</strong> (9 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://blog.aheritier.net/construire-moins-pour-aller-plus-vite/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

