<?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>OCTO talks ! &#187; maven</title>
	<atom:link href="http://blog.octo.com/tag/maven/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.octo.com</link>
	<description>Le blog d&#039;OCTO Technology, cabinet d&#039;architectes en systèmes d&#039;information</description>
	<lastBuildDate>Fri, 03 Feb 2012 13:46:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Faut-il passer à Maven 3 ?</title>
		<link>http://blog.octo.com/faut-il-passer-a-maven-3/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=faut-il-passer-a-maven-3</link>
		<comments>http://blog.octo.com/faut-il-passer-a-maven-3/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 13:05:40 +0000</pubDate>
		<dc:creator>Jonathan Scher</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[UDD]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=23810</guid>
		<description><![CDATA[Maven 3 est sorti depuis quelques mois, et ne propose que peu de nouvelles fonctionnalités au développeur qui l’utilisera. Quelles sont ces nouveautés ? Pour les projets utilisant Maven 2, faut il les passer sur la nouvelle version ? Réponse courte : oui. Aujourd’hui, il y a peu à gagner, mais la rétrocompatibilité est presque totale. Pour [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/construire-ses-parsers-antlr-avec-maven-partie-2-3-avec-maven/' rel='bookmark' title='Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven'>Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven</a></li>
<li><a href='http://blog.octo.com/maven-community-news-avril-2007/' rel='bookmark' title='Maven Community news &#8211; Avril 2007'>Maven Community news &#8211; Avril 2007</a></li>
<li><a href='http://blog.octo.com/maven-community-news-mai-2007/' rel='bookmark' title='Maven Community news &#8211; Mai 2007'>Maven Community news &#8211; Mai 2007</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Ffaut-il-passer-a-maven-3%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Faut-il%20passer%20%C3%A0%20Maven%203%20%3F%22%20%7D);"></div>
<p><em>Maven 3 est sorti depuis quelques mois, et ne propose que peu de nouvelles fonctionnalités au développeur qui l’utilisera. Quelles sont ces nouveautés ? Pour les projets utilisant Maven 2, faut il les passer sur la nouvelle version ? <strong>Réponse courte : oui.</strong> Aujourd’hui, il y a peu à gagner, mais la rétrocompatibilité est presque totale. Pour plus de détails, lisez la suite…</em><br />
<span id="more-23810"></span></p>
<h2 dir="ltr">Une plus grande rapidité dans le build.</h2>
<p>Deux améliorations permettront une plus grande rapidité de build : une gestion des entrées/sorties (I/O) plus efficace, et le fait de pouvoir construire//tester en parallèle, tirant mieux parti des processeurs multi-cœurs.<br />
Pour illustrer cette évolution, j’ai choisi de construire Struts 2 avec Maven 2, avec Maven 3, puis avec Maven 3 en lui forçant deux threads en parallèle (option -T 2). Struts 2 est un projet de plus de 100 000 lignes de code, réparties sur 38 modules. Le module « core » contient à lui seul près de 800 tests unitaires.<br />
Voici les résultats. Ils ont été réalisés sur un Core 2 Duo, avec 8Go de ram et un ssd.</p>
<p>&nbsp;</p>
<table style="border-spacing: 0px;" border="1" width="100%">
<thead>
<tr>
<th colspan="3">1 seul module</th>
<th colspan="3">38 modules</th>
</tr>
<tr>
<th>Maven 2</th>
<th>Maven 3</th>
<th>Maven 3 -T 2</th>
<th>Maven 2</th>
<th>Maven 3</th>
<th>Maven 3 -T 2</th>
</tr>
</thead>
<tbody>
<tr>
<td>57 sec</td>
<td>56,486 sec</td>
<td>56,440 sec</td>
<td><strong>8 min 41 sec</strong></td>
<td>8 min 11 sec</td>
<td><strong>6 min 23 sec</strong></td>
</tr>
</tbody>
</table>
<p>Sur un projet ne contenant qu’un unique module, la différence ne se fait presque pas sentir. Sur un SSD, je suppose que les optimisations d’I/O ne sont pas significatives. Par contre, sur le projet de 38 modules, <strong>le gain est de 25%</strong>.</p>
<p>En multi-modules, Maven 3 optimise votre build, en construisant en parallèle vos différents modules. Cela pose quelques contraintes. Si tous vos modules forment une chaîne de dépendances, impossible d’en construire plusieurs en parallèle. Au contraire, si vos dépendances sont légères, Maven 3 améliorera vos performances.</p>
<p>Par ailleurs, si vous construisez en parallèle, pensez à vos tests, particulièrement ceux d’intégration. Partagent-ils une base de données en commun ? Dans ce cas, partagent-ils la même donnée ? Vous pourriez alors avoir des surprises.</p>
<h2 dir="ltr">Que va t’il falloir changer sur mon projet ?</h2>
<p>Pour réaliser le test, je n’ai pas eu besoin de changer les pom.xml. <strong>La rétro compatibilité est forte.</strong></p>
<p>Au niveau des plugins, beaucoup sont immédiatement compatibles. <a href="https://cwiki.apache.org/MAVEN/maven-3x-plugin-compatibility-matrix.html">En voici une matrice de compatibilité.</a></p>
<p>Si à la sortie, certains logiciels connexes ne fonctionnaient pas avec Maven 3, tous le supportent aujourd’hui. Jenkins (ou Hudson) intègrent Maven 3 depuis janvier. Le plugin m2eclipse est également compatible avec Maven 3. C’est d’ailleurs la version qui est intégrée avec m2eclipse, lorsque vous le téléchargez depuis le site d’Eclipse Indigo.</p>
<p>Parmis les plugins incompatibles, vous trouvez Maven Site. <a href="http://maven.apache.org/plugins/maven-site-plugin-3.0-beta-3/">Une version beta compatible</a> est actuellement disponible.</p>
<p>Sinon, <a href="https://cwiki.apache.org/MAVEN/maven-3x-compatibility-notes.html">la liste des soucis de compatibilité</a> est disponible.</p>
<h2 dir="ltr">Validation du pom plus stricte</h2>
<p>Une nouvelle fonctionnalité est particulièrement utile. Désormais, <strong>Maven est plus strict sur la validité des fichiers pom.xml</strong>. Par exemple : si vous avez une erreur d’héritage, Maven 3 refusera de compiler au début plutôt que de planter au milieu. Si vous avez déclaré la même version d’une dépendance dans votre parent et dans votre sous module, Maven vous enverra un warning.</p>
<p>M2Eclipse intègre ces warnings. Dans Eclipse, il vous indique directement les lignes auxquelles il faut faire attention, dans vos pom.xml. Du coup, on peut corriger immédiatement et simplement ces petites choses qui peuvent vous poser problème un jour.</p>
<h2 dir="ltr">Et voilà !</h2>
<p>Il existe des projets connexes. Avec une extension,<a href="http://polyglot.sonatype.org/"> vous pouvez écrire vos pom dans d’autres langages que le xml.</a> Il existe<a href="http://shell.sonatype.org/"> une console</a>, qui vous permet de gagner le temps de démarrage de Maven. La version 3.1 intégrera peut être les <a href="http://www.sonatype.com/people/2008/11/maven-project-model/">mixin</a>. Je ne doute pas que d’autres projets de ce type existeront prochainement.<br />
<em>Faut il migrer dès aujourd’hui à Maven 3 ? Ca ne coûte pas grand chose, cela peut optimiser votre build, et ça vous prépare à l’avenir.</em></p>
<p>&nbsp;</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=23810" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/construire-ses-parsers-antlr-avec-maven-partie-2-3-avec-maven/' rel='bookmark' title='Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven'>Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven</a></li>
<li><a href='http://blog.octo.com/maven-community-news-avril-2007/' rel='bookmark' title='Maven Community news &#8211; Avril 2007'>Maven Community news &#8211; Avril 2007</a></li>
<li><a href='http://blog.octo.com/maven-community-news-mai-2007/' rel='bookmark' title='Maven Community news &#8211; Mai 2007'>Maven Community news &#8211; Mai 2007</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/faut-il-passer-a-maven-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Développer des applications Android avec Maven</title>
		<link>http://blog.octo.com/developper-des-applications-android-avec-maven/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=developper-des-applications-android-avec-maven</link>
		<comments>http://blog.octo.com/developper-des-applications-android-avec-maven/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 10:33:20 +0000</pubDate>
		<dc:creator>Jérôme Van Der Linden</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[Mobilité]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=18035</guid>
		<description><![CDATA[Il y a quelques mois de cela, je vous parlais d&#8217;industrialisation des développements Android. Tout n&#8217;était pas parfait pour être vraiment productif, notamment l&#8217;intégration entre les outils de build et l&#8217;IDE. Qu&#8217;en est-il aujourd&#8217;hui ? Peut-on enfin être aussi efficace sur du développement Android que sur du Java standard ? Ce sont les questions auxquelles [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/construire-ses-parsers-antlr-avec-maven-partie-2-3-avec-maven/' rel='bookmark' title='Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven'>Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven</a></li>
<li><a href='http://blog.octo.com/notifications-push-android-c2dm/' rel='bookmark' title='Envoyez des notifications push à vos applications Android avec C2DM'>Envoyez des notifications push à vos applications Android avec C2DM</a></li>
<li><a href='http://blog.octo.com/developper-application-parrallelement-sur-iphone-android/' rel='bookmark' title='Développer une application parallèlement sur iPhone et Android'>Développer une application parallèlement sur iPhone et Android</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fdevelopper-des-applications-android-avec-maven%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22D%C3%A9velopper%20des%20applications%20Android%20avec%20Maven%22%20%7D);"></div>
<p>Il y a quelques mois de cela, je vous parlais d&#8217;<a href="http://blog.octo.com/industrialisation-des-developpements-android/">industrialisation des développements Android</a>. Tout n&#8217;était pas parfait pour être vraiment productif, notamment l&#8217;intégration entre les outils de build et l&#8217;IDE. Qu&#8217;en est-il aujourd&#8217;hui ? Peut-on enfin être aussi efficace sur du développement Android que sur du Java standard ? Ce sont les questions auxquelles je réponds dans cet article.<br />
<span id="more-18035"></span></p>
<h2>Maven enfin utilisable&#8230; ou presque !</h2>
<p>Lorsque nous l&#8217;avions testé avant l&#8217;été, nous avions rencontré des problèmes avec le trio Maven / Android / Eclipse. L&#8217;intégration Eclipse/Android se passe très bien avec ADT et Eclispe/Maven fonctionne à merveille avec m2eclipse. L&#8217;intégration Maven/Android était un peu compliquée de par l&#8217;absence des jar Android sur le repo central mais fonctionnait tout de même (avec le plugin maven-android-plugin). Le véritable point noir était l&#8217;intégration des trois.</p>
<p>Aujourd&#8217;hui, tout cela a évolué et le plugin m2eclipse-android-integration (qui existait déjà à l&#8217;époque) fonctionne !</p>
<p>Il est donc bien plus simple de travailler avec nos outils habituels (je ne rentre pas dans les détails, chacun des outils est globalement bien documenté si vous avez un soucis) :</p>
<h3>Installation</h3>
<ul>
<li>Premièrement, récupérez et installez chacun des outils suivant : <a target="_blank" href="http://www.eclipse.org/downloads/">Eclipse</a>, <a target="_blank" href="http://maven.apache.org/download.html">Maven</a>, le <a href="http://developer.android.com/sdk/installing.html" target="_blank">SDK Android</a> et les plugins <a href="http://developer.android.com/guide/developing/eclipse-adt.html" target="_blank">ADT</a> (Android Development Tools), <a href="http://m2eclipse.sonatype.org/" target="_blank">m2eclipse</a> et <a href="http://code.google.com/a/eclipselabs.org/p/m2eclipse-android-integration/" target="_blank">m2eclipse-android-integration</a> pour Eclipse.</li>
<li>Définissez les variables d&#8217;environnements nécessaires : JAVA_HOME, ANDROID_HOME et le PATH vers les binaires (mvn et les tools Android).</li>
<li>Créez votre projet Android dans Eclipse comme vous le faites habituellement.</li>
<li>Transformez ensuite votre projet en projet Maven (click droit sur le projet / Maven / Enable Dependency Management). Il devrait automatiquement vous créer un pom.xml très basique dans lequel il va falloir ajouter quelques éléments pour pouvoir utiliser le plugin <a href="http://code.google.com/p/maven-android-plugin/" target="_blank">maven-android-plugin</a>.</li>
<li>Dans le settings.xml de Maven, ajoutez la configuration suivante, cela vous permettra d&#8217;utiliser ce plugin sans avoir à spécifier le groupId :
<pre class="brush:xml">
<pluginGroups>
<pluginGroup>com.jayway.maven.plugins.android.generation2</pluginGroup>
</pluginGroups>
</pre>
</li>
<li>Au niveau du pom, plusieurs choses avant d&#8217;être complètement opérationnel. Au niveau du packaging, précisez que vous créez un <strong>apk</strong>. Configurez ensuite le plugin de jayway comme suit (plus d&#8217;options et d&#8217;infos <a href="http://code.google.com/p/maven-android-plugin/wiki/Samples" target="_blank">ici</a>) :
<pre class="brush:xml">
<build>
  <sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
      <groupId>com.jayway.maven.plugins.android.generation2</groupId>
      <artifactId>maven-android-plugin</artifactId>
      <version>2.6.0</version>
      <configuration>
        <sdk>
<path>${env.ANDROID_HOME}</path>
<platform>8</platform><!-- android 2.2 -->
        </sdk>
        <deleteconflictingfiles>true</deleteconflictingfiles>
      </configuration>
      <extensions>true</extensions>
    </plugin>
<plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>2.3.2</version>
      <configuration>
        <source>1.6</source>
        <target>1.6</target>
      </configuration>
    </plugin>
  </plugins>
</build>
</pre>
</li>
<li>Et voilà ! Votre projet Android est mavenisé et intégré à Eclipse (il vous faudra peut être ajouter le répertoire &laquo;&nbsp;gen&nbsp;&raquo; aux répertoires sources d&#8217;Eclipse). Il ne reste plus qu&#8217;à ajouter des dépendances&#8230;</li>
</ul>
<h3>Problèmes de dépendances</h3>
<h4>Peu de dépendances sur le repo central</h4>
<p>Sur ce point, on n&#8217;est pas encore au niveau des projets java habituels. En effet, le nombre de dépendances Android qui sont disponibles sur un repo ou un autre est encore assez mince. Alors on a Android lui même, après l&#8217;avoir attendu très longtemps :</p>
<pre class="brush:xml">
<dependency>
  <groupId>com.google.android</groupId>
  <artifactId>android</artifactId>
  <version>2.2.1</version>
  <scope>provided</scope>
</dependency>
</pre>
<p>On a également les dépendances java habituelles (commons-* et tout ce que vous pouvez trouver sur <a href="http://repo2.maven.org/maven2" target="_blank">central</a>), pour peu que ça compile sur Android. Mais à côté de ça, <a href="http://fr.admob.com/docs/admob-sdk-android_20101109.zip" target="_blank" class="broken_link">admob</a>, <a href="http://code.google.com/mobile/analytics/download.html#Google_Analytics_SDK_for_Android" target="_blank">google analytics</a>, &#8230; et même google maps ne sont pas disponibles et devront être ajouté à la main :</p>
<pre class="brush:bash">
mvn install:install-file -Dfile=$ANDROID_HOME/add-ons/addon_google_apis_google_inc_8/libs/maps.jar -DgroupId=com.google.android.maps -DartifactId=maps -Dversion=8_r1 -Dpackaging=jar
</pre>
<p>Bien sûr, si vous avez un référentiel d&#8217;entreprise type nexus ou archiva, ca simplifiera le travail aux développeurs.</p>
<h4>Librairies</h4>
<p>
Autre problème, les <a target="_blank" href="http://developer.android.com/guide/developing/eclipse-adt.html#libraryProject">librairies Android</a>, des projets déclarés &laquo;&nbsp;is library&nbsp;&raquo; dans Eclipse et simplement utilisés comme dépendances de projet (par exemple <a href="http://android.cyrilmottier.com/?p=240" target="_blank">Greendroid</a> ou l&#8217;<a href="https://github.com/facebook/facebook-android-sdk/" target="_blank">Api Facebook</a>&#8230;). Le plugin maven-android-plugin prévoit bien de générer un package <a href="http://code.google.com/p/maven-android-plugin/wiki/ApkSourcesDependency" target="_blank"><strong>apkSources</strong></a>, censé être ensuite utilisable comme dépendance par un autre projet&#8230; Le soucis, c&#8217;est que le fichier R.java n&#8217;est pas disponible dans le package et par conséquent la compilation échoue.</p>
<p>Une <a href="http://code.google.com/p/maven-android-plugin/issues/detail?id=96" target="_blank">issue</a> a été créé sur ce point et une solution officieuse existe : Une <a href="https://github.com/nmaiorana/maven-android-plugin/tree/issue-96-library-projects" target="_blank">branche alternative</a> du projet jayway a été créé et propose le packaging <strong>apklib</strong> qui corrige le problème de compilation.</p>
<p>
Il vous faudra donc maveniser les librairies que vous utilisez si elles ne le sont pas déjà. Prenons l&#8217;exemple de greendroid. Dans ce projet, ajouter un pom qui aura la définition suivante (ainsi que la conf mentionnée plus haut) :</p>
<pre class="brush:xml">
<groupId>com.greendroid</groupId>
<artifactId>greendroid</artifactId>
<version>1.0</version>
<packaging>apklib</packaging>
</pre>
<p>Exécutez la commande mvn install pour déployer l&#8217;apklib dans le repo local (com/greendroid/greendroid/1.0/greendroid-1.0.apklib).<br />
Enfin, configurez votre projet :</p>
<pre class="brush:xml">
		<dependency>
			<groupId>com.greendroid</groupId>
			<artifactId>greendroid</artifactId>
			<version>1.0</version>
			<type>apklib</type>
		</dependency>
</pre>
<p>Ca nécessite un peu de boulot mais ca fonctionne. J&#8217;ai demandé quand on pouvait espérer cette fonctionnalité dans la branche principale du plugin mais aucune réponse n&#8217;a été fournie.</p>
<h4>Un plugin complet</h4>
<p>Une fois ces soucis de compilation et de dépendances résolues, pas mal de choses sont ensuite possibles avec le plugin maven-android-plugin : deployer un apk sur l&#8217;émulateur ou un téléphone branché en USB (<em>mvn deploy</em>), <a href="http://code.google.com/p/maven-android-plugin/wiki/SigningAPKWithMavenJarsigner" target="_blank">signer</a> et &laquo;&nbsp;<a href="http://code.google.com/p/maven-android-plugin/wiki/ZipalignAPKBuiltByMAven" target="_blank">zipaligner</a>&nbsp;&raquo; un apk avant un déploiement sur le Market, et tout un tas d&#8217;autres commandes dont vous trouverez la liste <a href="http://maven-android-plugin-m2site.googlecode.com/svn/plugin-info.html"  target="_blank">ici</a> (et notamment les tests dont nous allons parler juste après).
</p>
<p>Associé à cela, Hudson (pardon, Jenkins) et le <a href="http://wiki.hudson-ci.org/display/HUDSON/Android+Emulator+Plugin">plugin Android</a> dont nous avions parlé la dernière fois, et vous êtes paré pour développer des applications Android d&#8217;Entreprise !</p>
<h2>Conclusion</h2>
<p>Tout n&#8217;est pas encore tout rose et quelques réglages manuels sont nécessaires pour avoir un environnement prêt à l&#8217;emploi. Mais une fois ces manipulations effectuées, vous voilà parés pour développer vos applications Android avec Maven. Dans mon dernier article à ce sujet, je n&#8217;étais pas totalement favorable à son utilisation (peu de librairies, environnement non fonctionnel). Je reviens sur ce choix aujourd&#8217;hui du fait du nombre grandissant de librairies utilisées sur nos projets (greendroid, spring-android, analytics, jackson, &#8230;) et de l&#8217;évolution des outils. Les projets Android se complexifient et un outil comme Maven devient désormais nécessaire.<br />
Quid de la qualité de ces projets ? &#8230; dans un prochain article !</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=18035" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/construire-ses-parsers-antlr-avec-maven-partie-2-3-avec-maven/' rel='bookmark' title='Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven'>Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven</a></li>
<li><a href='http://blog.octo.com/notifications-push-android-c2dm/' rel='bookmark' title='Envoyez des notifications push à vos applications Android avec C2DM'>Envoyez des notifications push à vos applications Android avec C2DM</a></li>
<li><a href='http://blog.octo.com/developper-application-parrallelement-sur-iphone-android/' rel='bookmark' title='Développer une application parallèlement sur iPhone et Android'>Développer une application parallèlement sur iPhone et Android</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/developper-des-applications-android-avec-maven/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Mise en place technique de FitNesse</title>
		<link>http://blog.octo.com/mise-en-place-technique-de-fitnesse/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mise-en-place-technique-de-fitnesse</link>
		<comments>http://blog.octo.com/mise-en-place-technique-de-fitnesse/#comments</comments>
		<pubDate>Sat, 04 Dec 2010 15:24:48 +0000</pubDate>
		<dc:creator>Thomas Queste</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[fitnesse]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[SVN]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=18284</guid>
		<description><![CDATA[Mettre en place FitNesse dans une équipe n&#8217;est pas particulièrement évident. Il y a plusieurs possibilités et certaines sont plus efficaces que d&#8217;autres. La mise en place décrite dans cet article offre une bonne combinaison d&#8217;avantages et d&#8217;inconvénients. Elle permettra le travail commun de deux équipes : une équipe de fonctionnels utilisant un serveur central, [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%e2%80%99acceptance/' rel='bookmark' title='FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance'>FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance</a></li>
<li><a href='http://blog.octo.com/les-tests-de-recette-automatises-avec-fitnesse/' rel='bookmark' title='Les tests de recette automatisés avec Fitnesse'>Les tests de recette automatisés avec Fitnesse</a></li>
<li><a href='http://blog.octo.com/socle-technique-des-applications-java-ee-dans-le-war-ou-dans-le-serveur/' rel='bookmark' title='Socle technique des applications Java EE : dans le WAR ou dans le serveur ?'>Socle technique des applications Java EE : dans le WAR ou dans le serveur ?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fmise-en-place-technique-de-fitnesse%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Mise%20en%20place%20technique%20de%20FitNesse%22%20%7D);"></div>
<p>Mettre en place <a title="FitNesse homepage" href="http://fitnesse.org" target="_blank">FitNesse</a> dans une équipe n&#8217;est pas particulièrement évident. Il y a plusieurs possibilités et certaines sont plus efficaces que d&#8217;autres.</p>
<p>La mise en place décrite dans cet article offre une bonne combinaison d&#8217;avantages et d&#8217;inconvénients. Elle permettra le travail commun de deux équipes : une équipe de fonctionnels utilisant un serveur central, et une équipe de développement écrivant les fixtures directement depuis leur workspace.</p>
<p>Lisez la suite de l&#8217;article en anglais : <a title="FitNesse Technical Setup" href="http://blog.octo.com/en/fitnesse-technical-setup" target="_self">http://blog.octo.com/en/fitnesse-technical-setup</a></p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=18284" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%e2%80%99acceptance/' rel='bookmark' title='FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance'>FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance</a></li>
<li><a href='http://blog.octo.com/les-tests-de-recette-automatises-avec-fitnesse/' rel='bookmark' title='Les tests de recette automatisés avec Fitnesse'>Les tests de recette automatisés avec Fitnesse</a></li>
<li><a href='http://blog.octo.com/socle-technique-des-applications-java-ee-dans-le-war-ou-dans-le-serveur/' rel='bookmark' title='Socle technique des applications Java EE : dans le WAR ou dans le serveur ?'>Socle technique des applications Java EE : dans le WAR ou dans le serveur ?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/mise-en-place-technique-de-fitnesse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Industrialisation des développements Android</title>
		<link>http://blog.octo.com/industrialisation-des-developpements-android/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=industrialisation-des-developpements-android</link>
		<comments>http://blog.octo.com/industrialisation-des-developpements-android/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 08:24:01 +0000</pubDate>
		<dc:creator>Jérôme Van Der Linden</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[UDD]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=12537</guid>
		<description><![CDATA[Avec la croissance de la plateforme Android et <a href="http://www.google.com/hostednews/afp/article/ALeqM5iT2LvU72jbaLrcXxfKe2w2m2az2g" target="_blank">l'annonce de Google</a> sur le nombre de terminaux activés chaque jour, le nombre de projets Android a de bonnes chances de progresser également. Avec cette augmentation, la question de l’industrialisation des développements se pose donc. Pourquoi industrialiser ? Comment ? Des questions auxquelles nous allons répondre dans ce billet…
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/industrialisation-des-developpements-automatisez-votre-base-de-donnees/' rel='bookmark' title='Industrialisation des développements : automatisez votre base de données'>Industrialisation des développements : automatisez votre base de données</a></li>
<li><a href='http://blog.octo.com/developper-des-applications-android-avec-maven/' rel='bookmark' title='Développer des applications Android avec Maven'>Développer des applications Android avec Maven</a></li>
<li><a href='http://blog.octo.com/php-en-5-minutes-quels-sont-les-ateliers-de-developpements-ide-disponibles-en-php/' rel='bookmark' title='5 minutes pour : Quels sont les ateliers de développements, IDE disponibles en PHP ?'>5 minutes pour : Quels sont les ateliers de développements, IDE disponibles en PHP ?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Findustrialisation-des-developpements-android%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Industrialisation%20des%20d%C3%A9veloppements%20Android%22%20%7D);"></div>
<p>Avec la croissance de la plateforme Android et <a href="http://www.google.com/hostednews/afp/article/ALeqM5iT2LvU72jbaLrcXxfKe2w2m2az2g" target="_blank">l&#8217;annonce de Google</a> sur le nombre de terminaux activés chaque jour, le nombre de projets Android a de bonnes chances de progresser également. Avec cette augmentation, la question de l’industrialisation des développements se pose donc. Pourquoi industrialiser ? Comment ? Des questions auxquelles nous allons répondre dans ce billet…<br />
<span id="more-12537"></span></p>
<h2>Pourquoi industrialiser ?</h2>
<p>
Autant sur une application de gestion, la question ne se pose quasiment pas, autant sur une application Android, on est en droit de se demander si cela vaut le coup.</p>
<p>Effectivement, alors que les projets java se déroulent généralement sur plusieurs mois avec des équipes un peu conséquentes, les projets d’applications mobiles sont généralement plus courtes,  avec des équipes plus petites. Les applications doivent être innovantes et rapidement mises sur le Market pour arriver avant la concurrence. Cela vaut-il donc le coup d’investir dans tous les moyens habituels (build, intégration continue, …) qui peuvent paraître lourds et démesurés pour un tel projet ?</p>
<p>A fortiori, le <strong class="Apple-style-span" style="font-weight: bold;">versionning du code est indispensable</strong>, peu importe la nature et la taille du projet. Je ne vais pas m’étendre sur le sujet, cela fait des années que cette pratique s’est généralisée. Concernant l<strong class="Apple-style-span" style="font-weight: bold;">e build et l’intégration continue</strong>, cela <strong class="Apple-style-span" style="font-weight: bold;">a un intérêt dès lors que l’équipe de développement est constituée de plus d’une personne</strong>. Cela facilitera le travail des développeurs et permettra d’avoir une version rapidement montrable au marketing ou la MOA, indispensable pour avoir du feedback rapide.</p>
<p>Malgré la taille réduite de ces projets, il ne faut donc pas hésiter à investir un minimum pour faciliter le travail des développeurs d’une part et dans une optique de maintenance d’autre part. L’application doit certes sortir rapidement, mais elle devra continuer de vivre et d’évoluer et donc la qualité incombe.</p>
<h2>Maven, la bonne solution ?</h2>
</p>
<p>
Maven a ses détracteurs mais est globalement très répandu en entreprise pour construire les projets java. Concernant Android, je ne suis pas sûr qu’on puisse en dire autant pour le moment…</p>
<p>Après l’avoir utilisé sur l’application <a href="http://blog.octo.com/developper-application-parrallelement-sur-iphone-android/">Sinistres de Generali</a>, plusieurs constats :</p>
<ul>
<li>Les jar Android n&#8217;étaient disponibles dans aucun repo central. J’ai contacté Romain Guy pour avoir des infos sur le sujet mais aucune réponse. <i><b>Ils sont <a href="http://repo2.maven.org/maven2/com/google/android/android/" target="_blank">disponibles</a> depuis quelques jours sur le repo central. Enfin !</b></i> Par contre, il manque encore google maps.</li>
<li>Le plugin <a href="http://github.com/mosabua/maven-android-sdk-deployer" target="_blank">mosabua</a>, décrit dans le livre <a href="http://www.sonatype.com/books/mvnref-book/reference/android-dev.html" target="_blank">Maven Definitive Guide</a>, censé remédier à cela en installant les jar dans le repo local, nécessitait il y a encore peu de temps de modifier les pom.xml pour concorder avec les versions du SDK Android (1.5 pour la 3, 1.6 pour la 4…). Cela semble aujourd’hui résolu mais nous a fait perdre pas mal de temps.
</li>
<li>Une fois installé, le plugin fonctionne plutôt bien et permet de compiler, tester, packager, déployer sur un émulateur… depuis sa ligne de commande mvn.</li>
<li>Par contre, <strong class="Apple-style-span" style="font-weight: bold;">n’espérez pas trop utiliser le trio Eclipse &#8211; Maven &#8211; Android, y compris avec m2eclipse</strong>. Les trois s’entendent assez mal : les projets Android sous Eclipse ont un format un peu particulier (répertoire gen généré lors des modifications de ressources, référencement du sdk Android). Lorsque m2 est activé sur le projet ou simplement avec eclipse:eclipse, plus rien ne fonctionne : On perd le type Android du projet et il s’emmêle les pinceaux avec le répertoire gen donc impossible de travailler depuis Eclipse, fâcheux. Il existe un <a href="http://code.google.com/a/eclipselabs.org/p/m2eclipse-android-integration/" target="_blank">plugin eclipse</a> supplémentaire pour tenter d&#8217;intégrer les trois mais ca n&#8217;a pas fonctionné pour moi&#8230;</li>
</ul>
<p>Au final beaucoup de temps perdu pour avoir un environnement de développement un peu bancal et la question : <strong class="Apple-style-span" style="font-weight: bold;">est ce que Maven est vraiment utile</strong> dans notre cas ? On pense tout de suite à Maven lorsqu’il s’agit de builder notre application mais n’est-ce pas un peu too much ?</p>
<p>L’un des principaux bénéfices de Maven est la gestion des dépendances. Hors, dans une application Android, le nombre de dépendances est somme toute assez ridicule. Vous aurez généralement l’api google maps, éventuellement une librairie pour faire du soap, et en poussant le bouchon admob ou google analytics. Aucune dépendance transitive. Bref, pas de quoi sortir la grosse artillerie. D’autant plus qu’aucune de ces librairies n’est dispo dans un repo central et il vous faudra donc les installer manuellement dans un repo d’entreprise ou local.</p>
<p>Pour le reste, toutes les commandes disponibles grâce au plugin Maven le sont également avec ant, qui semble être <a href="http://developer.android.com/guide/developing/other-ide.html#Building" target="_blank">l’outil préconisé par Google</a>.</p>
<h2>Ant, la solution fournie en standard</h2>
</p>
<p>
Lorsque vous créez un projet via la ligne de commande (<code>android create project --target 8 --name AndroidAnt --path ./AndroidAntProject --activity AndroidAntActivity --package com.octo.android.androidant</code>), un fichier build.xml est généré, contrairement aux projets créés dans Eclipse. Ce build.xml minimaliste (quasiment vide) fourni toutefois l’essentiel des tâches nécessaires :</p>
<ul>
<li><strong class="Apple-style-span" style="font-weight: bold;">clean</strong>, pour nettoyer le projet</li>
<li><strong class="Apple-style-span" style="font-weight: bold;">compile</strong>, pour compiler le code et générer les classes</li>
<li><strong class="Apple-style-span" style="font-weight: bold;">debug</strong>, pour générer le package (apk) avec le keystore de debug (généralement dans $HOME/.android/debug.keystore)</li>
<li><strong class="Apple-style-span" style="font-weight: bold;">release</strong>, pour générer le package avec votre keystore (généralement celui que vous allez utiliser pour publier sur le market)</li>
<li><strong class="Apple-style-span" style="font-weight: bold;">install</strong>, pour installer l’application sur un émulateur (démarré) ou un device connecté.</li>
<li><strong class="Apple-style-span" style="font-weight: bold;">uninstall</strong>, pour désinstaller l’application précédemment installée.</li>
</ul>
<p>C’est assez confortable car vous n’avez pas à écrire ces tâches, elles sont définies dans le fichier <code>{SDK}/platforms/{platform}/templates/android_rules.xml</code>. Comparé à toutes les tâches plus ou moins manuelles à effectuer avec Maven, on y gagne franchement au départ.</p>
<p>Par contre, la solution Ant souffre également de l&#8217;intégration avec Eclipse. En effet, les tâches étant définies dans un fichier externe, elles ne sont pas disponibles dans la vue Ant. La solution alternative consiste à utiliser les external tools avec une des commandes ci-dessus.</p>
<h2>Intégration continue</h2>
</p>
<p>
Si les deux outils vu précédemment sont un peu en désaccord avec l’IDE, ils n’en restent pas moins tout à fait utilisable en dehors via la ligne de commande et donc également via un outil d’intégration continue comme Hudson.</p>
<p>Aussi simplement que sur un projet Java standard, vous pouvez configurer un build (maven ou ant) et la commande souhaitée. Mais Hudson va plus loin puisque via le plugin <a href="http://wiki.hudson-ci.org/display/HUDSON/Android+Emulator+Plugin" target="_blank">Android Emulator Plugin</a>, vous pouvez démarrer l’émulateur au début du build et l’éteindre à la fin. Vous pouvez également installer l&#8217;application sur différentes configurations (version d&#8217;Android, résolution d&#8217;écran, densité d&#8217;écran, locale) afin de valider l&#8217;application sur les différentes plateformes cibles.<br />
Si vous ne testez que sur une plateforme, mieux vaut laisser un émulateur fonctionner, ca évite de perdre plus de 5 minutes à chaque build.</p>
<p>Pour le reste, tout se passe comme pour un build standard, la seule particularité étant d&#8217;avoir le SDK installé sur le serveur d&#8217;intégration continue.</p>
<h2>Conclusion</h2>
</p>
<table style="border:1px #ccc solid; text-align:center">
<tr style="background-color:#ccc">
<td></td>
<td><b>Maven</b></td>
<td><b>Ant</b></td>
</tr>
<tr>
<td style="background-color:#ccc">Simplicité / Prise en main</td>
<td><b>2/5</b><br />(plugins diverses pas encore opérationnels)</td>
<td><b>4/5</b><br />(par défaut avec Android)</td>
</tr>
<tr>
<td style="background-color:#ccc">Gestion de dépendances</td>
<td><b>3.5/5</b><br />(les jars android sont enfin sur central, manque encore maps)</td>
<td><b>2/5</b><br />(pas besoin de préciser les jars android)</td>
</tr>
<tr>
<td style="background-color:#ccc">Intégration IDE</td>
<td><b>2.5/5</b><br />(utiliser les external tools)</td>
<td><b>2.5/5</b> <br />(utiliser les external tools)</td>
</tr>
<tr>
<td style="background-color:#ccc">Intégration continue</td>
<td><b>4/5</b><br />(plugin hudson)</td>
<td><b>4/5</b><br />(plugin hudson)</td>
</tr>
<tr>
<td style="background-color:#ccc">TOTAL</td>
<td><b>12 / 20</b></td>
<td><b>12.5 / 20</b></td>
</tr>
</table>
<p>Alors, Ant ou Maven ? Après nos déboires avec Maven sur le projet Generali, j&#8217;aurai conseillé Ant sans hésiter. L&#8217;arrivée (très) récente des jars dans le repo central me laisse à penser qu&#8217;on pourra bientôt travailler avec Maven, Android (et Eclipse) plus sereinement.
</p>
<p>
Android a l’avantage d’être basé sur le langage Java. On bénéficie ainsi des outils existants pour construire nos applications. Si l’intégration n’est pas totale entre l’IDE, le SDK et ces outils de builds, ils sont indispensables sur un serveur d’intégration continue. C’est aujourd’hui leur principal intérêt, car Eclipse et le plugin Android (AJDT) restent à mon sens incontournable sur le poste du développeur pour être productif.
</p>
<p>
Dans un prochain article, nous aborderons les problématiques de qualité du code et des tests&#8230;</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=12537" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/industrialisation-des-developpements-automatisez-votre-base-de-donnees/' rel='bookmark' title='Industrialisation des développements : automatisez votre base de données'>Industrialisation des développements : automatisez votre base de données</a></li>
<li><a href='http://blog.octo.com/developper-des-applications-android-avec-maven/' rel='bookmark' title='Développer des applications Android avec Maven'>Développer des applications Android avec Maven</a></li>
<li><a href='http://blog.octo.com/php-en-5-minutes-quels-sont-les-ateliers-de-developpements-ide-disponibles-en-php/' rel='bookmark' title='5 minutes pour : Quels sont les ateliers de développements, IDE disponibles en PHP ?'>5 minutes pour : Quels sont les ateliers de développements, IDE disponibles en PHP ?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/industrialisation-des-developpements-android/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Maven: Mes plugins préférés</title>
		<link>http://blog.octo.com/maven-mes-plugins-preferes/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=maven-mes-plugins-preferes</link>
		<comments>http://blog.octo.com/maven-mes-plugins-preferes/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 10:39:36 +0000</pubDate>
		<dc:creator>Henri Tremblay</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[intégration continue]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=8832</guid>
		<description><![CDATA[Ayant beaucoup utilisé Maven ces derniers temps, j&#8217;ai dû faire pas mal de recherches pour lui faire faire ce que je voulais. Cela m&#8217;a permis de découvrir une série de plugins intéressants que je vous livre ici. De façon générale, il s&#8217;agit de plugins méconnus mais qui m&#8217;ont fait pousser un &#171;&#160;Oh la bonne idée [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/maven-community-news-avril-2007/' rel='bookmark' title='Maven Community news &#8211; Avril 2007'>Maven Community news &#8211; Avril 2007</a></li>
<li><a href='http://blog.octo.com/maven-community-news-mai-2007/' rel='bookmark' title='Maven Community news &#8211; Mai 2007'>Maven Community news &#8211; Mai 2007</a></li>
<li><a href='http://blog.octo.com/maven-community-news-mars-2007/' rel='bookmark' title='Maven Community news &#8211; Mars 2007'>Maven Community news &#8211; Mars 2007</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fmaven-mes-plugins-preferes%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Maven%3A%20Mes%20plugins%20pr%C3%A9f%C3%A9r%C3%A9s%22%20%7D);"></div>
<p>Ayant beaucoup utilisé Maven ces derniers temps, j&#8217;ai dû faire pas mal de recherches pour lui faire faire ce que je voulais. Cela m&#8217;a permis de découvrir une série de plugins intéressants que je vous livre ici. De façon générale, il s&#8217;agit de plugins méconnus mais qui m&#8217;ont fait pousser un &laquo;&nbsp;Oh la bonne idée super pratique&nbsp;&raquo; lorsque je l&#8217;ai découvert. Avec un peu de chance, vous aurez la même réaction.</p>
<p>Évidemment, de nombreux autres plugins sont disponibles, utiles et bien faits. J&#8217;ai voulu focaliser ici sur mes nouvelles découvertes et sur les anciens qui sont revenus en grâce. Si vous recherchez un plugin, les deux points de départ sont <a href="http://maven.apache.org/plugins/" target="_blank">http://maven.apache.org/plugins</a>/ et <a href="http://mojo.codehaus.org/" target="_blank">http://mojo.codehaus.org/</a>. Ensuite, Google est votre ami.</p>
<h3><span id="more-8832"></span>Débogage Maven</h3>
<h4><a href="http://maven.apache.org/plugins/maven-help-plugin/" target="_blank">maven-help-plugin</a> (org.apache.maven.plugins)</h4>
<p>Plugin existant depuis toujours et s&#8217;étoffant tranquillement. Il permet d&#8217;avoir des informations sur un projet.</p>
<h5>Buts préférés:</h5>
<ul>
<li>help:active-profiles &#8211; Liste de profils actifs pour ce build</li>
<li>help:effective-pom &#8211; Crée le pom résultant de la résolution des profils actifs, de héritage et des variables</li>
<li>help:evaluate &#8211; Permet d&#8217;évaluer une expression Maven (par exemple ${project.version}). Prend en considération les profils actifs</li>
</ul>
<h4><a href="http://maven.apache.org/plugins/maven-dependency-plugin/" target="_blank">maven-dependency-plugin</a> (org.apache.maven.plugins)</h4>
<p>Un autre plugin relativement vieux. C&#8217;est le plugin ultime pour résoudre les problèmes de dépendances transitives.</p>
<h5>Buts préférés:</h5>
<ul>
<li>dependency:tree &#8211; Vous donne un arbre de dépendances indiquant qui tire quoi et dans quel scope. Absolument indispensable pour faire le ménage</li>
</ul>
<h4><a href="http://mojo.codehaus.org/versions-maven-plugin/" target="_blank">versions-maven-plugin</a> (org.codehaus.mojo)</h4>
<p>Mon tout nouveau plugin préféré. Il permet de gérer les versions d&#8217;un peu tout. En particulier, vous pourrez mettre à jour la version des poms enfants à partir de celle du pom parent. Vous pourrez aussi vérifier si les versions de vos dépendances et de vos plugins sont à les dernières disponibles. C&#8217;est un peu le plugin qu&#8217;on attendait depuis toujours.</p>
<h5>Buts préférés:</h5>
<ul>
<li>versions:display-dependency-updates &#8211; List toutes les dépendances ayant une version plus récente</li>
<li>versions:display-plugin-updates &#8211; Liste tous les plugins ayant une version plus récente</li>
<li>versions:update-child-modules &#8211; Il faut tout d&#8217;abord changer la version du pom parent. En appelant ensuite ce goal sur le pom parent, il mettra à jour les versions dans enfants. Très pratique pour faire des changements de versions</li>
<li>versions:set &#8211; Comme update-child-modules mais permettant de spécifier la nouvelle version  en ligne de commande (-DnewVersion=VALUE) au lieu de changer le pom parent.</li>
</ul>
<h3>Packaging</h3>
<h4><a href="http://maven.apache.org/plugins/maven-remote-resources-plugin/" target="_blank">maven-remote-resources-plugin</a> (org.apache.maven.plugins)</h4>
<p>Un plugin un peu obscur mais très utile pour partager des ressources entre plusieurs projets. Il permet de récupérer un &laquo;&nbsp;resource bundle&nbsp;&raquo; qui est en fait un jar avec un packaging particulier et disponible dans le repository maven. Le contenu de ce jar est filtré et ensuite intégré à l&#8217;artifact en cours de construction. Par exemple, pour un project sous license Apache, cela permet d&#8217;ajouter les fichiers au jar les fichiers requis par la licence (LICENSE, NOTICE, &#8230;). <em> </em></p>
<h5>Buts préférés:</h5>
<ul>
<li>remote-resources:process &#8211; Le goal permettant d&#8217;intégrer le &laquo;&nbsp;resource bundle&nbsp;&raquo; à l&#8217;artifact courant</li>
</ul>
<h4><a href="http://code.google.com/p/maven-license-plugin/" target="_blank">maven-license-plugin</a> (com.mycila.maven-license-plugin)</h4>
<p>Un autre plugin que j&#8217;ai récemment découvert et qui change la vie. Il permet de mettre le classique petit texte de copyright requis par une licence au haut de tous les fichiers du projet. Le formatera l&#8217;entête en fonction du type de fichier (&lt;!&#8211; &#8211;&gt; pour xml, # pour .properties, /* */ pour .java, etc.). Il y a aussi la possibilité de valider la présence de la licence durant la compilation.</p>
<h5>Buts préférés:</h5>
<ul>
<li>license:format &#8211; Ajouter la licence à chaque fichier</li>
<li>license:check &#8211; Valide que la licence est correctement mise pour chaque fichier</li>
</ul>
<h4><a href="http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html" target="_blank">maven-bundle-plugin</a> (org.apache.felix)</h4>
<p>J&#8217;aime bien aussi celui-là. Il transforme votre artifact en un bundle OSGi avec presque aucune configuration. Il n&#8217;y a pas de but explicite car il se lie lui-même à la phase <em>prepare-package</em>.</p>
<h4><a href="http://maven.apache.org/plugins/maven-shade-plugin/" target="_blank">maven-shade-plugin</a> (org.apache.maven.plugins)</h4>
<p>Utiliser pour faire un uber jar, c&#8217;est-à-dire un jar agrégeant le contenu de plusieurs jars.  Pour ceux qui connaissent, il fait plus ou moins la même chose que <a href="http://code.google.com/p/jarjar/" target="_blank">jarjar</a> pour lequel il n&#8217;existe pas de plugin Maven. Un exemple d&#8217;utilisation et la création d&#8217;un jar exécutable.</p>
<h5>Buts préférés:</h5>
<ul>
<li>shade:shade &#8211; Effectue la &laquo;&nbsp;uberisation&nbsp;&raquo;</li>
</ul>
<h3>Divers</h3>
<h4><a href="http://code.google.com/p/maven-timestamp-plugin/" target="_blank">maven-timestamp-plugin</a> (com.keyboardsamurais.maven)</h4>
<p>Pas vraiment un plugin de reporting mais très utile pour en faire. En fait il comble un lacune de Maven qui est qu&#8217;il n&#8217;y a pas de variable pour la date. Donc ce plugin vous permet de mettre la date/heure dans des variables sous le format que vous voulez (SimpleDateFormat servant d&#8217;interpréteur). Vous pouvez donc utiliser ces variables par la suite.</p>
<h5>Buts préférés:</h5>
<ul>
<li>timestamp:create &#8211; Pour créer une variable contenant la date. Il faut mettre plusieurs exécutions pour avoir plusieurs formats différents</li>
</ul>
<h3>Reporting</h3>
<h4><a href="http://docs.atlassian.com/maven-clover2-plugin/" target="_blank">maven-clover2-plugin</a> (com.atlassian.maven.plugins)</h4>
<p>Donne un rapport <a href="http://www.atlassian.com/software/clover/" target="_blank">Clover</a>, c&#8217;est-à-dire un rapport complet de la converture du code par les tests. Il est relativement connu et je le mentionne ici pour indiquer qu&#8217;il est désormais activement maintenu par Atlassian et suit de très près les livraisons Clover. Il est aussi maintenant très étoffé et beaucoup plus facilement configurable qu&#8217;historiquement.</p>
<h5>Buts préférés:</h5>
<ul>
<li>clover2:instrument &#8211; Effectue l&#8217;instrumentation du code</li>
<li>clover2:clover &#8211; Genère le rapport Clover</li>
<li>clover2:check &#8211; Vérifie que la couverture dépasse le pourcentage désiré</li>
</ul>
<h4><a href="http://mojo.codehaus.org/findbugs-maven-plugin/" target="_blank">findbugs-maven-plugin</a> (org.codehaus.mojo)</h4>
<p>Autre plugin très connu qui souffrait d&#8217;un problème de maintenance dernièrement. Il semblerait que certaines personnes s&#8217;y sont penchés et il suis maintenant relativement correctement les mises à jour findbugs.</p>
<h5>Buts préférés:</h5>
<ul>
<li> findbugs:findbugs &#8211; Génère le rapport findbugs. En général, on configure plutôt le plugin dans la section reporting du pom pour l&#8217;avoir au moment de la génération du site</li>
<li>findbugs:check &#8211; Fait planter le build si findbugs trouve des erreurs</li>
</ul>
<h3>Optimisation du build</h3>
<p>Les dernières versions de Maven se sont en autres consacrées à l&#8217;amélioration de la productivité. Plusieurs options en ligne de commande ont été ajouté. Elles proviennent à peu près toute du maven-reactor-plugin qui a été redescendu au coeur de Maven. Il ne s&#8217;agit donc pas vraiment de plugins mais ça reste pratique de savoir qu&#8217;elles existent.</p>
<h4>Nouvelles options:</h4>
<ul>
<li>&#8211;resume-from (-rf): Permet, pour un projet multi-module, de recommencer la compilation à partir d&#8217;un projet donné. Utile par exemple lorsque le build a échoué au milieu et que vous ne voulez pas reprendre du début.</li>
<li>&#8211;also-make (-am): Construire les projets mentionnés et leurs dépendances.</li>
<li>&#8211;also-make-dependents (-amd): Construire les projets mentionnés et les projets en dépendants.</li>
</ul>
<h4>Anciennes options:</h4>
<ul>
<li>&#8211;non-recursive (-N): Ne construire que le projet courant sans ses sous-modules. Surtout utile pour installer un pom parent ou bien faire tourner un plugin.</li>
<li>&#8211;file (-f): Utiliser le pom en paramètre et non le pom du répertoire courant. Cela va en pratique compiler un projet quelconque sans changer de répertoire (j&#8217;utilise surtout cette option dans des .bat utilitaires).</li>
<li>&#8211;projects (-pl): Construire les projets spécifiés en ligne de commande. Permet d&#8217;avoir un build très spécifique.</li>
</ul>
<h4><a href="http://maven.apache.org/plugins/maven-reactor-plugin/" target="_blank">maven-reactor-plugin</a> (org.apache.maven.plugins)</h4>
<p>Comme mentionné plus haut, ce plugin n&#8217;est presque plus nécessaire (si vous utilisez une version Maven 2.1.x ou supérieure) car il a été intégré dans le coeur de Maven. Il reste toutefois un but intéressant. Ils n&#8217;ont pas pu le mettre à plus bas niveau car il dépend de fonctionnalités de SCM qui ne sont pas présentes dans le coeur.</p>
<h5>Buts préférés:</h5>
<ul>
<li>reactor:make-scm-changes: Ne recompile que les projets (et les projets en dépendant) ayant des fichiers géré dans le SCM et modifiés localement. C&#8217;est assez magique comme optimisation car il ne recompile que ce qui est nécessaire. Faire attention toutefois, si votre SCM est un peu longuet à déterminer les changements locaux, cela peut parfois être plus long qu&#8217;un build en entier.</li>
</ul>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=8832" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/maven-community-news-avril-2007/' rel='bookmark' title='Maven Community news &#8211; Avril 2007'>Maven Community news &#8211; Avril 2007</a></li>
<li><a href='http://blog.octo.com/maven-community-news-mai-2007/' rel='bookmark' title='Maven Community news &#8211; Mai 2007'>Maven Community news &#8211; Mai 2007</a></li>
<li><a href='http://blog.octo.com/maven-community-news-mars-2007/' rel='bookmark' title='Maven Community news &#8211; Mars 2007'>Maven Community news &#8211; Mars 2007</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/maven-mes-plugins-preferes/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Distribuer les tests JUnit avec Gridgain et Maven</title>
		<link>http://blog.octo.com/distribuer-les-tests-junit-avec-gridgain-et-maven/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=distribuer-les-tests-junit-avec-gridgain-et-maven</link>
		<comments>http://blog.octo.com/distribuer-les-tests-junit-avec-gridgain-et-maven/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 05:20:46 +0000</pubDate>
		<dc:creator>Jérôme Van Der Linden</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[Gridgain]]></category>
		<category><![CDATA[intégration continue]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=6217</guid>
		<description><![CDATA[Dans un précédent article, Meriem Berkane introduisait le build distribué et notamment la distribution des tests sur des agents. TestNG propose cette fonctionnalité de base, JUnit par contre ne le fait pas. Mais Gridgain vient combler ce manque depuis sa version 1.6. Dans cet article, je vais donc mettre en oeuvre Gridgain dans un build [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/construire-ses-parsers-antlr-avec-maven-partie-2-3-avec-maven/' rel='bookmark' title='Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven'>Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven</a></li>
<li><a href='http://blog.octo.com/fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%e2%80%99acceptance/' rel='bookmark' title='FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance'>FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance</a></li>
<li><a href='http://blog.octo.com/trois-pistes-pour-distribuer-vos-builds/' rel='bookmark' title='Trois pistes pour distribuer vos builds'>Trois pistes pour distribuer vos builds</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fdistribuer-les-tests-junit-avec-gridgain-et-maven%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Distribuer%20les%20tests%20JUnit%20avec%20Gridgain%20et%20Maven%22%20%7D);"></div>
<p>Dans un <a href="http://blog.octo.com/trois-pistes-pour-distribuer-vos-builds/" target="_blank">précédent article</a>, Meriem Berkane introduisait le build distribué et notamment la distribution des tests sur des agents. TestNG propose cette fonctionnalité de base, JUnit par contre ne le fait pas. Mais <a href="http://www.gridgain.com/">Gridgain</a> vient combler ce manque depuis sa version 1.6. Dans cet article, je vais donc mettre en oeuvre Gridgain dans un build Maven afin de pouvoir, par la suite, l&#8217;utiliser sur le serveur d&#8217;intégration continue.<br />
<span id="more-6217"></span></p>
<h2>Gridgain</h2>
<p>Gridgain est un framework open source permettant de développer des applications java en cloud ou en grille. Basé sur des annotations, il permet depuis la version 1.6 de distribuer les tests :</p>

<div class="wp_codebox"><table><tr id="p62175"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code" id="p6217code5"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> GridTests <span style="color: #000000; font-weight: bold;">extends</span> TestSuite <span style="color: #009900;">&#123;</span>
&nbsp;
	@GridifyTest
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> Test suite<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		TestSuite suite <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TestSuite<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Test for com.octo.gridgain&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		suite.<span style="color: #006633;">addTestSuite</span><span style="color: #009900;">&#40;</span>ClientDaoTest.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// ...</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>L&#8217;annotation <a href="http://www.gridgain.com/javadoc/org/gridgain/grid/test/GridifyTest.html" target="_blank"><code>@GridifyTest</code></a> permet d&#8217;exécuter la suite de tests sur la grille. Si vous n&#8217;aimez pas les annotations, vous pouvez utiliser <a href="http://www.gridgain.com/javadoc/org/gridgain/grid/test/junit3/GridJunit3TestSuite.html" target="_blank"><code>GridJunit3TestSuite</code></a> au lieu de la simple <code>TestSuite</code>.</p>
<p>C&#8217;est censé fonctionner avec JUnit 4 également (<a href="http://www.gridgain.com/javadoc/org/gridgain/grid/test/junit4/GridJunit4Suite.html" target="_blank"><code>GridJunit4Suite</code></a>) mais j&#8217;ai essuyé quelques exceptions m&#8217;empêchant d&#8217;aller au bout&#8230;</p>
<p>Le code et les tests sont envoyés sur chaque nœud automatiquement selon l&#8217;algorithme <a href="http://fr.wikipedia.org/wiki/Round-robin_%28informatique%29" target="_blank">Round Robin</a>. Vous pouvez également réécrire votre méthode de répartition.</p>
<p>Alors bien sûr, ce n’est pas magique et pour distribuer les tests, il faut bien un ou des nœuds sur lesquels les distribuer. Plusieurs possibilités : </p>
<ul>
<li>Dans un mode simple et un peu artisanal, vous disposez dans le répertoire <em>bin</em> de l’installation de gridgain, d&#8217;un fichier <em>gridgain-junit.bat</em> (ou .sh). Lancez le autant de fois que vous souhaitez de nœuds sur une ou plusieurs machines. C&#8217;est assez laborieux et si on lance tout sur la même machine, on fini par plomber le temps de test.</li>
<li>Pour pallier à ça, on peut envisager de lancer le script gridgain au démarrage de la machine en tant que service.</li>
<li>Dans un mode un peu plus industrialisé, vous pouvez exploiter des serveurs d&#8217;application existants en y installant gridgain. Ainsi, gridgain se lancera en même temps que le serveur d&#8217;app et sera prêt à traiter des tests tant que le serveur sera up. Par exemple, j&#8217;ai testé l&#8217;installation de <a href="http://www.gridgain.com/screencast/jboss_gridgain_integration/jboss_gridgain_integration.html" target="_blank">gridgain dans un JBoss</a>. C’est assez simple à mettre en place et ça fonctionne très bien.</li>
</ul>
<p>Gridgain peut <a href="http://www.gridgainsystems.com/wiki/display/GG15UG/GridMulticastDiscoverySpi">découvrir</a> les nœuds faisant partie de la grille grâce au mécanisme d&#8217;<a href="http://fr.wikipedia.org/wiki/Multicast">IP multicast</a>. Ça simplifie beaucoup le travail, gridgain se charge de soumettre les paquets et toute machine capable de les recevoir (gridgain installé) se verra remettre des tests à exécuter.</p>
<p>Une fois l&#8217;infrastructure prête, plusieurs choses restent à configurer pour exécuter les tests. Et plutôt que de le faire dans Eclipse comme la <a href="http://www.gridgain.com/screencast/junit_integration/junit_integration.html" target="_blank">vidéo d&#8217;exemple</a> le montre, je l&#8217;ai fait dans Maven (toujours dans l&#8217;optique de mon build continu)&#8230;</p>
<h2>Maven</h2>
<h3>Dépendances</h3>
<p>Avant de rentrer dans les détails techniques, quelques généralités. Tout d&#8217;abord, les dépendances de build :</p>

<div class="wp_codebox"><table><tr id="p62176"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code" id="p6217code6"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;repositories<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;repository<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>gridgain<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>GridGain Repository<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://www.gridgainsystems.com/maven2/<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;snapshots<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;enabled<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>false<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/enabled<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/snapshots<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;releases<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;enabled<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>true<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/enabled<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/releases<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/repository<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/repositories<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dependencies<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dependency<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>junit<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>junit<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>4.4<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;scope<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>test<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/scope<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dependency<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dependency<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>org.gridgain<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>gridgain<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2.1.1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;scope<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>test<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/scope<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dependency<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dependencies<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Il faut ajouter le repo gridgain car les dépendances ne sont pour le moment pas dans le repo central.</p>
<h3>Compilation 1.5</h3>
<p>Compilation en 1.5 pour le support des annotations :</p>

<div class="wp_codebox"><table><tr id="p62177"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p6217code7"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;build<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plugins<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>org.apache.maven.plugins<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>maven-compiler-plugin<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;source<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1.5<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/source<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1.5<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #808080; font-style: italic;">&lt;!-- ... --&gt;</span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plugins<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/build<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<h3>Exécution de la suite sur la grille</h3>

<div class="wp_codebox"><table><tr id="p62178"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
</pre></td><td class="code" id="p6217code8"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;properties<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;aspectjweaverversion<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1.6.4<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/aspectjweaverversion<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/properties<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;build<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plugins<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>org.apache.maven.plugins<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>maven-surefire-plugin<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2.4<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
				<span style="color: #808080; font-style: italic;">&lt;!-- (1) --&gt;</span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;includes<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
					<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;include<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>**/*GridTests.java<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/include<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/includes<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
				<span style="color: #808080; font-style: italic;">&lt;!-- (2) --&gt;</span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;argline<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>-javaagent:${project.build.directory}/libs/aspectjweaver-${aspectjweaverversion}.jar<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/argline<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;workingdirectory<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>${project.build.directory}/libs/<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/workingdirectory<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
		<span style="color: #808080; font-style: italic;">&lt;!-- (3) --&gt;</span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>org.apache.maven.plugins<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>maven-dependency-plugin<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;executions<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;execution<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
					<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>copy<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
					<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;phase<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>process-resources<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/phase<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
					<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;goals<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
						<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;goal<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>copy<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/goal<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
					<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/goals<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
					<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
						<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactitems<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
							<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactitem<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
								<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>org.aspectj<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
								<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>aspectjweaver<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
								<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>${aspectjweaver-version}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
								<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;outputdirectory<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>${project.build.directory}/libs/<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/outputdirectory<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
							<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactitem<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
						<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactitems<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
					<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/execution<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/executions<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plugins<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/build<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<ul>
<li>Premièrement, j&#8217;exclue les tests pour n&#8217;ajouter que la ou les suites de tests (effectivement, c&#8217;est la suite qui est gridifiée).</li>
<li>Ensuite, on a besoin de préciser le <a href="http://java.sun.com/javase/6/docs/api/java/lang/instrument/package-summary.html" target="_blank">javaagent</a>, en l&#8217;occurence aspectj weaver pour instrumenter le code annoté et l&#8217;exécuter sur la grille plutôt qu&#8217;en local.</li>
<li>Et pour que le javaagent retrouve ses petits, il faut copier le jar dans le répertoire pointé par le javaagent.</li>
</ul>
<p>Un point important qu&#8217;on ne voit pas dans le pom est la présence du <em>META-INF/aop.xml</em> (disponible dans <em>gridgain-x.x.x/config/aop/aspectj/</em>) dans les ressources du projet (<em>src/test/resources</em>). Effectivement ce répertoire doit être dans le classpath. Il permet de sélectionner les portions de code qui seront tissés et donc susceptibles d&#8217;être exécutées sur la grille gridgain. </p>
<h2>Exécution</h2>
<p>Comme je le disais plus haut, il faut utiliser le .bat pour simuler des nœuds ou avoir une vraie grille. Ensuite, depuis votre projet maven, lancez simplement un <code>mvn test -DGRID_ROUTER_PREFER_REMOTE=true</code></p>
<pre>-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.octo.gridgain.GridTests
[00:56:01,906][INFO ][main][GridKernal%junit]
  _____      _     _  _____       _
 / ____|    (_)   | |/ ____|     (_)
| |  __ _ __ _  __| | |  __  __ _ _ _ __
| | |_ | '__| |/ _` | | |_ |/ _` | | '_ \
| |__| | |  | | (_| | |__| | (_| | | | | |
 \_____|_|  |_|\__,_|\_____|\__,_|_|_| |_|

...

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------</pre>
<p>Et voilà ! On a un build Maven qui exécute les tests en parallèle sur plusieurs nœuds (dans les logs jboss ou sur la console du bat, vous pouvez voir les tests exécutés par le nœud en question).</p>
<h2>Conclusion</h2>
<p>Écrire des tests, c&#8217;est bien&#8230; Les exécuter, c&#8217;est mieux ! Et donc si vous avez arrêté de les exécuter car vous êtes perpétuellement en train d&#8217;attendre qu&#8217;ils soient terminés, gridgain peut vous aider en répartissant l&#8217;exécution sur une grille.</p>
<p>Je ne l&#8217;ai pas précisé avant mais il va de soit que les tests doivent être le plus unitaires, optimisés et indépendants possibles. Donc dans un premier temps, envisagez d&#8217;optimiser vos tests, et si les problèmes persistent, songez à gridgain et gardez en tête que les tests ne doivent pas être dépendants.</p>
<p>Sur l&#8217;intégration continue, cela peut également être utile pour alléger la charge sur le serveur. L&#8217;idéal serait de pouvoir combiner cette fonctionnalité avec les possibilités de build distribué fournies par les principaux acteurs du marché (Teamcity, Hudson, &#8230;) et ainsi lancer les tests sur les agents déjà configurés. Mais pour peu que le réseau soit capable de gérer l&#8217;IP Multicast (sur du LAN de préférence), vous devriez déjà pouvoir distribuer les tests sur différents nœuds en laissant Gridgain découvrir les noeuds participants à la grille&#8230;</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=6217" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/construire-ses-parsers-antlr-avec-maven-partie-2-3-avec-maven/' rel='bookmark' title='Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven'>Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven</a></li>
<li><a href='http://blog.octo.com/fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%e2%80%99acceptance/' rel='bookmark' title='FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance'>FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance</a></li>
<li><a href='http://blog.octo.com/trois-pistes-pour-distribuer-vos-builds/' rel='bookmark' title='Trois pistes pour distribuer vos builds'>Trois pistes pour distribuer vos builds</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/distribuer-les-tests-junit-avec-gridgain-et-maven/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance</title>
		<link>http://blog.octo.com/fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%e2%80%99acceptance/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%25e2%2580%2599acceptance</link>
		<comments>http://blog.octo.com/fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%e2%80%99acceptance/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 09:58:28 +0000</pubDate>
		<dc:creator>Jean-Loup YU</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[fitnesse]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[productivité]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=6722</guid>
		<description><![CDATA[Dans un projet d’entreprise, il est important de vérifier continuellement la non-régression du produit réalisé. Au même titre que les tests unitaires, les tests d’acceptance font partie intégrante du harnais de tests à mettre en place sur un projet. FitNesse est une des solutions à ce besoin. FitNesse / Slim FitNesse dormait jusqu’à Juillet 2008. [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/les-tests-de-recette-automatises-avec-fitnesse/' rel='bookmark' title='Les tests de recette automatisés avec Fitnesse'>Les tests de recette automatisés avec Fitnesse</a></li>
<li><a href='http://blog.octo.com/integration-continue-performante-1/' rel='bookmark' title='Intégration continue performante (Part #1)'>Intégration continue performante (Part #1)</a></li>
<li><a href='http://blog.octo.com/mise-en-place-technique-de-fitnesse/' rel='bookmark' title='Mise en place technique de FitNesse'>Mise en place technique de FitNesse</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Ffitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%2525e2%252580%252599acceptance%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22FitNesse%2C%20Maven%2C%20Hudson%20%3A%20pour%20une%20int%C3%A9gration%20continue%20des%20tests%20d%E2%80%99acceptance%22%20%7D);"></div>
<p>Dans un projet d’entreprise, il est important de vérifier continuellement la non-régression du produit réalisé. Au même titre que les tests unitaires, les tests d’acceptance font partie intégrante du harnais de tests à mettre en place sur un projet. FitNesse est une des solutions à ce besoin.</p>
<h2>FitNesse / Slim</h2>
<p><a title="fitnesse.org" href="http://fitnesse.org/">FitNesse </a>dormait jusqu’à Juillet 2008. Mais il suffit de voir le rythme des releases depuis cette date, pour se rendre compte qu’il s’est réveillé ! Avec une nouvelle version presque tous les mois entre Juillet 2008 et Juillet 2009, et l’arrivée de <a title="Slim overview" href="http://vimeo.com/2456352">Slim</a>, on obtient un produit qui a sensiblement changé.</p>
<p>Mais avec une évolution aussi soudaine, on ne peut malheureusement pas éviter les effets de bords. Notamment dans le monde des outils qui tournaient autour de la sphère FitNesse. Par exemple, je recherchais un plugin Maven pour FitNesse. Mais la plupart des liens que me renvoie mon moteur de recherche préféré, pointe sur des outils incompatibles avec les nouvelles versions de FitNesse.</p>
<p>Il faut creuser un peu avant de trouver les perles rares…</p>
<p><span id="more-6722"></span></p>
<h2>Intégration avec Maven</h2>
<h3>Classpath generator</h3>
<p>Dès qu’on joue un peu avec FitNesse, on se rend vite compte que la gestion du classpath est une vraie galère ! L’écriture manuelle n’est pas une solution envisageable lorsque le projet embarque plus d’une dizaine de dépendances. Et puis après tout c’est le rôle de Maven de gérer tout ça !</p>
<p>C’est là qu’entre en jeu le superbe plugin <a title="Classpath generator plugin" href="https://source.valtech.com/display/vfl/Maven+Fitnesse+Classpath+Generator+Plugin">Classpath generator</a>.</p>
<p>Compatible avec la dernière version de FitNesse (<a title="fitnesse download" href="http://fitnesse.org/FrontPage.FitNesseDevelopment.DownLoad">20090818</a>), il permet de générer automatiquement la liste des dépendances des fixtures décrites dans le pom, directement dans le wiki.</p>
<p>Pour savoir comment configurer le plugin et comment l’utiliser, il suffit de suivre ce <a title="plugin configuration" href="https://source.valtech.com/maven-sites/maven-fitnesse-cpgen-plugin/usage.html">lien</a>.<br />
Attention, la page dans laquelle vous souhaitez générer le classpath doit être de type « Suite ».</p>
<h3>Trinidad</h3>
<p>L’étape suivante consiste à intégrer l’exécution automatique des tests d’acceptance dans le processus de build du projet.  Pour cela, il existe le plugin Maven nommé <a title="Trinidad plugin" href="http://neuri.co.uk/resources/projects/trinidad/maven-trinidad-plugin/">Trinidad</a>. Nous nous  concentrons ici uniquement sur l’aspect exécution des tests FitNesse dans Maven, sachant que le plugin permet de faire bien plus que ça.</p>
<p>Pour cela, je vous décris dans la suite comment j’ai configuré et utilisé le plugin.</p>
<p>Configuration du pom.xml du projet contenant les fixtures :</p>
<p>Ajout de la dépendance :</p>
<pre class="brush:xml">&lt;project&gt; 
  &lt;repositories&gt; 
    &lt;repository&gt; 
      &lt;id&gt;neuri-maven&lt;/id&gt; 
      &lt;url&gt;http://maven.neuri.com/&lt;/url&gt; 
      &lt;snapshots&gt; 
        &lt;enabled&gt;true&lt;/enabled&gt; 
      &lt;/snapshots&gt; 
      &lt;releases&gt;
        &lt;enabled&gt;true&lt;/enabled&gt; 
      &lt;/releases&gt;
    &lt;/repository&gt; 
  &lt;/repositories&gt; 
  &lt;dependencies&gt;
    &lt;dependency&gt; 
      &lt;groupid&gt;com.neuri.tdd&lt;/groupid&gt; 
      &lt;artifactid&gt;fitnesserunner&lt;/artifactid&gt; 
      &lt;version&gt;20090818&lt;/version&gt; 
    &lt;/dependency&gt;
  &lt;/dependencies&gt;
&lt;/project&gt;</pre>
<p>Configuration du plugin :</p>
<pre class="brush:xml">&lt;project&gt;
  &lt;build&gt;
    &lt;plugins&gt;
      &lt;plugin&gt;
        &lt;artifactid&gt;maven-trinidad-plugin&lt;/artifactid&gt;
        &lt;version&gt;20090818&lt;/version&gt;
        &lt;executions&gt;
          &lt;execution&gt;
            &lt;phase&gt;test&lt;/phase&gt; 
            &lt;goals&gt;
              &lt;goal&gt;run-tests&lt;/goal&gt;
            &lt;/goals&gt; 
          &lt;/execution&gt;
        &lt;/executions&gt;
        &lt;configuration&gt;
          &lt;testengine&gt;slim&lt;/testengine&gt; 
          &lt;testrepositorytype&gt;fitnesse&lt;/testrepositorytype&gt;
          &lt;testrepositoryuri&gt;C:\Programs\fitnesse&lt;/testrepositoryuri&gt; 
          &lt;breakbuildonfailure&gt;true&lt;/breakbuildonfailure&gt; 
          &lt;suites&gt; 
            &lt;suite&gt;MyProject.MyTestSuite&lt;/suite&gt; 
          &lt;/suites&gt; 
        &lt;/configuration&gt;
      &lt;/plugin&gt; 
    &lt;/plugins&gt; 
  &lt;/build&gt; 
  &lt;pluginrepositories&gt; 
    &lt;pluginrepository&gt; 
      &lt;id&gt;neuri-maven&lt;/id&gt; 
      &lt;url&gt;http://maven.neuri.com/&lt;/url&gt; 
      &lt;snapshots&gt; 
        &lt;enabled&gt;true&lt;/enabled&gt; 
      &lt;/snapshots&gt; 
      &lt;releases&gt; 
        &lt;enabled&gt;true&lt;/enabled&gt; 
      &lt;/releases&gt; 
    &lt;/pluginrepository&gt; 
  &lt;/pluginrepositories&gt;
&lt;/project&gt;</pre>
<p>Ainsi configuré, tous les tests FitNesse inclus dans la suite « MyTestSuite » seront exécutés lors du lancement de la phase test de Maven.</p>
<p>Le paramètre « breakBuildOnFailure » permet comme son nom l’indique de casser le build en cas d’échec sur les tests d’acceptance. Par défaut, le paramètre est à false.</p>
<h2>Hudson</h2>
<p>L’usine d’intégration continue est une brique logiciel essentielle dans un projet agile. Il garantit l’intégrité de l’application construite au fil de l’eau. Hudson est un des outils les plus répandus. Intégrer les tests d’acceptance dans l’usine d’intégration continue participe donc à construire un logiciel de qualité.</p>
<p>Par contre, on est en droit de se demander s’il est indispensable d’exécuter les tests d’acceptance à chaque fois que l’application est construite (c’est-à-dire à chaque commit d’un développeur). En effet, les tests FitNesse sont souvent longs à exécuter, et les jouer à chaque fois peut parfois nuire à la productivité de l’équipe. Un bon compromis est de lancer le build des tests d’acceptance toutes les nuits.</p>
<p>Voici comment j’ai configuré le job Hudson qui exécute les tests FitNesse tous les jours à minuit:</p>
<p style="text-align: center;"><img class="aligncenter" title="hudson1" src="http://blog.octo.com/wp-content/uploads/2009/10/hudson1.GIF" alt="hudson1" width="700" height="500" /></p>
<p><img title="hudson2" src="http://blog.octo.com/wp-content/uploads/2009/10/hudson2.GIF" alt="hudson2" width="700" height="600" /></p>
<p>Malgré une version stable depuis Août 2009, FitNesse peut être amené à évoluer dans quelques mois. Cet article se base sur la version <a title="fitnesse download" href="http://fitnesse.org/FrontPage.FitNesseDevelopment.DownLoad">20090818</a>. Les outils présentés ont été testés sur cette version. Il n’est pas garantit qu’ils fonctionneront toujours avec les versions futures de FitNesse.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=6722" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/les-tests-de-recette-automatises-avec-fitnesse/' rel='bookmark' title='Les tests de recette automatisés avec Fitnesse'>Les tests de recette automatisés avec Fitnesse</a></li>
<li><a href='http://blog.octo.com/integration-continue-performante-1/' rel='bookmark' title='Intégration continue performante (Part #1)'>Intégration continue performante (Part #1)</a></li>
<li><a href='http://blog.octo.com/mise-en-place-technique-de-fitnesse/' rel='bookmark' title='Mise en place technique de FitNesse'>Mise en place technique de FitNesse</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%e2%80%99acceptance/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Trois pistes pour distribuer vos builds</title>
		<link>http://blog.octo.com/trois-pistes-pour-distribuer-vos-builds/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=trois-pistes-pour-distribuer-vos-builds</link>
		<comments>http://blog.octo.com/trois-pistes-pour-distribuer-vos-builds/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 08:00:00 +0000</pubDate>
		<dc:creator>Meriem Berkane</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[packaging]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=5642</guid>
		<description><![CDATA[L&#8217;objectif du build continu est de fournir aux développeurs un retour sur la qualité du code qu&#8217;ils viennent de commiter. Plus ce retour sera fait rapidement, plus il sera efficace. Dans leur présentation à l’Université du Système d’Information intitulée Les nouveaux défis de l’intégration continue, Jérôme Van Der Linden et Philippe Guicheney présentent le build [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/distribuer-les-tests-junit-avec-gridgain-et-maven/' rel='bookmark' title='Distribuer les tests JUnit avec Gridgain et Maven'>Distribuer les tests JUnit avec Gridgain et Maven</a></li>
<li><a href='http://blog.octo.com/integration-continue-performante-1/' rel='bookmark' title='Intégration continue performante (Part #1)'>Intégration continue performante (Part #1)</a></li>
<li><a href='http://blog.octo.com/fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%e2%80%99acceptance/' rel='bookmark' title='FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance'>FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Ftrois-pistes-pour-distribuer-vos-builds%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Trois%20pistes%20pour%20distribuer%20vos%20builds%22%20%7D);"></div>
<p>L&#8217;objectif du build continu est de fournir aux développeurs un retour sur la qualité du code qu&#8217;ils viennent de commiter. Plus ce retour sera fait rapidement, plus il sera efficace. Dans leur présentation à l’Université du Système d’Information intitulée <a href="http://usi2009.universite-du-si.com/webcast-5-49-Les.nouveaux.defis.de.lintegration.continue.html" class="broken_link">Les nouveaux défis de l’intégration continue</a>, Jérôme Van Der Linden et Philippe Guicheney présentent le build distribué comme une solution aux problématiques de temps de build continu. Le but de cet article est d&#8217;approfondir cette notion de build distribué, en:</p>
<ul>
<li>Présentant trois concepts de distribution du build</li>
<li>Positionnant les principaux outils d’intégration continue actuels par rapport à leurs implémentations du build distribué</li>
</ul>
<p><span id="more-5642"></span></p>
<p>Dans tout ce qui suivra, on rencontrera à plusieurs reprises les termes suivants :</p>
<ul>
<li><strong>Build</strong> : Une configuration sur l’outil d’intégration continue servant à construire un projet, à générer sa documentation, à générer des rapports de qualité, etc. Un build peut effectuer une ou plusieurs de ces étapes.</li>
<li><strong>Agent</strong> : Un serveur d’intégration continue secondaire ou esclave du principal. Il reçoit des ordres de build du serveur principal, et se synchronise avec ce dernier à la fin de l’exécution de ces ordres</li>
</ul>
<p>On peut distinguer plusieurs concepts de distribution des builds d’intégration continue.</p>
<h3>Distribuer les builds</h3>
<p>Ici, le principe est simple : des agents installés sur d’autres serveurs prennent à leur charge certains builds et fournissent le résultat au serveur principal. Un build constitue ici un élément <strong>atomique</strong>, et se déroule sur un seul agent :<br />
<a href="http://blog.octo.com/wp-content/uploads/2009/10/distribution-par-jobs1.png"><img class="aligncenter size-full wp-image-6165" title="distribution par jobs" src="http://blog.octo.com/wp-content/uploads/2009/10/distribution-par-jobs1.png" alt="distribution par jobs" width="637" height="413" /></a></p>
<p>Les builds sont répartis sur les différents agents selon une politique de distribution prédéfinie, dépendant des outils d’intégration continue. <strong>Hudson </strong>, <strong>Teamcity</strong> et <strong>Bamboo</strong> proposent un mode de distribution manuel, où l’on associe explicitement un job à un agent.</p>
<p>Si aucune assignation manuelle n&#8217;est faite:</p>
<ul>
<li> <strong>Hudson </strong>fera en sorte que tous les builds les plus longs (en se basant sur les dernières durées) soit exécutés sur des agents et non sur le serveur principal. Il fera également en sorte que chacun de ces builds soit exécuté sur l&#8217;agent où il a été exécuté la dernière fois.</li>
<li> <strong>Teamcity </strong>et <strong>Bamboo </strong>détermineront l&#8217; agent libre en premier en se basant sur les anciens temps de build. Ils ajouteront le build sur la file d&#8217; attente de ce dernier.</li>
</ul>
<p>L’intérêt de ce type de distribution n’est pas simplement d&#8217;optimiser le temps de lancement d&#8217;un build. Il permet aussi de faire ce que l’on appelle du <strong>build profilé</strong>, où les agents ne sont pas tous configurés de la même façon afin de tester l’application sur différentes plateformes (Systèmes d&#8217;exploitations, serveurs d&#8217;application,etc.).</p>
<h3>Distribuer les modules d&#8217;un même build</h3>
<p>Il s’agit ici de <strong>répartir un même build</strong> sur plusieurs agents. Imaginons par exemple le projet maven suivant. Ce projet est composé de trois modules (au sens maven) : A, B et C. Les dépendances suivent le schéma suivant :</p>
<p style="text-align: center;"><img class="size-full wp-image-6278 aligncenter" title="dependances2" src="http://blog.octo.com/wp-content/uploads/2009/10/dependances2.png" alt="dependances2" width="211" height="123" /></p>
<p><strong>A doit être buildé avant B et C, en revanche B et C peuvent être buildés simultanément</strong>. On pourrait imaginer que B et C soient buildés sur des agents séparés.<br />
Ceci est manuellement faisable avec Maven. En effet, il est possible de déduire l’arbre des dépendances, de builder le projet parent séparément grâce à l’option <em>non-recursive</em> de maven (-N), puis de lancer des builds de chaque module d’une façon isolée des autres, et ce grâce à l’option <em>projects</em> de maven (-pl).<br />
<a href="http://blog.octo.com/wp-content/uploads/2009/10/distribution-par-modules-maven1.png"><img class="aligncenter size-full wp-image-6166" title="distribution par modules maven" src="http://blog.octo.com/wp-content/uploads/2009/10/distribution-par-modules-maven1.png" alt="distribution par modules maven" width="637" height="413" /></a></p>
<p>Une telle possibilité n’est pas encore exploitée par les solutions d’intégration continue actuelles. Mais, comme les outils d&#8217;intégration continue proposent des builds de type maven2, nous imaginons que ce genre de fonctionnalités va arriver prochainement.</p>
<p>D&#8217;ailleurs, Hudson par exemple, pour offrir sa fonctionnalité de build incrémental, effectue déjà lors d&#8217;un build la détection des modules maven, ainsi que l&#8217;ordre de build. Cette fonctionnalité permet de ne builder que les modules qui ont changé.</p>
<h3>Distribuer les tests</h3>
<p>Il s’agit ici de distribuer les tests d&#8217; un même module sur plusieurs agents différents. Dans son post intitulé <a href="http://blog.octo.com/combien-de-temps-doit-prendre-un-build-maven"> Combien de temps doit prendre un build maven </a>, Benoit Lafontaine explique qu&#8217;un build doit prendre au maximum 30 secondes + le temps d&#8217; exécution des tests. Distribuer les tests permet donc de réduire de manière considérable le temps de build.<br />
<a href="http://blog.octo.com/wp-content/uploads/2009/10/distribution-par-les-tests.png"><img class="aligncenter size-full wp-image-6176" title="distribution par les tests" src="http://blog.octo.com/wp-content/uploads/2009/10/distribution-par-les-tests.png" alt="distribution par les tests" width="637" height="396" /></a><br />
Quelques frameworks de tests unitaires comme <strong>TestNG</strong> proposent aujourd’hui de distribuer les tests sur plusieurs agents. TestNG est déjà supporté par Teamcity et Hudson.</p>
<p>Gridgain est un framework open source pour développer des applications java en grille ou sur le cloud. Depuis la version 1.6, gridgain permet également de <a href="http://www.gridgainsystems.com/wiki/display/GG15UG/Distributed+JUnit+Overview">distribuer des tests JUnit</a> et grâce à une simple annotation (@GridifyTest), vous pouvez distribuer une suite de tests sur les noeuds de la grille Gridgain (un prochain article approfondira ce sujet).</p>
<p>La distribution des tests sur plusieurs agents n’est pas encore implémentée. Un premier pas de l&#8217;implémentation de ce type de distribution serait de déclarer les agents d&#8217;une façon explicite dans <a href="http://beust.com/weblog/archives/000362.html"> les fichiers de configuration de TestNG</a> ou de Gridgain. Mais nous pouvons imaginer aussi qu&#8217;un jour nous aurons une détection automatique des agents disponibles et une configuration à la volée de ces derniers dans les fichiers de configuration Gridgain et TestNG.</p>
<h3>Conclusion</h3>
<p>Le build distribué doit être une fonctionnalité à prendre en compte dans le choix d&#8217;une solution d’intégration continue. Et si le premier concept de distribution est dès aujourd&#8217;hui aisé à mettre en oeuvre, car déjà implémenté par la plupart des outils, les deux autres restent encore inexploités, et constituent à n&#8217;en pas douter une évolution majeure de l’intégration continue.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=5642" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/distribuer-les-tests-junit-avec-gridgain-et-maven/' rel='bookmark' title='Distribuer les tests JUnit avec Gridgain et Maven'>Distribuer les tests JUnit avec Gridgain et Maven</a></li>
<li><a href='http://blog.octo.com/integration-continue-performante-1/' rel='bookmark' title='Intégration continue performante (Part #1)'>Intégration continue performante (Part #1)</a></li>
<li><a href='http://blog.octo.com/fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%e2%80%99acceptance/' rel='bookmark' title='FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance'>FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/trois-pistes-pour-distribuer-vos-builds/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Littérature Maven Française</title>
		<link>http://blog.octo.com/litterature-maven-francaise/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=litterature-maven-francaise</link>
		<comments>http://blog.octo.com/litterature-maven-francaise/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 05:18:17 +0000</pubDate>
		<dc:creator>Jérôme Van Der Linden</dc:creator>
				<category><![CDATA[Brèves de consultants]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=5986</guid>
		<description><![CDATA[Jusqu&#8217;à présent la littérature au sujet de Maven était essentiellement anglophone. Ceci limitait son adoption dans nos contrées gauloises et pouvait parfois entrainer une mauvaise utilisation ou des critiques injustifiées. Mais c&#8217;est aujourd&#8217;hui de l&#8217;histoire ancienne&#8230; ou presque ! Effectivement, d&#8217;ici la fin de l&#8217;année, deux ouvrages en Français arriveront sur nos étales : Apache [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/maven-community-news-mai-2008/' rel='bookmark' title='Maven Community news &#8211; Mai 2008'>Maven Community news &#8211; Mai 2008</a></li>
<li><a href='http://blog.octo.com/maven-community-news-mai-2007/' rel='bookmark' title='Maven Community news &#8211; Mai 2007'>Maven Community news &#8211; Mai 2007</a></li>
<li><a href='http://blog.octo.com/grails-maven-plugin-03/' rel='bookmark' title='Grails Maven Plugin 0.3'>Grails Maven Plugin 0.3</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Flitterature-maven-francaise%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Litt%C3%A9rature%20Maven%20Fran%C3%A7aise%22%20%7D);"></div>
<p>Jusqu&#8217;à présent la littérature au sujet de Maven était essentiellement anglophone. Ceci limitait son adoption dans nos contrées gauloises et pouvait parfois entrainer une mauvaise utilisation ou des critiques injustifiées. Mais c&#8217;est aujourd&#8217;hui de l&#8217;histoire ancienne&#8230; ou presque ! Effectivement, d&#8217;ici la fin de l&#8217;année, deux ouvrages en Français arriveront sur nos étales : <em>Apache Maven</em> de Nicolas De Loof et Arnaud Héritier ainsi que la traduction du déjà connu <em>Maven: The Definitive Guide</em> de Sonatype.<br />
<span id="more-5986"></span></p>
<h3>Apache Maven</h3>
<p>Ce livre devrait paraître en Novembre (si tout se passe bien, le 20) et devrait ravir tous ceux qui n&#8217;avaient pas la motivation et l&#8217;envie de se lancer dans le guide de référence. Pour avoir participé à sa relecture, je ne peux que vous le conseiller, il se boit comme du petit lait. Au travers d&#8217;un roman bien conté, <strong>on y apprend à utiliser Maven comme en entreprise</strong>. Depuis la création du projet jusqu&#8217;à la livraison, on découvre les clés pour mener à bien un projet et se faire de Maven un allié.<br />
N&#8217;y cherchez pas un guide de référence, ce n&#8217;est pas le but. Mais par contre, si vous débutez ou que vous souhaitez des tips, n&#8217;hésitez pas. Qui mieux que deux commiteurs Maven ayant mis en place Maven dans les entreprises Françaises pourrait mieux vous livrer ces informations ?!<br />
<a href="http://www.pearson.fr/livre/?GCOI=27440100730370" target="_blank">Plus de détails ici</a>&#8230;</p>
<h3>Maven: The Definitive Guilde</h3>
<p>À défaut de l&#8217;avoir lu, vous avez déjà probablement entendu parlé du <a href="http://www.sonatype.com/products/maven/documentation/book-defguide" target="_blank">Definitive Guide Maven</a>, le <strong>livre de référence Maven</strong> édité par Sonatype. Et bien si vous aviez peur de vous lancer dans la lecture de ce pavé en anglais, sachez que la traduction française est actuellement en cours.<br />
Nous sommes aujourd&#8217;hui <a href="http://wiki.github.com/ehsavoie/maven-guide-fr/qui-fait-quoi" target="_blank">4 à traduire</a> ce &laquo;&nbsp;Guide Absolu&nbsp;&raquo;. La première partie étant terminée, nous vous invitons à une campagne de relecture des 8 premiers chapitres. Vous trouverez le <a href="http://www.maven-definitive-guide.fr/site/pdf/maven-definitive-guide.pdf" target="_blank" class="broken_link">pdf</a> ou la version <a href="http://www.maven-definitive-guide.fr/site/reference/public-book.html" target="_blank" class="broken_link">html</a> (en intégration continue) sur <a href="http://maven-definitive-guide.fr/" target="_blank" class="broken_link">http://maven-definitive-guide.fr/</a>.<br />
Pour toutes vos remarques, utilisez notre <a href="http://github.com/ehsavoie/maven-guide-fr/issues" target="_blank">projet github</a>. Comme pour la version originale, c&#8217;est grâce à la communauté de développeurs et utilisateurs Maven, que nous aurons un bon livre alors n&#8217;hésitez pas !</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=5986" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/maven-community-news-mai-2008/' rel='bookmark' title='Maven Community news &#8211; Mai 2008'>Maven Community news &#8211; Mai 2008</a></li>
<li><a href='http://blog.octo.com/maven-community-news-mai-2007/' rel='bookmark' title='Maven Community news &#8211; Mai 2007'>Maven Community news &#8211; Mai 2007</a></li>
<li><a href='http://blog.octo.com/grails-maven-plugin-03/' rel='bookmark' title='Grails Maven Plugin 0.3'>Grails Maven Plugin 0.3</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/litterature-maven-francaise/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Combien de temps doit prendre un build Maven ?</title>
		<link>http://blog.octo.com/combien-de-temps-doit-prendre-un-build-maven/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=combien-de-temps-doit-prendre-un-build-maven</link>
		<comments>http://blog.octo.com/combien-de-temps-doit-prendre-un-build-maven/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 07:00:04 +0000</pubDate>
		<dc:creator>Benoit Lafontaine</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[productivité]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=5295</guid>
		<description><![CDATA[Suite à mon précédent post, La meilleure façon de rater son projet grâce à Maven2, un collègue m&#8217;a décrit la situation suivante &#171;&#160;Une pratique sur notre projet est de lancer un build maven -mvn clean install- sur son poste local avant de faire un commit. Cette commande est super longue, et les développeurs disent &#8216;c&#8217;est [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%e2%80%99acceptance/' rel='bookmark' title='FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance'>FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance</a></li>
<li><a href='http://blog.octo.com/faut-il-passer-a-maven-3/' rel='bookmark' title='Faut-il passer à Maven 3 ?'>Faut-il passer à Maven 3 ?</a></li>
<li><a href='http://blog.octo.com/construire-ses-parsers-antlr-avec-maven-partie-2-3-avec-maven/' rel='bookmark' title='Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven'>Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fcombien-de-temps-doit-prendre-un-build-maven%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Combien%20de%20temps%20doit%20prendre%20un%20build%20Maven%20%3F%22%20%7D);"></div>
<p>Suite à mon précédent post, <a href="http://blog.octo.com/la-meilleure-facon-de-rater-son-projet-grace-a-maven2/">La meilleure façon de rater son projet grâce à Maven2</a>, un collègue m&#8217;a décrit la situation suivante &laquo;&nbsp;Une pratique sur notre projet est de lancer un build maven -mvn clean install- sur son poste local avant de faire un commit. Cette commande est super longue, et les développeurs disent &#8216;c&#8217;est normal c&#8217;est maven qui est long&#8217;, ça doit prendre combien de temps un build Maven ?&nbsp;&raquo;.<br />
<span id="more-5295"></span><br />
Avant de répondre, je répète mon précédent conseil : fixez votre environnement pour que vous soyez confiants dans votre code sans avoir à lancer un build maven.</p>
<p><strong>Combien de temps doit prendre un build Maven ?</strong></p>
<p>En testant les projets que j&#8217;ai sous la main, des petits projets de quelques modules Maven à des projets de plus de 100 modules Maven, j&#8217;en viens à la conclusion :<br />
<strong>temps de build Maven = temps des tests unitaires + 30s</strong><br />
(pour le projet de 100 modules, on dépasse de peu la minute supplémentaire).</p>
<p>Au final, le temps de build imputable à Maven est de l&#8217;ordre de 30 secondes voire 1 minute. Une différence de plus d&#8217;une minute est une alerte : le build est mal configuré.<br />
A ce propos, selon <a href="http://blog.aheritier.net/">Arnaud Héritier</a> (membre du Project Management Committee sur Maven2) :</p>
<blockquote><p><em>Le gros Kouak dans Maven c&#8217;est à l&#8217;initialisation la résolution de toutes les dépendances (le parcours du graphes etc).<br />
Plus il y a des sous-modules, plus il y a de choses a faire.<br />
En Maven 2.0.x les temps sont catastrophiques.<br />
Ainsi un projet qui compte plus de 150 modules Maven peut prendre 8 minutes à s&#8217;initialiser.<br />
Sur un autre projet, qui a aussi quelques dizaines de modules cela prend entre 1 et 2 minutes.<br />
A partir de la version 2.1.0 le premier projet met moins d&#8217;une minute à s&#8217;initialiser et le deuxième ne met plus que quelques secondes.<br />
</em></p></blockquote>
<p>Si vous êtes encore sur Maven 2.0.x et que votre build met plusieurs minutes à s&#8217;initialiser, je vous conseille d&#8217;essayer les dernières versions de Maven.</p>
<p>Pensez aussi à bien distinguer les étapes nécessaires lors d&#8217;un build développeurs et celles qu&#8217;on peut garder que sur l&#8217;intégration continue et à les séparer dans des profils différents. Typiquement, si l&#8217;on pré-compile des JSPs pour les environnements d&#8217;intégration et de production, cette tâche n&#8217;est pas utile lors des développements.</p>
<p>Maintenant, j&#8217;entends déjà la question suivante :</p>
<p><strong>Mes tests unitaires prennent plusieurs minutes, comment je fais ?</strong></p>
<p>Si vos tests unitaires prennent trop de temps, c&#8217;est surement que vous ne faites pas des tests unitaires, mais plutôt des tests d&#8217;intégration. Pour mieux comprendre la distinction : <a href="http://blog.octo.com/quels-sont-les-types-de-tests-que-l%E2%80%99on-utilise-sur-un-projet-agile/">un article sur les types de tests</a>.<br />
Mon conseil n&#8217;est pas d&#8217;abandonner les tests d&#8217;intégration, bien au contraire, mais de ne pas les lancer systématiquement :</p>
<ul>
<li><strong>Tests unitaires </strong>: très rapides, lancés systématiquement sur le poste de développement</li>
<li><strong>Tests d&#8217;intégration </strong>: potentiellement longs, lancés systématiquement par l&#8217;intégration continue, le développeur ne lance que ceux qu&#8217;il juge nécessaire</li>
</ul>
<p>En résumé :<br />
<strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong></p>
<ul>
<li>Le temps d&#8217;un build Maven doit être le temps de vos tests unitaires plus 30 secondes maximum</li>
<li>Ne conservez que le strict minimum dans le build &laquo;&nbsp;courant&nbsp;&raquo; et déléguez les tâches plus longues à l&#8217;intégration continue</li>
<li>Distinguez les tests unitaires des tests d&#8217;intégration, ces derniers seront joués régulièrement par l&#8217;intégration continue et à la demande sur les postes de développement</li>
</ul>
<p></strong></p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=5295" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%e2%80%99acceptance/' rel='bookmark' title='FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance'>FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance</a></li>
<li><a href='http://blog.octo.com/faut-il-passer-a-maven-3/' rel='bookmark' title='Faut-il passer à Maven 3 ?'>Faut-il passer à Maven 3 ?</a></li>
<li><a href='http://blog.octo.com/construire-ses-parsers-antlr-avec-maven-partie-2-3-avec-maven/' rel='bookmark' title='Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven'>Construire ses parsers ANTLR avec Maven &#8211; Partie 2/3 &#8211; Avec Maven</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/combien-de-temps-doit-prendre-un-build-maven/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

