<?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 &#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>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>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>Maven Release Plugin 2.0</title>
		<link>http://blog.aheritier.net/maven-release-plugin-2-0/</link>
		<comments>http://blog.aheritier.net/maven-release-plugin-2-0/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 02:00:59 +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=845</guid>
		<description><![CDATA[Après 9 beta la version 2.0 du plugin release est enfin disponible. Les derniers coups de tournevis apportés à ce dernier devraient en ravir plus d&#8217;un !! Le plug-in supporte désormais les projets en structure &#171;&#160;flat&#160;&#187; ou aussi nommée &#171;&#160;en &#8230; <a href="http://blog.aheritier.net/maven-release-plugin-2-0/">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://blog.aheritier.net/wp-content/uploads/2009/06/maventxt_logo_200.png"><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>Après 9 beta la version 2.0 du plugin release est enfin disponible. Les derniers coups de tournevis apportés à ce dernier devraient en ravir plus d&#8217;un !!<br />
<span id="more-845"></span></p>
<ul>
<li><strong>Le plug-in supporte désormais les projets en structure &laquo;&nbsp;flat&nbsp;&raquo; ou aussi nommée &laquo;&nbsp;en râteau&nbsp;&raquo;</strong>. Pour ces projets ( pour diverses bonnes ou moins bonnes raisons ) le POM parent n&#8217;est pas en même temps le réacteur des sous modules. Le parent est un sous-module à part entière. Jusqu&#8217;à présent le plug-in release ne fonctionnait pas sur ce type de projet. C&#8217;est enfin une chose corrigée.</li>
<li><strong>Les bugs les plus récalcitrants du goal branch sont corrigés.</strong> Vous pouvez utiliser ce dernier par exemple pour créer une branche depuis le trunk avant de faire la release pour passer sur une branche dite de stabilisation. Ou alors vous pouvez créer la branche depuis un tag pour créer une branche de maintenance de la version en question. Dans tous les cas le plugin prend en charge la modification des versions dans les POMs, chose que l&#8217;on sait bien ennuyeuse (et dangereuse) à faire à la main.</li>
<li><strong>Le plug-in release contrôle à nouveau correctement les modifications locales (fichiers modifiés ou ajoutés et non commités) avant de démarrer le processus de release ou de création d&#8217;une branche.</strong> Cette fonctionnalité était buggée depuis la version 2.0-beta-8 (cf. <a href="http://jira.codehaus.org/browse/MRELEASE-481">MRELEASE-481</a>).</li>
<li>Enfin, je pense qu&#8217;il s&#8217;agit de la correction la plus attendue de tous : <strong>Il n&#8217;est plus nécessaire pendant la phase de préparation d&#8217;installer les artifacts du projet dans le repository local.</strong> A l&#8217;origine, lié à un problème dans le noyau de Maven, Il était très souvent nécessaire de configurer le goal <code>prepare</code> du plugin pour faire une installation des artifacts plutot qu&#8217;une vérification sans quoi la release échouait faute de trouver les dépendances entre modules. Cela avait les désavantages de couter du temps (le packaging de gros artifacts comme des WARs ou EARs prend beaucoup de temps au niveau du build à cause de l&#8217;utilisation intensive des IOs de la machine) et surtout de pouvoir produire lors de cette phase qu&#8217;une partie des binaires de la version en cours de release si cette dernière echouait. C&#8217;est pour cela que la phase <code>prepare</code> ne doit faire qu&#8217;exécuter les tests sans créer les binaires et si tout se passe bien c&#8217;est la phase <strong>perform</strong> qui générera ces derniers. Ceci est désormais rentré dans le bon ordre et suit l&#8217;idée d&#8217;origine du plugin (la fameuse raison des deux phases).</li>
</ul>
<p>La <a href="http://maven.apache.org/plugins/maven-release-plugin/">documentation du plugin</a> est à jour. Vous pouvez retrouver le détail des modifications dans la <a href="http://jira.codehaus.org/secure/ReleaseNote.jspa?projectId=11144&#038;styleName=Html&#038;version=15113">Release Note de cette version</a>.</p>
<p><strong>Bonne release à tous !!</strong></p>
<p><em>Question aux produits concurrents : Vous faites comment pour offrir ce service à vos utilisateurs ?</em></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/maven-release-plugin-2-0/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>From Apache Archiva to Sonatype Nexus</title>
		<link>http://blog.aheritier.net/from-apache-archiva-to-sonatype-nexus/</link>
		<comments>http://blog.aheritier.net/from-apache-archiva-to-sonatype-nexus/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 07:00:51 +0000</pubDate>
		<dc:creator>Arnaud Héritier</dc:creator>
				<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Apache Archiva]]></category>
		<category><![CDATA[Apache Maven]]></category>
		<category><![CDATA[Sonatype Nexus]]></category>

		<guid isPermaLink="false">http://blog.aheritier.net/?p=597</guid>
		<description><![CDATA[This article was firstly published in this blog in french in May 2009 and later in english in Sonatype Blog. I put a copy here as an archive. &#60;disclaimer&#62; As a member of the Archiva team (though rarely active, I &#8230; <a href="http://blog.aheritier.net/from-apache-archiva-to-sonatype-nexus/">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><em>This article was firstly published <a href="http://blog.aheritier.net/dapache-archiva-a-sonatype-nexus-introduction/" title="D’Apache Archiva à Sonatype Nexus – Introduction" >in this blog</a> in french in May 2009 and later in english in <a href="http://www.sonatype.com/people/2009/07/from-apache-archiva-to-sonatype-nexus/">Sonatype Blog</a>. I put a copy here as an archive.</em></p>
<p><em>&lt;disclaimer&gt; As a member of the <a href="http://archiva.apache.org/">Archiva</a> team (though rarely active, I admit) I will try to defend it throughout this article. However, being a professional consultant first and foremost, I hope to keep my objectivity. I&#8217;ll let you be the judge &#8230;  &lt;/disclaimer&gt;<br />
</em></p>
<p>Having recently migrated a significant number of repository servers from <a href="http://archiva.apache.org/">Apache Archiva</a> to <a href="http://nexus.sonatype.org/">Sonatype Nexus</a>, I would like to share with you the process I followed, some tips, and point out a few pitfalls I encountered.<a href="http://blog.aheritier.net/wp-content/uploads/2009/05/nexus-real-logo.png"><img class="alignright size-medium wp-image-458" title="nexus-real-logo" src="http://blog.aheritier.net/wp-content/uploads/2009/05/nexus-real-logo-300x99.png" alt="nexus-real-logo" width="300" height="99" /></a><br />
A big Thank you to <a href="http://www.tarpoon.org/">Tarpoon</a>, <a href="http://www.cestpasdur.com/">C&#8217;est pas dur</a> and all of my team for helping.</p>
<p><span id="more-597"></span></p>
<h1>Introduction</h1>
<h2>Background</h2>
<p>A little background to this migration: We had a large enterprise-scale implementation with dozens of JEE projects of all sizes (from a mouse to the ocean liner &#8211; and NO! I am not talking about the Titanic!), and at least 200 active developers accessing the system simultaneously during the day.<br />
Most projects are using Maven. To help teams to <strong>make </strong> better and faster builds we offered a complete infrastructure for continuous integration: a big server (Dual QuadCore Xeon with 16GB RAM running Red Hat Enterprise Linux 5.1),  hosting an <a href="http://www.atlassian.com/software/bamboo/">Atlassian Bamboo</a> continuous integration server with (approximately): 110 (real time) continuous integration builds, 40 (daily) maven sites builds, 20 (daily) <a href="http://sonar.codehaus.org/">Sonar</a> builds. It also hosted a Maven repository server  (Archiva 1.1.1 before migrating), which stored a little less than a dozen local repositories and provided a proxy and cache for twenty external repositories (for almost 400GB of data).<br />
The majority of that space was used by the repository of internal snapshots (200GB) and the repository of internal releases (150GB). To understand these sizes you must know that some projects may produce (for good or bad reasons) some EARs up to 100MB in size. By adding the sizes of JARs and WARs that compose these EARs, each deployment quickly grows to take up a lot of space.</p>
<h2>Why change?</h2>
<p>For several months we were having stability issues with our integration environment. From one build to another we would see execution times fluctuate widely. We also had intermittent errors that were not related to projects, but to the infrastructure :</p>
<ul>
<li>500 or 502 errors on uploads in Archiva without any apparent reason (I tried to track down the issues without success),</li>
<li>Many periods of unavailability of Archiva or Bamboo after exceeding the maximum number of open file descriptors allowed for the user. We must concede that these tools handle a lot of files (downloads, uploads, and other manipulations on a large number of artifacts). Archiva easily exceeds the default limit of 1024 descriptors which forced us to increase it. But even at 2048 Archiva would still occasionally exceed the limit.</li>
<li>Inability to download snapshots if the local repository used by Bamboo was emptied just prior to that. This resulted in regular failures of our Maven sites or Sonar builds.</li>
</ul>
<p>We recently submitted a bug against Archiva (<a href="http://jira.codehaus.org/browse/MRM-1136">MRM-1136</a>), for which I spent several hours diagnosing the issue (problems with management of meta-data issued by Maven 2.1.0). To resolve the issue would require us to quickly upgrade to Archiva 1.1.4 or 1.2.</p>
<p>All of these problems, even though they were only occasional, strongly discredited our continuous integration service. How could we criticize a project for not using our CI if it kept sending them false negatives? They already have enough work with addressing real errors in their builds. The continuous integration environment must be as reliable as a Swiss watch.</p>
<p>It was time for us to act.</p>
<p>We could update Archiva, which would entail significant validation costs without much improvement. Apart from the incompatibility with Maven 2.1.0, nothing suggested that the new version fixed any of our problems and there were few improvements/new features at that time, due to lack of time by the maintainers.</p>
<p>The other choice was to get another tool with the potential to meet the new requirements.</p>
<p>The feedback from the community about Nexus was very encouraging. Moreover, the latter pro version opens up new possibilities for the future with its innovative features:</p>
<ul>
<li>Staging repositories to put artifacts being validated in a temporary area prior to delivery.</li>
<li>Opportunity to proxy and aggregate eclipse update sites. Currently we are doing it by hand, which is expensive, complicated (I hate P2), and boring.</li>
<li>and more&#8230;</li>
</ul>
<p>As the situation seemed to be calling for it, we decided to try our luck with Nexus.</p>
<h1>Migration</h1>
<p>Let&#8217;s get started.</p>
<h2>Existing environment</h2>
<p>A little overview of our existing environment. Before the migration, our environment was like this:</p>
<div id="attachment_609" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.aheritier.net/wp-content/uploads/2009/07/ArchivaNexusBeforeMigration.png"><img class="size-medium wp-image-609" title="The environment before the migration" src="http://blog.aheritier.net/wp-content/uploads/2009/07/ArchivaNexusBeforeMigration-300x227.png" alt="The environment before the migration" width="300" height="227" /></a><p class="wp-caption-text">The environment before the migration</p></div>
<p>We were hosting our internal repositories in what Archiva calls managed repositories. There is one for releases, one for snapshots and another one for third-party libraries (often those delivered by closed-source vendors).<br />
To cache external repositories (configured as &laquo;&nbsp;remote repositories&nbsp;&raquo;) we are using two more repositories (one for external releases and one for external snapshots).</p>
<p>Our Archiva shows two groups: One to access released artifacts, and another one for snapshots. We never set up a unique group with access to both of them because in our tests we noticed that Archiva often had issues merging descriptors coming from several repositories (maven-metadata.xml), and it can have dramatic consequences if you mix up releases and snapshots.</p>
<p>Groups allow to greatly simplify Maven configuration, avoiding the need to declare too many repositories. Moreover, they enhance your Maven experience, speeding up your builds. Each missing dependency request is sent only once to each group, while the process in the background polls each repository in the group and maintains a cache about missing dependencies to further speed up the build. Sending missing dependency requests to several repositories is an inexcusable waste of time.</p>
<p>Repository users (developers and the continuous integration server) access them using these settings :</p>
<pre class="brush: xml">
&lt;settings&gt;
  &lt;profiles&gt;
    &lt;profile&gt;
      &lt;id&gt;default&lt;/id&gt;
      &lt;repositories&gt;
        &lt;repository&gt;
          &lt;id&gt;central&lt;/id&gt;
          &lt;url&gt;http://serveur.entreprise.fr/archiva/repository/releases/ &lt;/url&gt;
          &lt;releases&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/releases&gt;
          &lt;snapshots&gt;&lt;enabled&gt;false&lt;/enabled&gt;&lt;/snapshots&gt;
        &lt;/repository&gt;
        &lt;repository&gt;
          &lt;id&gt;snapshots&lt;/id&gt;
          &lt;url&gt;http://serveur.entreprise.fr/archiva/repository/snapshots/ &lt;/url&gt;
          &lt;releases&gt;&lt;enabled&gt;false&lt;/enabled&gt;&lt;/releases&gt;
          &lt;snapshots&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/snapshots&gt;
        &lt;/repository&gt;
      &lt;/repositories&gt;
     &lt;pluginrepositories&gt;
        &lt;pluginrepository&gt;
          &lt;id&gt;central&lt;/id&gt;
          &lt;url&gt;http://serveur.entreprise.fr/archiva/repository/releases/ &lt;/url&gt;
          &lt;releases&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/releases&gt;
          &lt;snapshots&gt;&lt;enabled&gt;false&lt;/enabled&gt;&lt;/snapshots&gt;
        &lt;/pluginrepository&gt;
        &lt;pluginrepository&gt;
          &lt;id&gt;snapshots&lt;/id&gt;
          &lt;url&gt;http://serveur.entreprise.fr/archiva/repository/snapshots/ &lt;/url&gt;
          &lt;releases&gt;&lt;enabled&gt;false&lt;/enabled&gt;&lt;/releases&gt;
          &lt;snapshots&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/snapshots&gt;
        &lt;/pluginrepository&gt;
      &lt;/pluginrepositories&gt;
    &lt;/profile&gt;
  &lt;/profiles&gt;
  &lt;activeprofiles&gt;
    &lt;activeprofile&gt;default&lt;/activeprofile&gt;
  &lt;/activeprofiles&gt;
&lt;/settings&gt;
</pre>
<p>By redefining the central server address (normally located here: <a href="http://repo1.maven.org/maven2/">http://repo1.maven.org/maven2/</a>) we configured Maven to look only for released artifacts in our group in Archiva. This gives us access to both internal and external releases. In the same way, the repository snapshots allow us to obtain development versions of all artifacts.</p>
<h2>Constraints</h2>
<p>Migrating a server isn&#8217;t easy when you have 200 developers using it every day.</p>
<p>First, we had to be sure to only stop the service for a very short time (or we would have to do it outside of working hours&#8230; ouch!!!). Stopping the continuous integration server temporarily isn&#8217;t such a big problem. Asking all teams to use maven in offline mode, and not to use our repositories is more difficult. Usually, we don&#8217;t have to wait long before someone needs to download a new artifact or a project has to do a release.</p>
<p>Secondly, it was mandatory for us to keep the compatibility with preexisting Maven settings. Due to the large number of projects and developers it would be impossible to change all repositories settings in Maven configuration. It would impact all projects and all developers if we changed the upload URLs (distributionManagement) and download settings (repositories).</p>
<h2>The process</h2>
<p>To reduce cost, we decided to not perform our tests in a test environment. This would require us to duplicate the entire integration environment we have in production.<br />
After some basic tests performed on the tool, the real baptism by fire was the scalability of the server (with an increasing volume of data and number of users).<br />
During migration system resources allowed us to easily handle both servers in parallel. We chose the strategy to run Archiva and Nexus in parallel and to switch services to the new server one after another, while keeping the fallback option to revert if necessary.</p>
<p>We had enough space to rebuild caches of external repositories (this required only a few gigabytes), however we could not duplicate our internal repositories, which are too large, and we could have consistency issues. We also did not want to give both products access to internal repositories, because we feared they might access them simultaneously and corrupt our data. Therefore we began our migration leaving our internal repositories on Archiva planning to move them to Nexus at the end of migration.</p>
<p>For URL compatibility we used rewriting rules on the Apache server. It would switch between old and new URLs in a transparent manner.</p>
<h2>Installing Nexus</h2>
<p>We performed a classic installation of Nexus 1.3.2 (the opensource and standalone bundle) adjusting a few parameters such as the HTTP port, the paths of data and log directories to conform to the organization of our server. All this was quickly done because unlike Archiva we did not have to create a database (which had to be in mysql to follow our standards). Our server was up and ready to be configured.</p>
<h2>Configuration of groups and external repositories</h2>
<p>We started the Nexus configuration by creating proxy repositories. We also added, for purposes of migration, proxies for our internal repositories hosted on Archiva.</p>
<p>The GUI is ergonomic which makes the registration of 20 external repositories very bearable. Thank you <a href="http://extjs.com/">ExtJS</a>!</p>
<p>Unlike Archiva which proposes to store the artifacts of external repositories in the same local repository, Nexus stores the contents of each in a dedicated repository (proxy).</p>
<p>Regarding settings of external repositories, it should be noted that we lose the opportunity provided by Archiva to have white and black lists of artifacts coming from each external repository. Nexus uses the concept of &laquo;&nbsp;routes&nbsp;&raquo; for this type of filtering. Unfortunately we can apply those routes only at a group level and not on a repository.<br />
Since some lists that we have in Archiva are only for performance issues (e.g. do not query a repository in which we know that a certain artifact is not located), we decided to not duplicate this setup in Nexus waiting to see if there were real problems.</p>
<p>In our setting we faced a first disappointment. As we have to proxy some repositories hosted internally (the one delivered by the Sonar server and all of those always on Archiva during the migration) we were forced to declare the company web proxy on each proxy repository. It is impossible to define the web proxy in the global configuration of Nexus and to disable it on a given proxy repository (<a href="https://issues.sonatype.org/browse/NEXUS-2317">NEXUS-2317</a>).</p>
<p>While our external repositories configuration was almost complete, we had our first big setback. We discovered that it was impossible to proxy repositories which are in the legacy layout of maven 1 (at Atlassian and dev.java.net for example).<br />
To achieve this we need to create virtual repositories which are used by Nexus to convert a repository from one format to another. Tough luck, because two bugs (<a href="https://issues.sonatype.org/browse/NEXUS-1909">NEXUS-1909</a>, <a href="https://issues.sonatype.org/browse/NEXUS-1910">NEXUS-1910</a>) prevented us from doing it.<br />
Fortunately for us, the Nexus team has been very responsive and was able to incorporate the corrections to these bugs in version 1.3.3 which was published the day after our discovery. Otherwise we have to admit that we probably would not have continued our tests on Nexus.<br />
We have updated our server which allowed us to see that the process was very simple since the application, its configuration, and the data were all well separated.</p>
<p>We finalized the configuration of Nexus by creating groups. That is the same concept as in Archiva (which copied it).<br />
The configuration of groups is however relatively poorly designed in terms of ergonomics. We had to select each repository we wanted to add to the group and then put it in the correct order in the list. The order is very important, because Nexus will use it to search for artifacts. We must therefore place  internal repositories prior to external ones. The problem is that this list displays only the name of each repository (and the name is often truncated because of its length). So you should be careful in naming your repositories to be able to easily sort them when you have several dozen in a group.</p>
<p>We followed Nexus recommendations by creating a single group that exposes all releases and all snapshots. (This will help us avoid having to battle the screen for configuring a group twice <img src='http://blog.aheritier.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ).</p>
<p>From now we were supposed to be able to download all artifacts needed to build our projects with Nexus.</p>
<p>After several successful tests on our desktop we tested the whole system with our continuous integration server.<br />
We deleted its local repository and updated its configuration:</p>
<pre class="brush: xml">
&lt;settings&gt;
  &lt;mirrors&gt;
    &lt;mirror&gt;
      &lt;!--This sends everything else to /public --&gt;
      &lt;id&gt;nexus&lt;/id&gt;
      &lt;mirrorof&gt;*&lt;/mirrorof&gt;
      &lt;url&gt;http://serveur.entreprise.fr/nexus/content/groups/public/ &lt;/url&gt;
    &lt;/mirror&gt;
  &lt;/mirrors&gt;
  &lt;profiles&gt;
    &lt;profile&gt;
      &lt;id&gt;default&lt;/id&gt;
      &lt;!--Enable snapshots for the built in central repo to direct --&gt;
      &lt;!--all requests to nexus via the mirror --&gt;
      &lt;repositories&gt;
        &lt;repository&gt;
          &lt;id&gt;central&lt;/id&gt;
          &lt;url&gt;http://central &lt;/url&gt;
          &lt;releases&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/releases&gt;
          &lt;snapshots&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/snapshots&gt;
        &lt;/repository&gt;
      &lt;/repositories&gt;
     &lt;pluginrepositories&gt;
        &lt;pluginrepository&gt;
          &lt;id&gt;central&lt;/id&gt;
          &lt;url&gt;http://central &lt;/url&gt;
          &lt;releases&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/releases&gt;
          &lt;snapshots&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/snapshots&gt;
        &lt;/pluginrepository&gt;
      &lt;/pluginrepositories&gt;
    &lt;/profile&gt;
  &lt;/profiles&gt;
  &lt;activeprofiles&gt;
    &lt;!--make the profile active all the time --&gt;
    &lt;activeprofile&gt;default&lt;/activeprofile&gt;
  &lt;/activeprofiles&gt;
&lt;/settings&gt;
</pre>
<p><strong>Please note:</strong>  I am not at all a fan of using the mirror * which requires us to put releases and snapshots in the same group. However, this is the only solution, as there is no way to tell Maven to find releases on one mirror location and snapshots on another one. I find this dangerous because e.g. when you call a plugin without defining its version (a plugin in command line such as eclipse:eclipse or archetype:generate) you may retrieve a snapshot version of it. Thus you have to take care to follow the recommendation of Maven to define all the versions of plugins that are used in your project descriptor (directly or by inheritance) to avoid surprises. In our context we won&#8217;t have this issue since the recommendation is followed by all projects using a parent POM that is setting all versions for them.</p>
<p>The environment with Nexus and Archiva running in parallel was now ready to go :</p>
<div id="attachment_610" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.aheritier.net/wp-content/uploads/2009/07/ArchivaNexusWhileMigrating.png"><img class="size-medium wp-image-610" title="The environment while migrating" src="http://blog.aheritier.net/wp-content/uploads/2009/07/ArchivaNexusWhileMigrating-300x153.png" alt="The environment while migrating" width="300" height="153" /></a><p class="wp-caption-text">The environment while migrating</p></div>
<p>Nothing changed for developers who still use Archiva while the continuous integration server retrieves all artifacts from Nexus.</p>
<h2>Tuning</h2>
<p>After testing it a few days we could see that Nexus sometimes had difficulty quickly delivering artifacts. The time has come to look at a few more advanced settings.</p>
<p>Routes allow to restrict the list of repositories that Nexus has to verify when we request an artifact to a group. This can be done via permissions or prohibitions.</p>
<p>The first route we create is the one which tells to Nexus to search for our artifacts (.*/com.mycompany/.*) only in proxy repositories giving access to our internal artifacts on Archiva. <em>When the switch to Nexus will be completely finalized, this route will point only to our internal repositories hosted by Nexus.</em></p>
<p>We also add rules for .*/org/apache/.* and .*/org/codehaus/.* which are heavily used by Maven, so that artifacts are retrieved only from the central repository and snapshots repositories of each community.</p>
<p>This gave a pretty good boost to our Nexus implementation.</p>
<p>After several days of use by the continuous integration server, Nexus was running fine. Therefore we got ready for the second part of our migration: hosting of our internal repositories on Nexus.</p>
<h2>Setting internal repositories and security</h2>
<p>Before we could move internal repositories from Archiva to Nexus we had to create hosted repositories. We created directories for our repositories in a different location from Archiva, as to not let both products access the same data. We reused repository identifiers used in Archiva to easily create rewriting rules on Apache HTTP server.</p>
<p>We spent some time learning the security mechanism in Nexus. Settings are so fine that even the most basic use cases require convoluted settings.</p>
<p>We began by creating privileges (read, write, update) on each hosted repository. We created roles that grouped some privileges on hosted repositories together. In our case, one role to deploy released artifacts on repositories (for projects teams) and another role to deploy snapshots on repositories (for continuous integration server).</p>
<p>We finished by creating users with roles defined above without forgetting the role to download from any repository.</p>
<p>Internal repositories were ready, all was left to do was to move data to Nexus and to stop Archiva.</p>
<h2>The final steps</h2>
<p>To keep the compatibility between Archiva and Nexus we had to do two things.<br />
For each internal repository on which we&#8217;ll have to upload artifacts we explicitly wrote a rule to transform the URL from Archiva to Nexus.<br />
Apache configuration example:</p>
<pre class="brush: text">
RewriteRule ^/archiva/repository/internal-releases/(.*) http://localhost/nexus/content/repositories/internal-releases/$1 [P]
RewriteRule ^/archiva/repository/internal-snapshots/(.*) http://localhost/nexus/content/repositories/internal-snapshots/$1 [P]
RewriteRule ^/archiva/repository/third-parties/(.*) http://localhost/nexus/content/repositories/third-parties/$1 [P]
</pre>
<p>For all other types of read access we just created a rule which transfered them to our unique group in Nexus.<br />
Apache configuration example:</p>
<pre class="brush: text">
RewriteRule ^/archiva/repository/[a-z\-]+/(.*) http://localhost/nexus/content/groups/public/$1 [P]
</pre>
<p>Now we were ready to migrate:</p>
<ol>
<li>Stop Nexus.</li>
<li>Stop Archiva.</li>
<li>Install rewriting rules on Apache.</li>
<li>Move content of internal repositories from Archiva to Nexus.</li>
<li>Restart Nexus.</li>
</ol>
<p>On D-day we made the switch in less than 10 minutes. Nexus took a few hours to index the hundreds of GB of data, but without taking much of a performance hit.</p>
<div id="attachment_611" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.aheritier.net/wp-content/uploads/2009/07/ArchivaNexusAfterMigration.png"><img class="size-medium wp-image-611" title="The final environment" src="http://blog.aheritier.net/wp-content/uploads/2009/07/ArchivaNexusAfterMigration-300x182.png" alt="The final environment" width="300" height="182" /></a><p class="wp-caption-text">The final environment</p></div>
<p>Despite some pitfalls we encountered, the migration wasn&#8217;t technically really complex. We did it in 2 weeks and we spent less than half that time actually working on it.</p>
<p>Now we are studying how to configure scheduled services. <a href="http://www.sonatype.com">Sonatype</a> made a major effort on <a href="http://www.sonatype.com/books/nexus-book/reference/">product documentation</a>. It allows us to quickly discover all its features. However, we are disappointed when we want to go further than the reference guide. Some best practices about the usage of the tool in a corporate environment are still missing:</p>
<ul>
<li>What scheduled tasks should be used?</li>
<li>Under what circumstances?</li>
<li>When?</li>
<li>Why should we repair metadata?</li>
<li>Why should we delete caches?</li>
<li>How are we supposed to use the trash?</li>
</ul>
<h1>Results</h1>
<p>Two weeks after the migration we drew a first conclusion of our Nexus experience. </p>
<p>Let&#8217;s begin by changes on issues we previously had with Archiva and which led us to attempt the Nexus adventure.</p>
<h2>The number of file descriptors simultaneously opened</h2>
<p>It&#8217;s a little bit early to declare victory, however after running for two weeks we can see that our problem on the number of file descriptors opened simultaneously disappeared. <strong>Whereas Archiva easily exceeded the 1024 descriptors opened, Nexus uses only 400 which enormously reduces the load on the server.</strong></p>
<div id="attachment_392" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.aheritier.net/wp-content/uploads/2009/05/archiva-open-files.png"><img class="size-medium wp-image-392" title="archiva-open-files" src="http://blog.aheritier.net/wp-content/uploads/2009/05/archiva-open-files-300x65.png" alt="Number of file descriptors simultaneously opened by Archiva" width="300" height="65" /></a><p class="wp-caption-text">Number of file descriptors simultaneously opened by Archiva</p></div>
<div id="attachment_394" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.aheritier.net/wp-content/uploads/2009/05/nexus-open-files.png"><img class="size-medium wp-image-394" title="nexus-open-files" src="http://blog.aheritier.net/wp-content/uploads/2009/05/nexus-open-files-300x65.png" alt="Number of file descriptors simultaneously opened by Nexus" width="300" height="65" /></a><p class="wp-caption-text">Number of file descriptors simultaneously opened by Nexus</p></div>
<h2>Memory consumption</h2>
<p>Even if we had enough RAM, Archiva is a big consumer of memory. <strong>Archiva took an average of 1.3 GB to run. Nexus requires many less and works with 400MB (Even my <a href="http://www.eclipse.org">Eclipse</a> requires more  <img src='http://blog.aheritier.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ). It saves almost 1GB that we can now allocate to our builds.</strong></p>
<div id="attachment_391" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.aheritier.net/wp-content/uploads/2009/05/archiva-memory.png"><img class="size-medium wp-image-391" title="archiva-memory" src="http://blog.aheritier.net/wp-content/uploads/2009/05/archiva-memory-300x65.png" alt="Memory consumption by Archiva" width="300" height="65" /></a><p class="wp-caption-text">Memory consumption by Archiva</p></div>
<div id="attachment_393" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.aheritier.net/wp-content/uploads/2009/05/nexus-memory.png"><img class="size-medium wp-image-393" title="nexus-memory" src="http://blog.aheritier.net/wp-content/uploads/2009/05/nexus-memory-300x70.png" alt="Memory consumption by Nexus" width="300" height="70" /></a><p class="wp-caption-text">Memory consumption by Nexus</p></div>
<h2>Not found snapshots</h2>
<p>Sadly this problems always persists. Because migration to Nexus hasn&#8217;t fixed it, we investigated a little bit more and discovered two causes for it :</p>
<ul>
<li>The first one is a bug in Maven (<a href="http://jira.codehaus.org/browse/MNG-4142">MNG-4142</a>) : It&#8217;s a subtle problem halfway between the use of artifacts with classifiers and a corruption of metadata in the local repository.</li>
<li>The second one is a set of bugs in Nexus (<a href="https://issues.sonatype.org/browse/NEXUS-1333">NEXUS-1333</a>, <a href="https://issues.sonatype.org/browse/NEXUS-2036">NEXUS-2036</a>): The scheduled service used to repair metadata deletes them if it cannot read it. The problem is that it doesn&#8217;t succeed to read them if you are using some deprecated properties like {parent.*} (replaced by ${project.parent.*}) or ${pom.*} (replaced by ${project.*}). <em>Note that <a href="https://issues.sonatype.org/browse/NEXUS-2036">NEXUS-2036</a> is marked as fixed on version 1.3.4.</em></li>
</ul>
<h2>Nothing is perfect</h2>
<p>A bug we didn&#8217;t have before appeared with the usage of Nexus. Because of our usage of rewriting rules in apache, Maven now complains that cookies are rejected when we upload artifacts on an internal repository (<a href="https://issues.sonatype.org/browse/NEXUS-1967">NEXUS-1967</a>). This is a minor issue which doesn&#8217;t alter our system, but is annoying because it pollutes our Maven logs on the integration server.</p>
<h2>But we had a good surprise</h2>
<p>Resource savings on the server (IO, RAM) and the quality of Nexus on the speed to upload artifacts (whatever their size) lead to an important improvement of quality of service and stability of the continuous integration server. As you can see below on some graphs taken from different builds in Bamboo there&#8217;s a big difference between before and after Nexus. <strong>Build times decreased and are consistent like never before.</strong></p>
<p><a href="http://blog.aheritier.net/wp-content/uploads/2009/05/chart4.png"><img class="size-medium wp-image-379" title="chart4" src="http://blog.aheritier.net/wp-content/uploads/2009/05/chart4-300x240.png" alt="chart4" width="300" height="240" /></a></p>
<p><a href="http://blog.aheritier.net/wp-content/uploads/2009/05/chart3.png"><img class="size-medium wp-image-378" title="chart3" src="http://blog.aheritier.net/wp-content/uploads/2009/05/chart3-300x240.png" alt="chart3" width="300" height="240" /></a></p>
<p><a href="http://blog.aheritier.net/wp-content/uploads/2009/05/chart2.png"><img class="size-medium wp-image-377" title="chart2" src="http://blog.aheritier.net/wp-content/uploads/2009/05/chart2-300x240.png" alt="chart2" width="300" height="240" /></a></p>
<p><a href="http://blog.aheritier.net/wp-content/uploads/2009/05/chart1.png"><img class="size-medium wp-image-376" title="chart1" src="http://blog.aheritier.net/wp-content/uploads/2009/05/chart1-300x240.png" alt="chart1" width="300" height="240" /></a></p>
<h2>Conclusion</h2>
<p>Did we find the silver bullet ? Of course, no. I have already listed some constraints and problems we had and there are probably many others to discover (the team already has a <a href="https://issues.sonatype.org/secure/IssueNavigator.jspa?reset=true&#038;mode=hide&#038;pid=10001&#038;resolution=-1&#038;sorter/field=updated&#038;sorter/order=DESC">good backlog</a>). Any product can be improved. Despite all that, how could I say something other than&#8230; migrate! It&#8217;s unfortunate for me to have to admit this as a member of the Archiva team, but my own research proves it. Nexus is a product of great quality, which delivers the service you need for your development projects very well. Furthermore, developed by full-time employees (thank you <a href="http://www.sonatype.com">Sonatype</a>), it enjoys an easily accessible and responsive support (I recommend the channel #nexus on #irc.codehaus.org). Archiva itself is governed by the laws of open source, suffers from the lack of time of its maintainers (even if they are doing as much as they can) which doesn&#8217;t help it to stay in the competition. </p>
<p>So, enjoy and benefit from service and quality by adopting Nexus!</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/from-apache-archiva-to-sonatype-nexus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
