<?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/"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:media="http://search.yahoo.com/mrss/"
> <channel><title>Blog Xebia France &#187; Maven</title> <atom:link href="http://blog.xebia.fr/tag/maven/feed/" rel="self" type="application/rss+xml" /><link>http://blog.xebia.fr</link> <description>J2EE, Agilité et SOA</description> <lastBuildDate>Wed, 08 Feb 2012 09:23:16 +0000</lastBuildDate> <language>fr</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <copyright>CC BY-NC-ND 2.0 http://creativecommons.org/licenses/by-nc-nd/2.0/fr/</copyright> <managingEditor>blog-france@xebia.com (Xebia France)</managingEditor> <webMaster>blog-france@xebia.com (Xebia France)</webMaster> <ttl>1440</ttl> <image> <url>http://blog.xebia.fr/videos/xebia-podcast.png</url><title>Blog Xebia France</title><link>http://blog.xebia.fr</link> <width>144</width> <height>144</height> </image> <itunes:new-feed-url>http://blog.xebia.fr/feed/podcast/</itunes:new-feed-url> <itunes:subtitle>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agi[...]</itunes:subtitle> <itunes:summary>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile.</itunes:summary> <itunes:keywords>Xebia, Java, JEE, SOA, Agile, Méthodes, Agiles</itunes:keywords> <itunes:category text="Technology" /> <itunes:category text="Technology"> <itunes:category text="Software How-To" /> </itunes:category> <itunes:category text="Technology"> <itunes:category text="Tech News" /> </itunes:category> <itunes:author>Xebia France</itunes:author> <itunes:owner> <itunes:name>Xebia France</itunes:name> <itunes:email>blog-france@xebia.com</itunes:email> </itunes:owner> <itunes:block>no</itunes:block> <itunes:explicit>no</itunes:explicit> <itunes:image href="http://blog.xebia.fr/videos/xebia-podcast.png" /> <item><title>Troisième édition de notre atelier : Continuous Deployment sur Tomcat avec Jenkins, Rundeck et DeployIt</title><link>http://blog.xebia.fr/2011/12/21/troisieme-edition-de-notre-atelier-continuous-deployment-sur-tomcat-avec-jenkins-rundeck-et-deployit/</link> <comments>http://blog.xebia.fr/2011/12/21/troisieme-edition-de-notre-atelier-continuous-deployment-sur-tomcat-avec-jenkins-rundeck-et-deployit/#comments</comments> <pubDate>Wed, 21 Dec 2011 07:00:54 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Tech Events]]></category> <category><![CDATA[Apache]]></category> <category><![CDATA[Continuous Delivery]]></category> <category><![CDATA[DeployIt]]></category> <category><![CDATA[DevOps]]></category> <category><![CDATA[Jenkins]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Rundeck]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=10030</guid> <description><![CDATA[Répondant à la demande, le 31 janvier nous rééditerons la soirée des 13 et 20 octobre derniers ! La saison est au Continuous Delivery ! Venez découvrir comment automatiser le déploiement d&#8217;une application java web typique sur des serveurs Tomcat via une usine GitHub/Jenkins/Nexus. Nous verrons plusieurs techniques de déploiement, de la plus simple à [...]]]></description> <content:encoded><![CDATA[<p>Répondant à la demande, le 31 janvier nous rééditerons la soirée des 13 et 20 octobre derniers !</p><p>La saison est au Continuous Delivery ! Venez découvrir comment automatiser le déploiement d&#8217;une application java web typique sur des serveurs Tomcat via une usine GitHub/Jenkins/Nexus.</p><p>Nous verrons plusieurs techniques de déploiement, de la plus simple à la plus sophistiquée :</p><ol><li>déploiement sur Tomcat avec des commandes shell lancées par Jenkins au lieu de les lancer à la main ;</li><li>utilisation du tomcat-maven-plugin avec les conseils d&#8217;<a
href="http://www.talendforge.org/community_member.php#OlivierLamy" title="Olivier Lamy sur TalendForge.org" target="_blank">Olivier Lamy</a>, lead developer du plugin et committer Tomcat ;</li><li>homogénéisation des déploiements du dev à la prod avec Jenkins associé à <a
href="http://rundeck.org/" title="Site de Rundeck" target="_blank">Rundeck</a> pour gérer des commandes shell. Vincent Behar, committer Jenkins et &#8216;owner&#8217; du jenkins-rundeck-plugin nous présentera cet outil Open Source en vogue chez les OPS ;</li><li>DeployIt : l&#8217;outil intégré d&#8217;automatisation des déploiements made in Xebia.</li></ol><p>Pour avoir plus de détails sur le déroulement de l&#8217;atelier et pour vous inscrire, nous vous invitons à utiliser la <a
href="http://xfr-continuous-delivery-jenkins-rundeck-3.eventbrite.com/" target="_blank">page dédiée sur Eventbrite</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/12/21/troisieme-edition-de-notre-atelier-continuous-deployment-sur-tomcat-avec-jenkins-rundeck-et-deployit/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Retour Atelier Continuous Delivery – Partie 2 &#8211; Déploiement continu avec Jenkins Remote SSH Plugin</title><link>http://blog.xebia.fr/2011/12/02/continuous-delivery-deploiement-jenkins-remote-ssh-plugin/</link> <comments>http://blog.xebia.fr/2011/12/02/continuous-delivery-deploiement-jenkins-remote-ssh-plugin/#comments</comments> <pubDate>Fri, 02 Dec 2011 14:30:14 +0000</pubDate> <dc:creator>Xavier Bucchiotty</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Tech Events]]></category> <category><![CDATA[Apache]]></category> <category><![CDATA[Continuous Delivery]]></category> <category><![CDATA[DeployIt]]></category> <category><![CDATA[DevOps]]></category> <category><![CDATA[Jenkins]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Rundeck]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=9641</guid> <description><![CDATA[Pour déployer une application sur un serveur Tomcat distant, nous avons vu précédemment comment utiliser Apache Tomcat Maven Plugin. Nous pouvons aussi utiliser un script. Cette solution plus élaborée est certainement plus proche des solutions d&#8217;exploitation existantes aujourd&#8217;hui dans nos entreprises.  Dans l&#8217;esprit DevOps, il faut avoir un mode de déploiement le plus tôt possible [...]]]></description> <content:encoded><![CDATA[<p>Pour déployer une application sur un serveur Tomcat distant, nous avons vu précédemment <a
href="http://blog.xebia.fr/2011/11/25/continuous-delivery-deploiement-apache-tomcat-maven-plugin/" rel="nofollow">comment utiliser Apache Tomcat Maven Plugin</a>. Nous pouvons aussi utiliser un script. Cette solution plus élaborée est certainement plus proche des solutions d&#8217;exploitation existantes aujourd&#8217;hui dans nos entreprises. </p><p>Dans l&#8217;esprit <a
href="http://devops.fr/" rel="nofollow">DevOps</a>, il faut avoir un mode de déploiement le plus tôt possible identique à celui de la production. L&#8217;approche par script convient ainsi à un <b>maximum d&#8217;environnements</b> possibles (du test jusqu&#8217;à la production).<br
/> Pour ce faire, le script sera placé sur le serveur distant et exécuté à distance.</p><p>Le but de cet article est de vous proposer une solution pour déployer une application web sur un serveur Tomcat distant à chaque commit sur votre repository. Pour cela, nous allons utiliser le plugin Remote SSH pour Jenkins.</p><h3><a
name="RetourAtelierContinuousDelivery-Partie2-DeploiementcontinuavecJenkinsRemoteSSHPlugin-Pr%C3%A9requis"></a>Prérequis</h3><p>Lors de l&#8217;atelier, les différents outils étaient fournis sur des machines virtuelles Linux sur Amazon EC2. Si vous souhaitez refaire les manipulations sur votre poste, vous aurez besoin d&#8217;installer :</p><ul><li>un <a
href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" rel="nofollow">JDK</a></li><li><a
href="http://maven.apache.org/download.html" rel="nofollow">Apache Maven</a></li><li><a
href="http://nexus.sonatype.org/download-nexus.html" rel="nofollow">Nexus</a></li><li><a
href="http://jenkins-ci.org/" rel="nofollow">Jenkins</a></li><li><a
href="http://tomcat.apache.org/download-60.cgi" rel="nofollow">Apache Tomcat 6</a></li><li>le script de déploiement créé pour l&#8217;atelier, disponible ici : <a
href="http://code.google.com/p/xebia-france/source/browse/cloudcomputing/xebia-cloudcomputing-extras/trunk/src/main/scripts/fr/xebia/workshop/continuousdelivery/tomcat-deploy-petclinic?r=2507" rel="nofollow">tomcat-deploy-petclinic</a>.</li></ul><p>Il vous faudra donc une machine distante avec un serveur SSH si vous souhaitez réaliser cet exemple.</p><h3><a
name="RetourAtelierContinuousDelivery-Partie2-DeploiementcontinuavecJenkinsRemoteSSHPlugin-T%C3%A9l%C3%A9chargementduprojetd%27exemple"></a>Téléchargement du projet d&#8217;exemple</h3><p>Nous avons mis à disposition un projet d&#8217;exemple <a
href="https://github.com/xebia-france-training/xebia-petclinic-lite" rel="nofollow">xebia-petclinic-lite</a> sous GitHub. Pour tester cet article, vous pouvez cloner ce projet. Nous avons déjà décrit cette partie dans <a
href="http://blog.xebia.fr/2011/11/25/continuous-delivery-deploiement-apache-tomcat-maven-plugin/" rel="nofollow">notre précédent article</a>.</p><pre class="brush: java; gutter: false; title: ; notranslate">
git clone https://github.com/xebia-france-training/xebia-petclinic-lite.git
</pre><p>Vous devez avoir un serveur Nexus installé en local. Une fois installé, vous devez changer dans le pom.xml les URLs des repositories avec vos valeurs (le serveur Nexus des Xebia Tech Events n&#8217;est actif que pendant les ateliers).</p><pre class="brush: xml; gutter: true; title: ; notranslate">
&lt;distributionManagement&gt;
 &lt;repository&gt;
  &lt;id&gt;xebia-tech-event-nexus-releases&lt;/id&gt;
  &lt;name&gt;Xebia Tech Event Nexus Releases&lt;/name&gt;
  &lt;url&gt;http://votreNexus/content/repositories/releases&lt;/url&gt;
 &lt;/repository&gt;
 &lt;snapshotRepository&gt;
  &lt;id&gt;xebia-tech-event-nexus-snapshots&lt;/id&gt;
  &lt;name&gt;Xebia Tech Event Nexus Snapshots&lt;/name&gt;
  &lt;url&gt;http://votreNexus/content/repositories/snapshots&lt;/url&gt;
 &lt;/snapshotRepository&gt;
&lt;/distributionManagement&gt;
</pre><p>Ensuite, un &laquo;&nbsp;<b>mvn deploy&nbsp;&raquo;</b> permettra d&#8217;avoir un projet fonctionnel déployé dans votre repository.</p><h3><a
name="RetourAtelierContinuousDelivery-Partie2-DeploiementcontinuavecJenkinsRemoteSSHPlugin-Cr%C3%A9ationduscript"></a>Création du script</h3><p>Le script shell que nous allons créer doit assurer les fonctions suivantes :</p><ul><li>Arrêter Tomcat,</li><li>Supprimer le war et les dossiers de l&#8217;application dans <code>webapps</code> et <code>temp</code>,</li><li>Télécharger une version de l&#8217;application depuis Nexus,</li><li>Démarrer Tomcat,</li><li>Effectuer un test de connexion HTTP à la page principale de l&#8217;application pour vérifier le bon démarrage de l&#8217;application déployée.</li></ul><p>Pour le téléchargement du war, nous faisons appel à l&#8217;<a
href="https://repository.sonatype.org/nexus-core-documentation-plugin/core/docs/index.html" rel="nofollow">API REST du serveur Nexus</a>. Nous allons utiliser le service <b>/</b><b><a
href="https://repository.sonatype.org/nexus-core-documentation-plugin/core/docs/rest.artifact.maven.content.html" rel="nofollow">artifact/maven/content</a></b>, dont voici les paramètres :</p><ul><li><b>g</b> : Group id de l&#8217;artéfact (Obligatoire).</li><li><b>a</b> : Artifact id de l&#8217;artéfact (Obligatoire).</li><li><b>v</b> : Version de l&#8217;artéfact (Obligatoire) Supporte les mots-clés comme &laquo;&nbsp;LATEST&nbsp;&raquo;, &laquo;&nbsp;RELEASE&nbsp;&raquo; et les version SNAPSHOT ou non (&laquo;&nbsp;1.0-SNAPSHOT&nbsp;&raquo;, &laquo;&nbsp;1.2.3&#8242; &#8230;).</li><li><b>r</b> : Identifiant du repository Nexus qui contient l&#8217;artéfact (Obligatoire). Attention, par défaut, les artéfacts versionnés et les snapshots ne sont pas stockés dans le même repository. Donc pensez à mettre le bon identifiant de repository ici &laquo;&nbsp;releases&nbsp;&raquo; ou &laquo;&nbsp;snapshots&nbsp;&raquo; (rechercher des versions SNAPSHOT dans le repository RELEASES ne va pas être simple !). Petite astuce, vous pouvez aller voir dans votre settings.xml de Maven pour connaitre les repositories (normalement, seulement présent sur le serveur d&#8217;intégration continue).</li><li><b>p</b> : Type de packaging de l&#8217;artéfact (Optionnel, par défaut il vaut .jar, donc pour un .war, il faut bien penser à  le spécifier).</li><li><b>c</b> : Qualificatif de l&#8217;artifact (Optionnel, voir la notion d&#8217;identifier dans MAVEN).</li><li><b>e</b> : Extension de l&#8217;artéfact (Optionnel)  A VOIR</li></ul><p>Ainsi, télécharger la dernière snapshot d&#8217;un artefact peut se faire grâce à une simple commande CURL sous Unix, dont voici un exemple :</p><pre class="brush: java; gutter: false; title: ; notranslate">
curl &quot;http://nexus.xebia-tech-event.info:8081/nexus/service/local/artifact/maven/content?g=fr.xebia.demo.petclinict&amp;a=xebia-petclinic-lite&amp;r=snapshots&amp;v=LATESTS&amp;e=war&quot; \
   --silent \
   --show-error  \
   --output &quot;/opt/tomcat/apache-tomcat-6/webapps/xebia-petclinic-lite.war&quot;
</pre><p>Comme dit plus haut, le serveur Nexus du Xebia Tech Event est démarré uniquement pendant les ateliers, inutile donc d&#8217;essayer cette URL depuis chez vous !</p><p>Pour vérifier le bon démarrage de Tomcat, on peut de nouveau utiliser la commande CURL pour vérifier si l&#8217;application est bien déployée. En voici un exemple :</p><pre class="brush: java; gutter: false; title: ; notranslate">
curl --connect-timeout 10 --retry 10 --silent --show-error -w &quot;%{http_code}&quot; -o /dev/null http://localhost:8080/xebia-petclinic-lite
</pre><p>Vous pouvez retrouver le script complet qui nous a servi pendant l&#8217;atelier sur <a
href="http://code.google.com/p/xebia-france/source/browse/cloudcomputing/xebia-cloudcomputing-extras/trunk/src/main/scripts/fr/xebia/workshop/continuousdelivery/tomcat-deploy-petclinic?r=2507" rel="nofollow">tomcat-deploy-petclinic</a>. Seules quelques adaptations seront nécessaires pour utiliser ce script sur vos environnements de production (changement de groupId, d&#8217;URL de repository Nexus, etc).</p><h3><a
name="RetourAtelierContinuousDelivery-Partie2-DeploiementcontinuavecJenkinsRemoteSSHPlugin-LepluginRemoteSSHpourJenkins"></a>Le plugin Remote SSH pour Jenkins</h3><p>Notre script est maintenant prêt. Il ne vous reste plus qu&#8217;à le transférer vers votre machine distante (par SCP ou FTP, comme bon vous semble). Une fois sur le serveur, vous pouvez le lancer &laquo;&nbsp;à la main&nbsp;&raquo; pour vérifier qu&#8217;il fonctionne.</p><p>Dans notre exemple, nous nous authentifions sur les serveurs grâce à des clés privées, mais le reste de l&#8217;exercice peut aussi se faire avec un login et un mot de passe si vous le souhaitez.</p><p>Le <b><a
href="https://wiki.jenkins-ci.org/display/JENKINS/SSH+plugin" rel="nofollow">Jenkins Remote SSH Plugin</a></b> permet de se connecter à un serveur distant et d&#8217;y exécuter une série de lignes de commande. Un des avantages majeurs de la solution est qu&#8217;elle n&#8217;est pas intrusive. En effet, il n&#8217;y a pas d&#8217;agent spécifique à installer sur la machine, un simple accès SSH suffit. La gestion des clés et mots de passe se trouve ainsi centralisée dans Jenkins.<br
/> Lancer le script fait donc parti d&#8217;un job Jenkins. On pourra ainsi créer des workflows avec une succession de jobs.</p><h4><a
name="RetourAtelierContinuousDelivery-Partie2-DeploiementcontinuavecJenkinsRemoteSSHPlugin-Installationetconfigurationduplugin"></a>Installation et configuration du plugin</h4><p>Pour installer le plugin, rendez-vous dans la partie <b>Administrer Jenkins</b>, <b>Gestion des plugins</b>, puis dans l&#8217;onglet <b>Disponible</b>. Cochez la ligne devant le plugin, puis cliquez sur le bouton <b>Installer</b> qui se trouve tout en bas de la page.</p><p>Une fois le plugin installé, il faut configurer la liste des hôtes que nous voulons utiliser dans nos Builds. Pour cela, rendez vous dans la partie <b>Administrer Jenkins</b>, <b>Configurer le système</b>. Vous avez accès une section <b>SSH Remote hosts</b> dans laquelle nous allons déclarer les hôtes. Les boutons <b>Ajouter</b> et <b>Supprimer</b> permettent de gérer facilement la liste. Ensuite, il n&#8217;y a plus qu&#8217;à remplir les hôtes avec les informations suivantes :</p><ul><li>Hostname : serveur hébergeant votre Tomcat (Obligatoire),</li><li>Port : d&#8217;écoute SSH (Optionnel, 22 par défaut),</li><li>User Name : nom de l&#8217;utilisateur qui sera connecté au serveur (Obligatoire),</li><li>Password/Passphrase : si vous utilisez une authentification simple, c&#8217;est ici qu&#8217;on ajoute le mot de passe, sinon cela peut aussi être la passphrase (Optionnel),</li><li>Keyfile : si vous utilisez une authentification avec clé privée, on ajoute ici le chemin vers la clé qui doit se trouver sur le même serveur que Jenkins (Optionnel).</li></ul><p><span
style="display: block; text-align: center"><img
src="http://blog.xebia.fr/wp-content/uploads/2011/12/jenkins-add-ssh-remote-host-screenshot-1.png" style="border: 0px solid black" /></span></p><p>Petit inconvénient, il est impossible de créer un alias pour la configuration de chaque serveur. De plus, la liste des hôtes est unique pour toute l&#8217;instance Jenkins. Si plusieurs projets sont présents sur l&#8217;instance, avec des noms d&#8217;hôtes relativement similaire, cela peut nuire à la lisibilité.</p><h4><a
name="RetourAtelierContinuousDelivery-Partie2-DeploiementcontinuavecJenkinsRemoteSSHPlugin-Exploitationduscript"></a>Exploitation du script</h4><p>Après avoir installé votre script sur la machine Tomcat et avoir déclaré ce serveur Tomcat dans Jenkins, nous allons maintenant configurer l&#8217;invocation du script.<br
/> Pour cela, il suffit de créer un projet <b>Free-style</b> dans Jenkins, de cocher l&#8217;option <b>Execute shell script on remote host using SSH</b>.<br
/> Sélectionnez ensuite l&#8217;hôte qui vous intéresse, puis dans la partie <b>Post-build script</b>, ajoutez la commande de lancement de votre script shell (par exemple /usr/local/script/deploy_on_tomcat ).<br
/> Vous pouvez lancer le job pour vérifier son fonctionnement.<br
/> Nous avons créé un job séparé ici, mais rien ne vous empêche de l&#8217;intégrer directement dans votre build Jenkins principal. Si vous déclenchez une intégration continue à chaque commit sur le dépôt de source, vous allez ainsi faire du déploiement continu sur votre serveur.<br
/> Si l&#8217;on possède plusieurs machines, il faudra par contre créer plusieurs jobs différents (c&#8217;est-à-dire créer plusieurs projets <b>Free Style</b>). L&#8217;hôte n&#8217;est pas paramétrable.</p><p><span
style="display: block; text-align: center"><img
src="http://blog.xebia.fr/wp-content/uploads/2011/12/jenkins-configure-job-ssh-post-build-script-screenshot.png" style="border: 0px solid black" /></span></p><h3><a
name="RetourAtelierContinuousDelivery-Partie2-DeploiementcontinuavecJenkinsRemoteSSHPlugin-Conclusion"></a>Conclusion</h3><p>Pour résumer, nous pouvons dresser le bilan suivant de l&#8217;utilisation du jenkins-ssh-plugin pour automatiser le déploiement depuis Jenkins sur des serveurs Tomcat :</p><p><b>Avantages</b></p><ul><li>Simple et rapide à mettre en place,</li><li>Pas d&#8217;agent à installer sur les serveurs,</li><li>Gestion centralisée des accès aux machines,</li><li>Se branche facilement sur l&#8217;intégration continue pour un déploiement continu en 0 clic,</li><li>Compatible avec un mode de livraison en production (avec un bon script bien robuste, rien n&#8217;est impossible !).</li></ul><p><b>Inconvénients</b></p><ul><li>Liste statique des hôtes</li><li>Tous les hôtes sont à un seul endroit dans la configuration, cela devient compliqué à gérer avec un nombre croissant d&#8217;environnements,</li><li>Le job est lié à la machine sur laquelle il exécute le script,</li><li>Impossible de déployer l&#8217;application sur plusieurs machines, sauf à créer plusieurs jobs,</li><li>Le script doit être déployé préalablement sur le(s) serveur(s) Tomcat.</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/12/02/continuous-delivery-deploiement-jenkins-remote-ssh-plugin/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Retour Atelier Continuous Delivery &#8211; Partie 1 &#8211; Déploiement avec Apache Tomcat Maven Plugin</title><link>http://blog.xebia.fr/2011/11/25/continuous-delivery-deploiement-apache-tomcat-maven-plugin/</link> <comments>http://blog.xebia.fr/2011/11/25/continuous-delivery-deploiement-apache-tomcat-maven-plugin/#comments</comments> <pubDate>Fri, 25 Nov 2011 08:00:51 +0000</pubDate> <dc:creator>Julia Mateo</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Tech Events]]></category> <category><![CDATA[Apache]]></category> <category><![CDATA[Continuous Delivery]]></category> <category><![CDATA[DeployIt]]></category> <category><![CDATA[DevOps]]></category> <category><![CDATA[Jenkins]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Rundeck]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=9462</guid> <description><![CDATA[Les 13 et 20 octobre derniers a eu lieu le deuxième Tech Event Xebia avec, cette fois, comme sujet le Déploiement Continu sur Tomcat avec Jenkins, Rundeck et Deployit. Pour l&#8217;occasion nous avons eu la collaboration spéciale de deux guest stars : Olivier Lamy, architecte chez Talend, membre de la fondation Apache et committer sur [...]]]></description> <content:encoded><![CDATA[<p>Les 13 et 20 octobre derniers a eu lieu le deuxième <a
href="http://blog.xebia.fr/tech-event/">Tech Event Xebia</a> avec, cette fois, comme sujet le Déploiement Continu sur Tomcat avec Jenkins, Rundeck et Deployit. Pour l&#8217;occasion nous avons eu la collaboration spéciale de deux <em>guest stars</em> :</p><ul><li><b><a
href="http://people.apache.org/~olamy/" rel="nofollow">Olivier Lamy</a></b>, architecte chez <b>Talend</b>, membre de la fondation Apache et committer sur Tomcat et sur Jenkins</li><li><b><a
href="http://vincent.behar.name/cv/" rel="nofollow">Vincent Behar</a></b>, ingénieur Java à <b>Exalead</b>, <em>owner</em> du plugin Rundeck pour Jenkins et cofondateur de <a
href="http://parisdevops.fr/" rel="nofollow">Paris Devops</a>, </li></ul><p>Merci à eux pour leur participation à la préparation de l&#8217;atelier ainsi qu&#8217;à sa présentation.</p><p><a
href="http://code.flickr.com/" rel="nofollow">Flickr</a> est l&#8217;exemple le plus évoqué à l&#8217;heure actuelle de déploiement continu. Il existe bien d&#8217;autres exemples connus comme <a
href="http://prettyprint.me/2011/01/24/continuous-deployment-at-outbrain/" rel="nofollow">Outbrain</a>, <a
href="http://eng.wealthfront.com/" rel="nofollow">Wealthfront</a> ou <a
href="http://codeascraft.etsy.com/2010/05/20/quantum-of-deployment/" rel="nofollow">Etsy</a>. Même si le nombre d&#8217;entreprises qui arrivent à ce niveau de maturité est encore faible, il est possible qu&#8217;à l&#8217;avenir cette méthode devienne une technique courante dans les projets avec la progression de l&#8217;agilité. Son implémentation oblige, en effet, à accomplir quelques principes du manifeste agile, dont par exemple :</p><div
style="border: dotted 1px #6A205F; background: #F0EDF1; padding:10px 30px;"><ul><li><em>Une attention continue à l&#8217;excellence technique et à la qualité de la conception améliore l&#8217;agilité.</em></li><li><em>Un logiciel fonctionnel est la meilleure unité de mesure de la progression du projet.</em></li></ul></div><p>Ainsi qu&#8217;à en pousser d&#8217;autres :</p><div
style="border: dotted 1px #6A205F; background: #F0EDF1; padding:10px 30px;"><ul><li><em>Livrez fréquemment un logiciel opérationnel avec des cycles de  quelques semaines à quelques mois et une préférence pour les plus  courts.</em></li><li><em>Notre première priorité est de satisfaire le client en livrant tôt et régulièrement des logiciels utiles.</em></li></ul></div><p>Quels sont les points forts du déploiement continu ?</p><ul><li>Etre au plus près des attentes du marché (le fameux Time to market) en fournissant aux utilisateurs les fonctionnalités qu&#8217;ils attendent dès qu&#8217;elles sont prêtes.</li><li>Minimiser le risque d&#8217;échec d&#8217;un gros déploiement.</li><li>Avoir un retour rapide des utilisateurs réels de l&#8217;application sur les nouvelles fonctionnalités de la version.</li><li>Une livraison fréquente permet aux utilisateurs de s&#8217;habituer progressivement aux nouveaux environnements ergonomiques.</li></ul><p>En revanche, l’implémentation du déploiement continu ne doit pas être sous-estimée. Sa mise en place oblige à une grande rigueur :</p><ul><li>Automatisation de toutes les phases de build, test et déploiement,</li><li>Configuration centralisée du déploiement et exécution sur chaque environnement,</li><li>Une haute disponibilité de l&#8217;infrastructure de production afin d&#8217;éviter les coupures de service,</li><li>Une couverture des tests exemplaire. Si les tests unitaires, d&#8217;intégration et d’acceptance passent, l&#8217;application répond aux besoins et peut en théorie partir en production à tout moment.</li><li>Communication fluide entre l&#8217;exploitation, les DBAs et les développeurs. Dans la ligne de ce que le mouvement <a
href="http://devops.fr/" rel="nofollow">Devops</a> préconise, on doit éviter les fractures organisationnelles et développer un environnement collaboratif en donnant priorité au bon fonctionnement du système.</li></ul><h3><a
name="DRAFT-RetourAtelierContinuousDelivery-Partie1-D%C3%A9ploiementavecApacheTomcatMavenPlugin-Notreatelier"></a>Notre atelier</h3><h4><a
name="DRAFT-RetourAtelierContinuousDelivery-Partie1-D%C3%A9ploiementavecApacheTomcatMavenPlugin-Pr%C3%A9sentationglobaledel%27architecture"></a>Présentation globale de l&#8217;architecture</h4><p>Revenons sur l&#8217;atelier. Le but de la soirée, par binôme, est de mettre la main à la pâte et configurer du déploiement continu. Pour ce faire, nous avons présenté comment déployer sur Tomcat l&#8217;application web modèle de Spring petclinic sur des  instances Amazon EC2. Les méthodes proposées étaient les suivantes :</p><ul><li>Le <a
href="http://tomcat.apache.org/maven-plugin.html" rel="nofollow">plugin Tomcat Maven</a></li><li>Le <a
href="https://wiki.jenkins-ci.org/display/JENKINS/SSH+plugin" rel="nofollow">plugin SSH pour Jenkins</a></li><li><a
href="http://rundeck.org/" rel="nofollow">Rundeck</a> et le <a
href="https://wiki.jenkins-ci.org/display/JENKINS/RunDeck+Plugin" rel="nofollow">plugin Rundeck pour Jenkins</a></li><li><a
href="http://www.xebialabs.com/" rel="nofollow">Deployit</a>, de XebiaLabs</li></ul><p>Afin de tester les différents outils, voici l&#8217;architecture utilisée:</p><ul><li>Une instance Amazon avec un Nexus pour gérer les artifacts de tous les assistants.</li><li>Un repository xebia-petclinic-X sur GitHub pour chaque équipe/binôme (où chaque équipe avait un numéro X associé)</li><li>Une instance Amazon EC2 avec un Jenkins, un Rundeck et un Deployit par équipe</li><li>Trois instances Amazon EC2 dont deux avaient un Tomcat qu&#8217;on a appellé “valid” (ou de production) et le troisième un Tomcat de “dev” (ou d&#8217;intégration/qualité)</li></ul><p><span
style="display: block; text-align: center"><img
src="http://blog.xebia.fr/wp-content/uploads/2011/11/imagen-infrastructure-par-equipe.png" height="293" width="434" style="border: 0px solid black" /></span></p><p>Cette infrastructure est générée à chaud au début de chaque atelier avec un script écrit en java. Pour vous faire une idée, le nombre de nœuds créés pour chaque atelier a été autour des 45 (20 participants regroupés en binômes). Le démarrage des instances Amazon Linux a été fait avec le package d&#8217;AWS SDK pour Java. Pour l&#8217;initialisation et configuration de Nexus, Jenkins, Rundeck et Tomcat, nous avons utilisé le package d&#8217;Ubuntu <a
href="https://help.ubuntu.com/community/CloudInit" rel="nofollow">Cloud-init</a>. Puisque le serveur Nexus est partagé par tous les utilisateurs de l&#8217;atelier, une adresse Elastic-IP d&#8217;Amazon lui est assignée à son démarrage. La création automatique de chaque repository github par binôme a été faite avec <a
href="http://develop.github.com/" rel="nofollow">l&#8217;API V2 de GitHub</a>. Pour ceux intéressés à avoir plus des détails sur la création et l&#8217;initialisation des instances Amazon pour ce workshop, sachez que dans les prochains jours nous publierons à ce propos un nouveau billet.</p><h3><a
name="DRAFT-RetourAtelierContinuousDelivery-Partie1-D%C3%A9ploiementavecApacheTomcatMavenPlugin-Pr%C3%A9sentationdeApacheTomcatMavenPlugin"></a>Présentation de Apache Tomcat Maven Plugin</h3><p>La première méthode de déploiement proposée utilise le plugin Apache Tomcat Maven. Olivier Lamy nous a fait une présentation des fonctionnalités de ce plugin qui facilite les opérations sur les wars quand on déploie sur Tomcat. Voici quelques-uns des goals disponibles :</p><ul><li><em>tomcat:run</em> permet de déployer un war sur un tomcat embarqué. Le plugin délègue à maven le téléchargement automatique des jars pour pouvoir l’exécuter. Cela permet le rechargement à chaud des jsp, css, html …</li><li><em>tomcat:deploy</em> déploie un war dans un tomcat démarré.</li></ul><p>Ainsi que les nouvelles fonctionnalités à venir :</p><ul><li>Support pour tomcat 7</li><li>Un nouveau goal qui permettra de créer un jar standalone pour pouvoir exécuter le war sur tomcat. Le jar inclura la webapp aussi que tous les jars de tomcat nécessaires.<br
/> Par exemple : <b>mvn tomcat7:exec-war</b> génère un jar <em>my-project-exec-war.jar</em><br
/> <b>jar -jar my-project-exec-war.jar</b> lance le tomcat avec la webapp avec une configuration par défaut. Il est aussi configurable en renseignant des paramètres (-httpPort -ajpPort&#8230;)</li></ul><p>Durant le workshop, nous avons utilisé le goal « tomcat : deploy » afin de déployer l&#8217;application exemple en local, puis sur l&#8217;instance Amazon avec le Tomcat de Dev. Pour cela, il suffit de rajouter le plugin tomcat maven au pom.xml du projet comme ci-dessous :</p><pre class="brush: xml; gutter: true; title: ; notranslate">
&lt;plugin&gt;
     &lt;groupId&gt;org.apache.tomcat.maven&lt;/groupId&gt;
     &lt;artifactId&gt;tomcat6-maven-plugin&lt;/artifactId&gt;
     &lt;version&gt;2.0-SNAPSHOT&lt;/version&gt;
     &lt;configuration&gt;
          &lt;update&gt;true&lt;/update&gt;
     &lt;/configuration&gt;
&lt;/plugin&gt;
</pre><p>A noter qu&#8217;il faut aussi avoir installé Tomcat Manager sur l&#8217;instance Tomcat cible puisque le goal utilise le Tomcat Manager de l&#8217;instance et un upload HTTP pour déployer le war sur le serveur dont l&#8217;url sera spécifiée dans le paramètre <em>-Dmaven.tomcat.url</em>. Le login et le password pour Tomcat Manager devront aussi être passés dans la commande :</p><pre class="brush: bash; gutter: true; title: ; notranslate">
mvn tomcat6:deploy -Dtomcat.password=admin -Dtomcat.username=admin -Dmaven.tomcat.url=http://ecX-XX-XX-XXX.eu-west-1.compute.amazonaws.com:8080/manager
</pre><p>Ce goal peut aussi être rattaché à la phase de deploy d&#8217;un profil en particulier (dans l&#8217;exemple ci-dessous, <em>tdeploy</em>) :</p><pre class="brush: bash; gutter: true; title: ; notranslate">
mvn deploy -Ptdeploy
</pre><p>Si vous souhaitez refaire la manipulation chez vous, il vous suffit de cloner le projet, depuis <a
href="https://github.com/xebia-france-training/xebia-petclinic-lite" rel="nofollow">https://github.com/xebia-france-training/xebia-petclinic-lite</a>.</p><p>Puis exécuter le goal précédemment donné pour effectuer la manipulation.</p><h3><a
name="DRAFT-RetourAtelierContinuousDelivery-Partie1-D%C3%A9ploiementavecApacheTomcatMavenPlugin-Conclusions"></a>Conclusions</h3><p>Suite à l&#8217;exercice de déploiement avec le plugin, nous pouvons faire les conclusions suivantes:</p><style>table {border: hidden; border-collapse: collapse; font-size: small;}
tr, th, td {border: dotted 1px #6A205F; padding: 5px;}
th {background: #F0EDF1;}</style><p><strong>Déploiement avec Tomcat Maven Plugin</strong></p><table><tr><th> <img
src="http://blog.xebia.fr/wp-content/uploads/2011/11/add.gif" style="border: 0px solid black" /></th><th> <img
src="http://blog.xebia.fr/wp-content/uploads/2011/11/forbidden.gif" style="border: 0px solid black" /></th></tr><tr><td><ul><li>Simple à mettre en place</li><li>Simple à utiliser</li></ul></td><td><ul><li>Tomcat Manager est déconseillé en production</li><li>Tomcat Manager ne redémarre pas la JVM : risque de fuite de mémoire</li><li>Mode léger pour la production (login/password)</li><li>Il n&#8217;est pas très adapté au cluster :<ul><li>impossibilité de déployer sur plusieurs<li>instances en parallèle</ul></li></ul></td></tr></table><p>Si on compare le déploiement via ce plugin avec les méthodes que nous présenterons dans nos prochains billets (le plugin SSH pour Jenkins, Rundeck ou Deployit), vous verrez qu&#8217;il s&#8217;éloigne quelque peu des méthodes habituelles d&#8217;installation d&#8217;un livrable en production. Une mise en production se résume rarement à simplement déployer un war sur un seul serveur Tomcat via HTTP. En effet, l&#8217;application pourrait être clusterisée, il pourrait y avoir besoin de copier des fichiers de configuration supplémentaires, ou encore de passer des scripts SQL. Comme vous le verrez après, les autres alternatives se basent sur un script shell qui laisse la porte ouverte à d&#8217;autres opérations.</p><p>Dans nos prochains billets, nous vous présenterons le déploiement via le plugin SSH pour Jenkins, Rundeck ainsi qu&#8217;un dernier article dédié à la création automatique de l&#8217;infrastructure utilisée dans ce workshop.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/11/25/continuous-delivery-deploiement-apache-tomcat-maven-plugin/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Deployer un artefact sur repo1.maven.org</title><link>http://blog.xebia.fr/2011/06/22/deployer-un-artefact-sur-repo1-maven-org/</link> <comments>http://blog.xebia.fr/2011/06/22/deployer-un-artefact-sur-repo1-maven-org/#comments</comments> <pubDate>Wed, 22 Jun 2011 17:30:28 +0000</pubDate> <dc:creator>Issam El Fatmi</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Artefact]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Maven Central Repository]]></category> <category><![CDATA[repo1.maven.org]]></category> <category><![CDATA[Sonatype]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=8072</guid> <description><![CDATA[Vous avez peut-être eu l&#8217;obsession de voir « maven » en train de télécharger vos propres artefacts à partir de son repository central. Du moins vous vous êtes sûrement posé la question : mon projet est mavenisé, open source, sur une forge publique (github, googlecode, etc.) et il est destiné à être utilisé par le [...]]]></description> <content:encoded><![CDATA[<p>Vous avez peut-être eu l&#8217;obsession de voir « maven » en train de télécharger vos propres artefacts à partir de son repository central. Du moins vous vous êtes sûrement posé la question : mon projet est mavenisé, open source, sur une forge publique (github, googlecode, etc.) et il est destiné à être utilisé par le plus grand nombre ; pourquoi ne pas le publier sur le Maven Central Repository (<a
title="httprepo1mavenorg" href="http://repo1.maven.org">http://repo1.maven.org</a>) ?</p><p>Au lieu de penser à ouvrir votre Nexus sur Internet ou encore à créer votre propre repository sur Google Code ou autre, nous vous proposons de directement déployer sur le Maven Central Repository, ce qui, en plus de vous épargner l&#8217;installation d&#8217;un repository, facilitera l&#8217;utilisation de votre artefact.</p><p>Le but de ce billet est de décrire la marche à suivre pour la publication d&#8217;un artefact en passant par le repository de Sonatype. Ce dernier étant un repository approuvé pour tout projet OSS comme c&#8217;est le cas du repository Apache (pour les projets Apache) et celui du <a
title="Codehaus" href="http://repository.codehaus.org">Codehaus</a> (pour les projets Codehaus). Le fait de passer par Sonatype vous garantit d&#8217;une part, un processus de validation structurant qui impose un ensemble de points de contrôle (licence, copyright, traçabilité, etc.) augmentant ainsi la qualité des métadonnées, et d&#8217;autre part une synchronisation rapide avec le Maven Central Repository.</p><p>Il s&#8217;agit également de vous faire profiter de notre expérience sur le sujet avec le déploiement de quelques artefacts tels que <a
title="mindmap-maven-plugin" href="http://repo1.maven.org/maven2/fr/xebia/maven/plugins/mindmap-maven-plugin/">mindmap-maven-plugin</a>, <a
title="xebia-management-extras" href="http://repo1.maven.org/maven2/fr/xebia/management/xebia-management-extras/">xebia-management-extras</a>, <a
title="xebia-spring-security-extras" href="http://repo1.maven.org/maven2/fr/xebia/springframework/xebia-spring-security-extras/">xebia-spring-security-extras</a> et <a
title="xebiaservletextras" href="http://repo1.maven.org/maven2/fr/xebia/web/extras/xebia-servlet-extras/">xebia-servlet-extras</a>.</p><p>Ce qui est présenté par la suite est basé principalement sur le guide officiel fourni par Sonatype: <a
title="https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide" href="https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide">https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide</a></p><h2><a
name="Choixdelalicenceduprojet"></a>Choix de la licence du projet</h2><p>Chacun appliquera sur son code la licence qui lui convient. C&#8217;est à la fois un choix &laquo;&nbsp;tactique&nbsp;&raquo; pour cibler ses utilisateurs et &laquo;&nbsp;philosophique&nbsp;&raquo; selon ses convictions. Pour résumer ce sujet qui mériterait un billet complet, il y a deux grandes familles de licences :</p><ul><li>les licences &laquo;&nbsp;business friendly&nbsp;&raquo; (Apache Software Licence, MIT, BSD, etc) qui facilitent l&#8217;intégration dans toute programme (y compris &laquo;&nbsp;close source&nbsp;&raquo; et commercial)</li><li>les licences &laquo;&nbsp;business unfriendly&nbsp;&raquo; (GPL, Aferro GPL, etc) qui sont qualifiées de virales et ne permettent pas l&#8217;intégration dans des logiciels &laquo;&nbsp;close source&nbsp;&raquo;</li></ul><p>Pour aller plus loin sur le sujet, nous vous recommandons <a
title="451 Chaos Group - 06/2011 : The trend towards permissive licensing" href="http://blogs.the451group.com/opensource/2011/06/06/the-trend-towards-permissive-licensing/">451 Chaos Group &#8211; 06/2011 : The trend towards permissive licensing</a> et notre récent billet <a
title="Rponses au Quizz Licences Open Source" href="http://blog.xebia.fr/2011/05/16/reponses-au-quizz-licences-open-source/">Réponses au Quizz Licences Open Source</a>.</p><h2><a
name="Applicationdelalicencesurlesfi"></a>Application de la licence sur les fichiers de son projet</h2><ul><li>Tous les fichiers doivent porter le header de la licence</li><li>Un fichier LICENSE (<a
title="exemple" href="^LICENSE.txt">exemple</a>) à la racine doit être reporté dans les artefacts générés</li><li>Un fichier NOTICE (<a
title="exemple" href="^NOTICE.txt">exemple</a>) à la racine doit mentionner les copyrights des dépendances</li></ul><p>Si vous êtes dans le cas d&#8217;une licence APV2, vous pouvez toujours vous référer à ce lien : <a
title="Applying the license to new software" href="http://www.apache.org/dev/apply-license.html">Applying the license to new software</a>.</p><p>Le <a
title="apacheratplugin" href="http://incubator.apache.org/rat/apache-rat-plugin/">apache-rat-plugin</a> permet de vérifier la conformité du projet et peut <em>casser</em> le build dans le cas contraire.</p><p>Exemple de déclaration des ressources dans un pom maven pour intégrer les fichiers LICENSE et NOTICE dans les artefacts:</p><pre class="brush: xml; title: ; notranslate">
&lt;project ...&gt;
 ...
 &lt;resources&gt;
  &lt;resource&gt;
   &lt;directory&gt;${basedir}/src/main/resources&lt;/directory&gt;
   &lt;filtering&gt;true&lt;/filtering&gt;
  &lt;/resource&gt;
  &lt;resource&gt;
   &lt;directory&gt;${basedir}&lt;/directory&gt;
   &lt;targetPath&gt;META-INF&lt;/targetPath&gt;
   &lt;includes&gt;
    &lt;include&gt;LICENSE&lt;/include&gt;
    &lt;include&gt;NOTICE&lt;/include&gt;
   &lt;/includes&gt;
  &lt;/resource&gt;
 &lt;/resources&gt;
 ...
&lt;/project&gt;
</pre><p>Exemple d&#8217;utilisation du apache-rat-plugin dans un pom maven:</p><pre class="brush: xml; title: ; notranslate">
&lt;project ...&gt;
   ...
   &lt;plugin&gt;
    &lt;groupId&gt;org.apache.rat&lt;/groupId&gt;
    &lt;artifactId&gt;apache-rat-plugin&lt;/artifactId&gt;
    &lt;version&gt;0.7&lt;/version&gt;
    &lt;executions&gt;
     &lt;execution&gt;
      &lt;phase&gt;verify&lt;/phase&gt;
      &lt;goals&gt;
       &lt;goal&gt;check&lt;/goal&gt;
      &lt;/goals&gt;
     &lt;/execution&gt;
    &lt;/executions&gt;
   &lt;/plugin&gt;
   ...
&lt;/project&gt;
</pre><h2><a
name="Miseenconformitdupommaven"></a>Mise en conformité du pom maven</h2><p>Le fichier pom.xml doit obligatoirement porter les informations suivantes:</p><ul><li>&lt;modelVersion&gt;</li><li>&lt;groupId&gt;</li><li>&lt;artifactId&gt;</li><li>&lt;version&gt;</li><li>&lt;packaging&gt;</li><li>&lt;name&gt;</li><li>&lt;description&gt;</li><li>&lt;url&gt;</li><li>&lt;licenses&gt;</li><li>&lt;scm&gt;&lt;url&gt;</li><li>&lt;scm&gt;&lt;connection&gt;</li><li>&lt;developers&gt;</li></ul><p>Pour faciliter le déploiement des artifacts sur le repository <a
title="httposssonatypeorg" href="http://oss.sonatype.org">http://oss.sonatype.org</a> qui sert de <em>bac à sable</em> de validation, le plus simple est de référencer le pom parent &laquo;&nbsp;<code>org.sonatype.oss:oss-parent</code>&nbsp;&raquo; fourni par sonatype. Exemple :</p><pre class="brush: xml; title: ; notranslate">
&lt;project...&gt;
  &lt;parent&gt;
    &lt;groupId&gt;org.sonatype.oss&lt;/groupId&gt;
    &lt;artifactId&gt;oss-parent&lt;/artifactId&gt;
    &lt;version&gt;7&lt;/version&gt;
  &lt;/parent&gt;
  ...
&lt;/project&gt;
</pre><p>(?) De plus, il est fortement recommandé que le pom.xml ne référence pas de repository (cf. <a
title="Why Putting Repositories in your POMs is a Bad Idea" href="http://www.sonatype.com/people/2009/02/why-putting-repositories-in-your-poms-is-a-bad-idea/">Why Putting Repositories in your POMs is a Bad Idea</a>)</p><h2><a
name="SignaturedesartefactsavecGPG"></a>Signature des artefacts avec GPG</h2><p>Les artefacts publiés sur repo1.maven.org doivent être signés.</p><p>Le pom parent org.sonatype.oss:oss-parent utilise le <a
title="maven-gpg-plugin" href="http://maven.apache.org/plugins/maven-gpg-plugin/">maven-gpg-plugin</a> qui se base sur l&#8217;implémentation <a
title="GnuPG" href="http://www.gnupg.org/">GnuPG</a> du standard <a
title="OpenPGP" href="http://www.openpgp.org/about_openpgp/">OpenPGP</a> pour la signature des artefacts. Pour s&#8217;appuyer dessus, vous devez :</p><ul><li>Installer un client GPG (e.g. <a
title="Mac GNU Privacy Guard" href="http://macgpg.sourceforge.net/">Mac GNU Privacy Guard</a>)</li><li>Créer votre paire de clés GPG (privée/publique) (cf <a
title="GPG Quick Start" href="http://www.madboa.com/geek/gpg-quickstart/">GPG Quick Start</a> par Paul Heinlein)</li><li>Distribuer votre clé publique sur un serveur de clé PGP:</li></ul><pre class="brush: java; title: ; notranslate">
gpg --keyserver hkp://pool.sks-keyservers.net --send-keys your_public_key_ID
</pre><ul><li>Tester votre clé avec maven-gpg-plugin:</li></ul><pre class="brush: java; title: ; notranslate">
mvn package gpg:sign -Dgpg.passphrase=PASSPHRASE
</pre><h2><a
name="Crationduncomptesurosssonatype"></a>Création d&#8217;un compte sur oss.sonatype.org</h2><p>La création d&#8217;un compte pour déployer sur oss.sonatype.org se fait en créant un compte <a
title="httpsissuessonatypeorg" href="https://issues.sonatype.org/">https://issues.sonatype.org/</a> .</p><h2><a
name="CrationdunticketJiradedemanded"></a>Création d&#8217;un ticket Jira de demande d&#8217;autorisation : obligatoire pour la première publication</h2><p>Il vous faut faire une demande à Sonatype en créant un ticket Jira de demande de publication d&#8217;artefact dans lequel on précise :</p><ul><li>Summary : description rapide du projet</li><li>GroupId	: groupId du projet Maven. Ce groupe doit reprendre le nom de domaine du projet (e.g. : fr.xebia, com.googlecode.myproject, etc.)</li><li>Project URL	: l&#8217;url du projet (e.g. <a
title="httpxebiafrancegooglecodecom" href="http://xebia-france.googlecode.com/">http://xebia-france.googlecode.com/</a></li><li>SCM URL : l&#8217;url du gestionnaire de source (e.g. <a
title="httpxebiafrancegooglecodecomsvn" href="http://xebia-france.googlecode.com/svn/">http://xebia-france.googlecode.com/svn/</a>)</li><li>Nexus Username : le ou les logins de connexion au JIRA  : <a
title="httpsissuessonatypeorg" href="https://issues.sonatype.org/">https://issues.sonatype.org/</a></li><li>Already Sync To Central : indique si des versions de l&#8217;artefact ont déjà été déployées sur le Maven Central Repository (si oui, Sonatype les réintégrera dans le fichier maven-metadata.xml)</li><li>Description : toute information complémentaire</li></ul><p>Exemple de demande :  <a
title="OSSRH995  Managements extras  jmxification of utilconcurrent  dbcp  jms Profiled annotation etc" href="https://issues.sonatype.org/browse/OSSRH-995">OSSRH-995 : Managements extras : jmx-ification of util.concurrent / dbcp / jms, @Profiled annotation, etc</a></p><h2><a
name="Dploiementdessnapshotsetdessta"></a>Déploiement des snapshots et des staging releases avec maven</h2><h3><a
name="ComplterllmentSCMaveclesinform"></a>Compléter l&#8217;élément SCM avec les informations de votre repository</h3><ul><li>Subversion:</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;project&gt;
  ...
  &lt;scm&gt;
    &lt;connection&gt;scm:svn:http://host_name/svn/path_to_project/trunk/&lt;/connection&gt;
    &lt;developerConnection&gt;scm:svn:https://host_name/svn/path_to_project/trunk/&lt;/developerConnection&gt;
    &lt;url&gt;http://host_name/svn/path_to_project/&lt;/url&gt;
  &lt;/scm&gt;
  ...
&lt;/project&gt;
</pre><ul><li>Github:</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;project&gt;
  ...
  &lt;scm&gt;
    &lt;connection&gt;scm:git:git@github.com:user/project_name.git&lt;/connection&gt;
    &lt;developerConnection&gt;scm:git:git@github.com:user/project_name.git&lt;/developerConnection&gt;
    &lt;url&gt;git@github.com:user/project_name.git&lt;/url&gt;
  &lt;/scm&gt;
  ...
&lt;/project&gt;
</pre><h3><a
name="Configurerlefichiersettingsxml"></a>Configurer le fichier settings.xml</h3><ul><li>Accès au repository nexus de sonatype:</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;settings&gt;
  ...
  &lt;servers&gt;
    &lt;server&gt;
      &lt;id&gt;sonatype-nexus-snapshots&lt;/id&gt;
      &lt;username&gt;your_jira_id&lt;/username&gt;
      &lt;password&gt;your_jira_pwd&lt;/password&gt;
    &lt;/server&gt;
    &lt;server&gt;
      &lt;id&gt;sonatype-nexus-staging&lt;/id&gt;
      &lt;username&gt;your_jira_id&lt;/username&gt;
      &lt;password&gt;your_jira_pwd&lt;/password&gt;
    &lt;/server&gt;
  &lt;/servers&gt;
  ...
&lt;/settings&gt;
</pre><ul><li>Accès au repository du code source</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;settings&gt;
  ...
  &lt;servers&gt;
    &lt;server&gt;
      &lt;id&gt;host_name_of_your_scm_url&lt;/id&gt;
      &lt;username&gt;user_name&lt;/username&gt;
      &lt;password&gt;password&lt;/password&gt;
    &lt;/server&gt;
  ...
&lt;/settings&gt;
</pre><h3><a
name="PrparerlareleaseCrationdunnouv"></a>Préparer la release: Création d&#8217;un nouveau tag sur le repository du code source</h3><pre class="brush: java; title: ; notranslate">
mvn release:prepare -Dresume=false (alternativement mvn release:clean release:prepare)
</pre><h3><a
name="Dployerlenouveautagdanslestagi"></a>Déployer le nouveau tag dans le staging repository</h3><pre class="brush: java; title: ; notranslate">
mvn release:perform -Darguments=-Dgpg.passphrase=&lt;&lt;PASSPHRASE&gt;&gt;
</pre><h2><a
name="Publicationdevotreartefactutil"></a>Publication de votre artefact : utilisation de <a
title="nexusmavenplugin" href="https://repository.sonatype.org/content/sites/maven-sites/nexus-maven-plugin/">nexus-maven-plugin</a></h2><h3><a
name="Ajouterorgsonatypepluginsdansl"></a>Ajouter org.sonatype.plugins dans la section &lt;pluginGroups&gt; du fichier settings.xml</h3><pre class="brush: xml; title: ; notranslate">
&lt;settings&gt;
  ...
  &lt;pluginGroups&gt;
    &lt;pluginGroup&gt;org.sonatype.plugins&lt;/pluginGroup&gt;
  &lt;/pluginGroups&gt;
  ...
&lt;/settings&gt;
</pre><h3><a
name="Afficherlalistedesstagingrepos"></a>Afficher la liste des staging repositories : un staging repository par artefact</h3><pre class="brush: java; title: ; notranslate">
mvn nexus:staging-list
</pre><p>Ce qui vous permettra d&#8217;obtenir la liste des repositories ouverts et clôturés si il en existe :</p><p><a
href="http://blog.xebia.fr/wp-content/uploads/2011/06/staging-list.png"><img
class="aligncenter size-medium wp-image-8078" title="staging-list" src="http://blog.xebia.fr/wp-content/uploads/2011/06/staging-list.png" alt="staging-list" width="600" height="200" /></a></p><h3><a
name="Clturerunstagingrepository"></a>Clôturer un staging repository</h3><pre class="brush: java; title: ; notranslate">
mvn nexus:staging-close
</pre><p>Sélectionnez à partir de la liste le repository à clôturer et suivre les instructions:</p><p><a
href="http://blog.xebia.fr/wp-content/uploads/2011/06/staging-close.png"><img
class="aligncenter size-medium wp-image-8080" title="staging-close" src="http://blog.xebia.fr/wp-content/uploads/2011/06/staging-close.png" alt="staging-close" width="600" height="300" /></a></p><h3><a
name="Publierlartefactactionirrversi"></a>Publier l&#8217;artefact : action irréversible (aucun update ou delete ne sera possible)</h3><pre class="brush: java; title: ; notranslate">
mvn nexus:staging-promote
</pre><p>Sélectionnez le repository à publier:</p><p><a
href="http://blog.xebia.fr/wp-content/uploads/2011/06/staging-promote.png"><img
class="aligncenter size-medium wp-image-8081" title="staging-promote" src="http://blog.xebia.fr/wp-content/uploads/2011/06/staging-promote.png" alt="staging-promote" width="600" height="300" /></a></p><p>Vous pouvez maintenant retrouver votre actefact sur le <a
title="releases repository de Sonatype" href="https://oss.sonatype.org/content/repositories/releases/">releases repository de Sonatype</a> en attendant la synchronisation avec le repo1.maven.org qui vous permettra après quelques heures de le voir à partir du <a
title="Maven Central Repository Browser" href="http://search.maven.org/#browse">Maven Central Repository Browser</a></p><h2><a
name="Activerlasynchronisationavecle"></a>Activer la synchronisation avec le repository central repo1.maven.org</h2><p>Pour une première publication, vous avez besoin de compléter le ticket JIRA précédemment créé par un commentaire afin de communiquer à Sonatype que votre staging repository est passé en &laquo;&nbsp;released&nbsp;&raquo;. Après étude, Sonatype activera la synchronisation centrale et fermera votre ticket.</p><p>Désormais, vos futures publications seront synchronisées automatiquement (pas besoin de création de ticket JIRA pour les prochaines releases).</p><h2><a
name="EtlimpactduclashentreSonatypee"></a>Et l&#8217;impact du clash entre Sonatype et la Fondation Apache dans tout ça ?</h2><p>La Fondation Apache et la société Sonatype sont en grand froid en ce moment (<a
title="Maven Dev Mailing List  PMC change explanation" href="http://maven.40175.n5.nabble.com/PMC-change-explanation-tt4495131.html#none">Maven Dev Mailing List : PMC change explanation</a>). Nous ne polémiquerons pas sur le sujet. Nous n&#8217;avons pas vu d&#8217;impact sur la publication d&#8217;artefacts sur la Maven Central Repository (maven.org est géré par Sonatype, et non par la Fondation Apache).</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/06/22/deployer-un-artefact-sur-repo1-maven-org/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Le Mind Mapping appliqué aux dépendances des projets &#171;&#160;mavénisés&#160;&#187;</title><link>http://blog.xebia.fr/2011/05/05/le-mind-mapping-applique-aux-dependances-des-projets-mavenises/</link> <comments>http://blog.xebia.fr/2011/05/05/le-mind-mapping-applique-aux-dependances-des-projets-mavenises/#comments</comments> <pubDate>Thu, 05 May 2011 17:15:54 +0000</pubDate> <dc:creator>Issam El Fatmi</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Mind Mapping]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7639</guid> <description><![CDATA[Comme vous l’avez peut-être constaté dans vos applications d’entreprise, les dépendances des modules sont parfois difficiles à appréhender, de par leur nombre et la complexité des relations. Encore plus si vous vous retrouvez face à un chantier de refactoring important qui touche à votre application en sa globalité (refonte du modèle métier, éclatement de modules, [...]]]></description> <content:encoded><![CDATA[<p>Comme vous l’avez peut-être constaté dans vos applications d’entreprise, les dépendances des modules sont parfois difficiles à appréhender, de par leur nombre et la complexité des relations.</p><p>Encore plus si vous vous retrouvez face à un chantier de refactoring important qui touche à votre application en sa globalité (refonte du modèle métier, éclatement de modules, restructuration des couches logicielles, migration de framework, externalisation des traitements communs en aspect, …) ; assurer la réussite d&#8217;un tel chantier s&#8217;avère généralement une tâche difficile : vous avez beau essayé de pousser l’étude d’impact au bout, les surprises sont toujours au rendez-vous.</p><p>Garder un œil sur l’application en phase de transformation implique systématiquement une prise de « snapshots » réguliers des dépendances entre modules ; cela vous permettra sans doute de savoir rapidement si vous êtes sur la bonne voie, ou si un « break &#8211; rethink to avoid worse » est nécessaire.</p><p>C’est dans cette optique que le <strong>Mind Mapping</strong> s’impose afin de fournir une vue documentaire visuelle facilement exploitable des dépendances des modules ; vous permettant ainsi de contrôler la tendance du projet et d’éviter toute apparition de dépendance cyclique directe ou indirecte (transitive), du moins la faire disparaître assez rapidement si elle est déjà là.</p><p>De ce fait, on s’aperçoit que cette approche a plus de valeur ajoutée pour le Lead technique ou encore l’architecte de l’équipe de développement que pour le développeur. Quant à ce dernier, et si besoin (on ne s’amuse pas à faire des « mvn dependency:tree » tous les jours), il pourrait rester fidèle aux outils qui viennent accompagner son IDE, que ce soit sous forme de plugin (Jdepend, byecycle, M2Eclipse avec  Dependency graph view et Dependency Hierarchy view, …) ou encore en standalone (JDepend, mvn dependency:tree, …).</p><p>Dans cet article, on s’intéresse particulièrement aux projets « mavénisés ». La démarche consiste, pour un module donné, à produire un artefact pouvant être exploité par un outil open source de Mind Mapping. L’idée est donc de développer un simple plugin maven en charge de générer un fichier au format attendu pour l’outil. Il existe plusieurs logiciels open source de Mind Mapping à savoir <a
title="FreeMind" href="http://freemind.sourceforge.net/wiki/index.php/Main_Page">FreeMind</a>, <a
title="FreePlane" href="http://sourceforge.net/projects/freeplane/">FreePlane</a> (un dérivé de FreeMind), <a
title="Xmind" href="http://www.xmind.net/">Xmind</a>, etc. Le choix est fait sur FreePlane qui traite des fichiers de type « .mm ».</p><h3><a
name="LaMindMapUnvritablecouteausuis"></a>La « Mind Map »: Un véritable couteau suisse de la pensée</h3><p>La Mind Map se veut une représentation visuelle externe de ce qui se passe dans le cerveau. Ainsi, on peut s&#8217;en servir pour refléter la pensée, la réflexion, la connaissance, la mémoire et stimuler la créativité.<br
/> Les cartes mentales « Mind Maps », ou encore les cartes heuristiques, représentent par définition, une méthode graphique pour prendre des notes. Leur base visuelle permet de distinguer des mots ou des idées, souvent avec des couleurs et des symboles. Elles prennent généralement un format de niveau hiérarchique ou d&#8217;un arbre, avec des idées de ramification.<br
/> Les cartes mentales sont des collections de mots structurés par le contexte mental de l&#8217;auteur avec des mnémoniques visuels, des couleurs, des icônes et des liens.<br
/> Ces cartes diffèrent des cartes conceptuelles, dans l&#8217;esprit, du fait qu’elles se concentrent sur une seule idée, alors que les cartes conceptuelles en communiquent plusieurs. Elles ont également une finalité différente : elles aident à la mémoire et à l&#8217;organisation.</p><p>Ci-dessous une Mind Map concernant les usages possibles du Mind Mapping :</p><div
style="text-align: center;"><a
href="http://blog.xebia.fr/wp-content/uploads/2011/05/UsagesMindmappingLarge.jpg"><img
class="aligncenter size-medium wp-image-7644" title="UsagesMindmappingLarge" src="http://blog.xebia.fr/wp-content/uploads/2011/05/UsagesMindmappingLarge-300x213.jpg" alt="UsagesMindmappingLarge" width="300" height="213" /></a></div><h3><a
name="MindMapMavenPlugin"></a>Mind Map Maven Plugin</h3><h4><a
name="LesAPIncessaires"></a>Les API nécessaires</h4><ul><li>maven-dependency-tree.jar: utilisé pour construire l’arbre des dépendances d’un module donné et en récupérer le « root node »</li><li>maven-plugin-api.jar: API de plugin Maven</li><li>velocity-tools.jar : utilisation du moteur de substitution Velocity (Velocity Templating Engine) pour la génération de l’artefact final à partir d’un template.</li></ul><p><strong>pom.xml</strong></p><pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;project xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot; xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&gt;
    &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
    &lt;packaging&gt;maven-plugin&lt;/packaging&gt;
    &lt;groupId&gt;fr.xebia.maven.plugins&lt;/groupId&gt;
    &lt;artifactId&gt;mindmap-maven-plugin&lt;/artifactId&gt;
    &lt;version&gt;1.0.0-SNAPSHOT&lt;/version&gt;
    &lt;name&gt;Maven dependency :: ${project.artifactId} ${project.packaging}&lt;/name&gt;
    &lt;description&gt;
        This plugin generates a MindMap from the project
        dependencies. The mindmap file (with the '.mm' extension)
        can be viewed with Freeplane (free tool).
        By default, the mindmap shows the full dependency tree.
        You can filter this tree at generation time
        by artifact's group id, by providing a parameter
         'groupIdsFilteringREGEXMatch'
        setted with a groupId name fragment (a startswith will be performed).
        Usage is (for exemple) :
        mvn fr.xebia.maven.plugins:mindmap-maven-plugin:1.0.0-SNAPSHOT:mindmap
        with filtering :
        mvn fr.xebia.maven.plugins:mindmap-maven-plugin:1.0.0-SNAPSHOT:mindmap -DgroupIdsFilteringREGEXMatch=fr.xebia
    &lt;/description&gt;
    &lt;dependencies&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.apache.maven.shared&lt;/groupId&gt;
            &lt;artifactId&gt;maven-dependency-tree&lt;/artifactId&gt;
            &lt;version&gt;1.2&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.apache.maven&lt;/groupId&gt;
            &lt;artifactId&gt;maven-plugin-api&lt;/artifactId&gt;
            &lt;version&gt;2.2.1&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.apache.velocity&lt;/groupId&gt;
            &lt;artifactId&gt;velocity-tools&lt;/artifactId&gt;
            &lt;version&gt;2.0&lt;/version&gt;
        &lt;/dependency&gt;
    &lt;/dependencies&gt;
&lt;/project&gt;
</pre><p><strong>MindmapMojo.java</strong></p><pre class="brush: java; title: ; notranslate">
package fr.xebia.maven.plugin.mindmap;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Properties;
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactCollector;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.shared.dependency.tree.DependencyNode;
import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.tools.generic.SortTool;
/**
 * Generate a mindmap from the pom dependencies.
 *
 * @goal mindmap
 *
 */
public class MindmapMojo extends AbstractMojo {
    /** @component */
    private org.apache.maven.artifact.factory.ArtifactFactory artifactFactory;
    /**
     * @component
     * @required
     * @readonly
     */
    private ArtifactMetadataSource artifactMetadataSource;
    /**
     * @component
     * @required
     * @readonly
     */
    private ArtifactCollector artifactCollector;
    /**
     * @component
     * @required
     * @readonly
     */
    private DependencyTreeBuilder treeBuilder;
    /** @parameter default-value=&quot;${localRepository}&quot; */
    private ArtifactRepository localRepository;
    /**
     * @parameter default-value=&quot;${project}&quot;
     */
    private MavenProject project;
    /**
     * @parameter expression=&quot;${groupIdsFilteringREGEXMatch}&quot;
     */
    private String groupIdsFilteringREGEXMatch = null;
    public void execute() throws MojoExecutionException {
        try {
            ArtifactFilter artifactFilter = new ScopeArtifactFilter(null);
            // Build project dependency tree
            DependencyNode rootNode = treeBuilder.buildDependencyTree(project,
                    localRepository, artifactFactory, artifactMetadataSource,
                    artifactFilter, artifactCollector);
            generateMindMapXML(project, rootNode);
        } catch (DependencyTreeBuilderException e) {
            throw new MojoExecutionException(&quot;Unable to build project dependency tree.&quot;, e);
        }
    }
    private void generateMindMapXML(MavenProject mavenProject, DependencyNode rootNode) throws MojoExecutionException {
        FileWriter fw = null;
        try {
            Properties p = new Properties();
            p.setProperty(&quot;resource.loader&quot;, &quot;class&quot;);
            p.setProperty(&quot;class.resource.loader.class&quot;,
            &quot;org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader&quot;);
            //  first, get and initialize an engine
            VelocityEngine ve = new VelocityEngine();
            ve.init(p);
            //  next, get the Template
            Template freePlaneTemplate = ve.getTemplate(&quot;MindMapTemplate.vm&quot;);
            // create a context and add data
            VelocityContext context = new VelocityContext();
            context.put(&quot;artifactId&quot;, mavenProject.getArtifactId());
            context.put(&quot;sorter&quot;, new SortTool());
            context.put(&quot;rootNode&quot;, rootNode);
            context.put(&quot;date&quot;, (new SimpleDateFormat(&quot;dd/MM/yy HH:mm&quot;)).format(Calendar.getInstance().getTime()));
            context.put(&quot;groupIdsFilteringREGEXMatch&quot;, (groupIdsFilteringREGEXMatch != null)?groupIdsFilteringREGEXMatch:&quot;&quot;);
            context.put(&quot;creationTS&quot;, Calendar.getInstance().getTimeInMillis());
            // now render the template
            fw = new FileWriter(&quot;./&quot;+mavenProject.getGroupId()+&quot;_&quot;+mavenProject.getArtifactId()+&quot;_&quot;+mavenProject.getVersion()+&quot;.mm&quot;);
            // write the mindmap xml to disc
            freePlaneTemplate.merge(context, fw);
        } catch (Exception e) {
            throw new MojoExecutionException(&quot;Unable to generate mind map.&quot;, e);
        } finally {
            if (fw != null) {
                try {
                    fw.close();
                } catch (IOException e) {
                    getLog().warn(&quot;Unable to properly close stream.&quot;, e);
                }
            }
        }
    }
}
</pre><p><strong>FreePlane Velocity Template: MindMapTemplate.vm</strong></p><pre class="brush: xml; title: ; notranslate">
#macro( exploreNodes $node )
    #set( $nodeCount = $nodeCount +1 )
    #set( $color = $nodeCount % 255 )
    #if ($node.artifact.groupId.startsWith($groupIdsFilteringREGEXMatch))
        &lt;node ID=&quot;ID_$nodeCount&quot; CREATED=&quot;$creationTS&quot; MODIFIED=&quot;$creationTS&quot;&gt;
            &lt;richcontent TYPE=&quot;NODE&quot;&gt;
            &lt;html&gt;
              &lt;head&gt;&lt;/head&gt;
              &lt;body&gt;
                &lt;p&gt;
                  ## Mettre en gris clair le groupId
                  &lt;font color=&quot;#cccccc&quot;&gt;$node.artifact.groupId&lt;/font&gt;
                &lt;/p&gt;
                &lt;p&gt;
                 ## Mettre en gras l'artifactId
                  &lt;b&gt;$node.artifact.artifactId&lt;/b&gt;
                &lt;/p&gt;
                &lt;p&gt;
                  ## Mettre en gris clair la version
                  &lt;small&gt;&lt;font color=&quot;#cccccc&quot;&gt;$node.artifact.version&lt;/font&gt;&lt;/small&gt;
                &lt;/p&gt;
              &lt;/body&gt;
            &lt;/html&gt;
            &lt;/richcontent&gt;
            #* Pour le noeud parent (root node) on rajoute un noeud supplémentaire à gauche du noeud parent
               et contenant le texte suivant:Generated : ${date}
               avec une icône calendar
            *#
            #if (!$rootNodeExplored)
                &lt;node TEXT=&quot;Generated : ${date}&quot; POSITION=&quot;left&quot; ID=&quot;ID_${nodeCount}000&quot; CREATED=&quot;$creationTS&quot; MODIFIED=&quot;$creationTS&quot;&gt;
                    &lt;icon BUILTIN=&quot;calendar&quot;/&gt;
                &lt;/node&gt;
                #* Pour le noeud parent (root node), quand le filtre sur le groupeId est utilisé
                   on rajoute un noeud supplémentaire à gauche du noeud parent
                   et contenant le texte suivant:Only groups starting with [${groupIdsFilteringREGEXMatch}] are shown
                   avec une icône essagebox_warning
                *#
                #if( $groupIdsFilteringREGEXMatch.length() &gt; 0)
                    &lt;node TEXT=&quot;Only groups starting with [${groupIdsFilteringREGEXMatch}] are shown&quot; POSITION=&quot;left&quot; ID=&quot;ID_${nodeCount}001&quot; CREATED=&quot;$creationTS&quot; MODIFIED=&quot;$creationTS&quot;&gt;
                        &lt;icon BUILTIN=&quot;messagebox_warning&quot;/&gt;
                    &lt;/node&gt;
                #end
            #end
            #if (!$rootNodeExplored)
                #set( $rootNodeExplored = true )
            #end
            ## Parcours des noeuds fils du noeud en cours et appel récursif de la méthode: exploreNodes
            #foreach( $dependencyNode in $sorter.sort($node.children,&quot;artifact.artifactId&quot;) )
                #exploreNodes($dependencyNode)
            #end
        &lt;/node&gt;
    #end
#end
#set( $nodeCount = 0 )
#set( $Integer = 0 )
#set( $rootNodeExplored = false )
&lt;map version=&quot;0.9.0&quot;&gt;
&lt;!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net --&gt;
#exploreNodes($rootNode)
&lt;/map&gt;
</pre><h3><a
name="Excutionduplugin"></a>Exécution du plugin</h3><h4><a
name="Sanslefiltre"></a>Sans le filtre:</h4><pre class="brush: bash; title: ; notranslate">
mvn fr.xebia.maven.plugins:mindmap-maven-plugin:1.0.0-SNAPSHOT:mindmap
</pre><h4><a
name="Aveclefiltre"></a>Avec le filtre:</h4><pre class="brush: bash; title: ; notranslate">
mvn fr.xebia.maven.plugins:mindmap-maven-plugin:1.0.0-SNAPSHOT:mindmap -DgroupIdsFilteringREGEXMatch=fr.xebia
</pre><h4><a
name="Attacherlegoalmindmapunephases"></a>Attacher le goal &laquo;&nbsp;mindmap&nbsp;&raquo; à une phase spécifique du build Lifecycle</h4><pre class="brush: xml; title: ; notranslate">
&lt;build&gt;
   &lt;plugins&gt;
      &lt;plugin&gt;
         &lt;groupId&gt;fr.xebia.maven.plugins&lt;/groupId&gt;
         &lt;artifactId&gt;mindmap-maven-plugin&lt;/artifactId&gt;
         &lt;version&gt;1.0.0-SNAPSHOT&lt;/version&gt;
         &lt;executions&gt;
            &lt;execution&gt;
               &lt;phase&gt;package&lt;/phase&gt;
               &lt;goals&gt;
                  &lt;goal&gt;mindmap&lt;/goal&gt;
               &lt;/goals&gt;
            &lt;/execution&gt;
         &lt;/executions&gt;
      &lt;/plugin&gt;
   &lt;/plugins&gt;
&lt;/build&gt;
</pre><p>Il est possible de définir la phase par défaut du Mojo lors de sa déclaration. Le Mojo s&#8217;exécutera donc lors de cette phase à condition que l&#8217;on n&#8217;aie précisé aucune phase dans &lt;execution&gt;. Dans le cas contraire on parle de &laquo;&nbsp;rebinding&nbsp;&raquo; du Mojo avec une nouvelle phase du build Lifecycle.</p><pre class="brush: java; title: ; notranslate">
/**
 * Generate a mindmap from the pom dependencies.
 *
 * @goal mindmap
 *
 * @phase package
 *
 */
public class MindmapMojo extends AbstractMojo {
}
</pre><p>Vous pourrez vous référer à <a
title="la documentation de lAPI Mojo" href="http://maven.apache.org/developers/mojo-api-specification.html">la documentation de l&#8217;API Mojo</a> pour en savoir plus sur l&#8217;ensemble des annotations possibles.</p><h4><a
name="Raccourcissementdelalignedecom"></a>Raccourcissement de la ligne de commande</h4><p>Vous avez sans doute remarqué que le préfixe d’exécution du plugin n’est pas très convivial aux utilisateurs ; le fait de taper</p><pre class="brush: bash; title: ; notranslate">
mvn ${groupId}:${artefactId}:${version}:${goal}
</pre><p>en l’occurrence:</p><pre class="brush: bash; title: ; notranslate">
mvn fr.xebia.maven.plugins:mindmap-maven-plugin:1.0.0-SNAPSHOT:mindmap
</pre><p>semble être parfois gênant.</p><p>Afin de donner aux utilisateurs un préfixe idéal ou encore un « shortened prefix » pour faire référence au plugin, il faut rajouter le groupId dans le fichier de configuration maven (settings.xml) comme suit :</p><pre class="brush: xml; title: ; notranslate">
&lt;pluginGroups&gt;
   &lt;pluginGroup&gt;fr.xebia.maven.plugins&lt;/pluginGroup&gt;
&lt;/pluginGroups&gt;
</pre><p>Désormais, vous pouvez exécuter le plugin en tapant:</p><pre class="brush: bash; title: ; notranslate">
mvn mindmap:mindmap
</pre><p>Pour plus d’informations sur la résolution des préfixes des plugins maven je vous invite à consulter <a
title="la documentation officielle" href="http://maven.apache.org/guides/introduction/introduction-to-plugin-prefix-mapping.html">la documentation officielle</a>.</p><h3><a
name="ExploitationdesFichiersmm"></a>Exploitation des Fichiers .mm</h3><p>On va appliquer le plugin sur lui-même, ce qui nous donnera l&#8217;aperçu suivant avec FreePlane :</p><div><img
src="http://blog.xebia.fr/wp-content/uploads/2011/05/fr.xebia.maven.plugins_mindmap-maven-plugin_1.0.0-SNAPSHOT.jpg" border="0" alt="" /></div><p>Par la suite, vous avez la possibilité de naviguer dans les différents noeuds (déplier / plier), tout en ayant la souplesse de les éditer.<br
/> Par exemple, si vous dépliez le module velocity-tools, vous aurez l&#8217;ensemble de ses dépendances directes :</p><div><img
src="http://blog.xebia.fr/wp-content/uploads/2011/05/fr.xebia.maven.plugins_mindmap-maven-plugin_1.0.0-SNAPSHOT_2.jpg" border="0" alt="" /></div><p>L&#8217;application du filtre groupIdsFilteringREGEXMatch=fr.xebia ne donnera que le module « mindmap-maven-plugin » lui même (comme il ne dispose d&#8217;aucune dépendance à un groupId commençant par fr.xebia):</p><div><img
src="http://blog.xebia.fr/wp-content/uploads/2011/05/fr.xebia.maven.plugins_mindmap-maven-plugin_1.0.0-SNAPSHOT_Filtered.jpg" border="0" alt="" /></div><h3><a
name="Allerplusloin"></a>Aller plus loin</h3><p>Une fois que vous avez compris le mécanisme de fonctionnement du templating et avec un minimum de connaissances du langage VTL (Velocity Template Language), vous pouvez faire ce que vous voulez ; on pourrait imaginer par exemple de colorer les dépendances cycliques en insérant des flèches rouges liant les modules concernés (ajout des balises &lt;arrowlink COLOR=&nbsp;&raquo;#ff3300&#8243;&gt; attendu par FreePlane), ou encore de développer des filtres plus avancés en fonction de vos besoins ; je vois bien un filtre sur le scope de la dépendance (compile, runtime, test, &#8230;).</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/05/le-mind-mapping-applique-aux-dependances-des-projets-mavenises/feed/</wfw:commentRss> <slash:comments>8</slash:comments> </item> <item><title>Automatiser les tests Selenium avec Maven</title><link>http://blog.xebia.fr/2011/02/18/automatiser-les-tests-selenium-avec-maven/</link> <comments>http://blog.xebia.fr/2011/02/18/automatiser-les-tests-selenium-avec-maven/#comments</comments> <pubDate>Fri, 18 Feb 2011 09:33:36 +0000</pubDate> <dc:creator>Romain Schlick</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Tests]]></category> <category><![CDATA[ant]]></category> <category><![CDATA[Automatisation]]></category> <category><![CDATA[dbunit]]></category> <category><![CDATA[failsafe]]></category> <category><![CDATA[HSQLDB]]></category> <category><![CDATA[intégration continue]]></category> <category><![CDATA[Jetty]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Selenium]]></category> <category><![CDATA[Selenium IDE]]></category> <category><![CDATA[Selenium RC]]></category> <category><![CDATA[SQL]]></category> <category><![CDATA[surefire]]></category> <category><![CDATA[Tests d'intégration]]></category> <category><![CDATA[Tests fonctionnels]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7049</guid> <description><![CDATA[Selenium regroupe une suite d&#8217;outils permettant de tester des applications web. Tout comme les tests unitaires, Selenium permet notamment de vérifier la non-régression d&#8217;une application et est un gage de qualité supplémentaire. Bien que la création des tests Selenium soit relativement simple, automatiser leur exécution sur un serveur d&#8217;intégration continue reste complexe à mettre en [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2011/02/selenium.png" border="0" alt="selenium" style="margin: 1em 1em 1em 1em; float: right;" /></p><p><a
href="http://seleniumhq.org/" title="Selenium" >Selenium</a> regroupe une suite d&#8217;outils permettant de tester des applications web. Tout comme les tests unitaires, Selenium permet notamment de vérifier la non-régression d&#8217;une application et est un gage de qualité supplémentaire. Bien que la création des tests Selenium soit relativement simple, automatiser leur exécution sur un serveur d&#8217;intégration continue reste complexe à mettre en œuvre. Je vous propose une solution avec l&#8217;outil de build <a
href="http://maven.apache.org/" title="Maven" >Maven</a>. Disposant de nombreux plugins, comme SQL, Failsafe, Jetty et Selenium, Maven permet la mise en place d&#8217;une automatisation satisfaisante. Cette solution peut servir aussi aux tests d&#8217;intégration.</p><h3><a
name="Seleniumunpuissantoutilpourcre"></a>Selenium, un puissant outil pour créer des tests fonctionnels</h3><p>Les tests Selenium reproduisent toutes sortes d&#8217;interactions qu&#8217;un utilisateur peut effectuer sur un navigateur web. Un test Selenium est constitué d&#8217;un script pouvant être écrit dans plusieurs langages (Java, Html, C#, Groovy, Php, etc.). Ce script est ensuite interprété par le serveur <a
href="http://seleniumhq.org/projects/remote-control/" title="Selenium RC" >Selenium RC</a>, qui s&#8217;occupe d&#8217;envoyer les bonnes commandes au navigateur. Les avantages de Selenium sont d&#8217;être compatible avec de nombreux navigateurs (Internet Explorer, Firefox, Chrome, etc.) et d&#8217;offrir un outil de création de test, appelé <a
href="http://seleniumhq.org/projects/ide/" title="Selenium IDE" >Selenium IDE</a>. Ce dernier est disponible sous forme d&#8217;un plugin Firefox. Les scripts Selenium sont relativement simples à coder directement, puisqu&#8217;il s&#8217;agit à chaque fois d&#8217;indiquer le type d&#8217;interaction (clic, saisie, etc.), puis de sélectionner l&#8217;élément en jeu (lien, tableau, div, input, etc.), et enfin d&#8217;indiquer une éventuelle valeur. Cependant, on aurait souhaité la disponibilité de Selenium IDE sur d&#8217;autres navigateurs.</p><h3><a
name="VersuneautomatisationdestestsS"></a>Vers une automatisation des tests Selenium avec Maven</h3><p>L&#8217;exécution automatique des tests unitaires sur un serveur d&#8217;intégration continue est une pratique très répandue. En utilisant une base de données en mémoire, comme <a
href="http://hsqldb.org/" title="HSQLDB" >HSQLDB</a>, les tests unitaires peuvent être exécutés facilement quel que soit l&#8217;environnement. De la même manière, il est intéressant de pouvoir lancer automatiquement ces tests fonctionnels sur un serveur d&#8217;intégration. Cependant, la mise en place est plus complexe: à chaque exécution, il faut au préalable s&#8217;assurer que la base de données soit dans un état cohérent (en terme de jeu de données), mais aussi que les serveurs web et Selenium RC soient démarrés.</p><p>Voici les étapes que nous allons automatiser à l&#8217;aide de l&#8217;outil Maven :</p><ol><li>Initialiser la base de données avec un jeu de données : Plugin maven <a
href="http://mojo.codehaus.org/sql-maven-plugin/" title="SQL" >SQL</a>.</li><li>Construire l&#8217;application web et la déployer sur un serveur web Jetty : Plugin maven <a
href="http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin" title="Jetty" >Jetty</a>.</li><li>Démarrer le serveur Selenium RC : Plugin maven <a
href="http://mojo.codehaus.org/selenium-maven-plugin/" title="Selenium" >Selenium</a></li><li>Exécuter les tests Selenium : Plugin maven <a
href="http://maven.apache.org/plugins/maven-failsafe-plugin/" title="Failsafe" >Failsafe</a>.</li></ol><p>Comme vous pouvez le constater, cette solution repose sur l&#8217;outil de build Maven et le serveur web <a
href="http://www.mortbay.org/" title="Jetty" >Jetty</a>. Dans un précédent <a
href="http://blog.xebia.fr/2009/09/02/automatiser-ses-tests-fonctionnels-avec-ant/" title="article" >article</a>, j&#8217;avais proposé une autre solution basée sur l&#8217;outil <a
href="http://ant.apache.org/" title="Ant" >Ant</a>. Avant d&#8217;aller plus loin, il est important de connaître le cycle de vie du build de Maven. Voici l&#8217;ordre d&#8217;exécution des principales phases du build :</p><ul><li>validate</li><li>compile</li><li>package</li><li><strong>test</strong></li><li><strong>pre-integration-test</strong></li><li><strong>integration-test</strong></li><li><strong>post-integration-test</strong></li><li><strong>verify</strong></li><li>install</li><li>deploy</li></ul><p>Lorsqu&#8217;on lance une phase, toutes les phases qui la précèdent sont exécutées au préalable. La phase <em>test</em> exécute les tests unitaires. Il existe aussi une phase <em>integration-test</em> qui va nous servir à exécuter les tests Selenium. Cette phase est précédée de la phase <em>pre-integration-test</em> et suivie de la phase <em>post-integration-test</em> qui vont respectivement nous aider à préparer puis nettoyer l&#8217;environnement d&#8217;exécution : démarrage et arrêt des serveurs Web et Selenium RC typiquement. Pour lancer les tests Selenium, il est nécessaire de lancer la commande <code>mvn verify</code> et non <code>mvn integration-test</code>, sinon la phase <em>post-integration-test</em> ne sera pas exécutée.</p><p>Je vais maintenant aborder l&#8217;intégration de chacune des briques (Selenium, base de données, et serveur web) dans Maven.</p><h3><a
name="IntgrationdeSeleniumdansMaven"></a>Intégration de Selenium dans Maven</h3><p>L&#8217;intégration de Selenium dans Maven se décompose en deux étapes :</p><ul><li>Déclarer l&#8217;exécution des tests Selenium via le plugin <a
href="http://maven.apache.org/plugins/maven-failsafe-plugin/" title="Failsafe" >Failsafe</a>.</li><li>Démarrer le serveur Selenium RC en <em>pre-integration-test</em> et l&#8217;arrêter en <em>post-integration-test</em>.</li></ul><h4><a
name="SolutionExcuterlestestsaveclep"></a>Solution 1: Exécuter les tests avec le plugin Surefire</h4><p>Pour intégrer l&#8217;exécution des tests Selenium, il existe une première solution basée sur le plugin <a
href="http://maven.apache.org/plugins/maven-surefire-plugin/" title="Surefire" >Surefire</a>. La fonction première de ce plugin est d&#8217;exécuter les tests unitaires lors de la phase <em>test</em> et de générer un rapport. L&#8217;idée ici est de considérer les tests Selenium, comme des tests unitaires JUnit. Pour inclure les tests Selenium, il faut définir un plan d&#8217;exécution <em>surefire-integration-test</em> associé à la phase <em>integration-test</em> en incluant dedans les classes de test Selenium. Par ailleurs, il faut exclure les tests Selenium de la phase <em>test</em> (dans <em>&lt;configuration&gt;</em>). On obtient alors la déclaration du plugin suivant dans le pom :</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
   &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
   &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
   &lt;configuration&gt;
      &lt;includes&gt;
         &lt;!-- Inclure les tests unitaires ici ... --&gt;
      &lt;/includes&gt;
      &lt;excludes&gt;
         &lt;exclude&gt;com/xebia/selenium/**/*Test.java&lt;/exclude&gt;  &lt;!-- Exclure les tests Selenium ici ... --&gt;
      &lt;/excludes&gt;
   &lt;/configuration&gt;
   &lt;executions&gt;
      &lt;execution&gt;
         &lt;id&gt;surefire-integration-test&lt;/id&gt;
         &lt;phase&gt;integration-test&lt;/phase&gt;
         &lt;goals&gt;
            &lt;goal&gt;test&lt;/goal&gt; &lt;!-- La phase integration-test va lancer les tests... --&gt;
         &lt;/goals&gt;
         &lt;configuration&gt;
            &lt;skip&gt;false&lt;/skip&gt;
            &lt;includes&gt;
               &lt;include&gt;com/xebia/selenium/**/*Test.java&lt;/include&gt; &lt;!-- ... Inclure les tests Selenium ici --&gt;
            &lt;/includes&gt;
         &lt;/configuration&gt;
      &lt;/execution&gt;
   &lt;/executions&gt;
&lt;/plugin&gt;
</pre><p>La solution <em>Surefire</em> n&#8217;est cependant pas optimale. En effet, Surefire a été conçu à l&#8217;origine uniquement pour les tests unitaires. Ce qui explique que si un test échoue, le build maven s&#8217;arrêtera à la phase <em>integration-test</em>, sans aller jusqu&#8217;au <em>post-integration-test</em>. Du coup, l&#8217;environnement d&#8217;exécution ne sera pas correctement nettoyé.</p><h4><a
name="SolutionrecommandeExcuterleste"></a>Solution 2 recommandée: Exécuter les tests avec le plugin FailSafe</h4><p>Pour corriger les limitations de Surefire, un nouveau plugin <em>FailSafe</em> dédié aux tests d&#8217;intégration a été créé. Ce plugin est un <a
href="http://fr.wikipedia.org/wiki/Fork_%28d%C3%A9veloppement_logiciel%29" title="fork" >fork</a> de Surefire, qui ne bloque pas le cycle de vie du build en cas d&#8217;échec. En lançant les tests Selenium avec <code>mvn verify</code> et non <code>mvn integration-test</code>, on s&#8217;assure que la phase <em>post-integration-test</em> sera bien exécutée en cas d&#8217;erreurs. Le rôle de la phase <em>verify</em> est donc clairement de vérifier l&#8217;état d&#8217;exécution des tests d&#8217;intégration. Voici comment déclarer le plugin <em>FailSafe</em> dans le pom :</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
   &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
   &lt;artifactId&gt;maven-failsafe-plugin&lt;/artifactId&gt;
   &lt;version&gt;2.7.2&lt;/version&gt;
   &lt;configuration&gt;
      &lt;reportsDirectory&gt;${basedir}/target/surefire-reports&lt;/reportsDirectory&gt;
      &lt;includes&gt;
         &lt;include&gt;com/xebia/selenium/**/*.java&lt;/include&gt; &lt;!-- ... inclure les tests Selenium --&gt;
      &lt;/includes&gt;
      &lt;systemPropertyVariables&gt;
         &lt;jetty.port&gt;${jetty.port}&lt;/jetty.port&gt;
         &lt;jetty.context&gt;${artifactId}&lt;/jetty.context&gt;
      &lt;/systemPropertyVariables&gt;
   &lt;/configuration&gt;
   &lt;executions&gt;
      &lt;execution&gt;
         &lt;id&gt;integration-test&lt;/id&gt;
         &lt;goals&gt;
            &lt;goal&gt;integration-test&lt;/goal&gt;
         &lt;/goals&gt;
      &lt;/execution&gt;
      &lt;execution&gt;
         &lt;id&gt;verify&lt;/id&gt;
         &lt;goals&gt;
            &lt;goal&gt;verify&lt;/goal&gt;
         &lt;/goals&gt;
      &lt;/execution&gt;
   &lt;/executions&gt;
&lt;/plugin&gt;
</pre><p>Afin de rendre paramétrable certaines valeurs de contexte dans vos classes de tests Selenium, comme le port et le contexte de l&#8217;application, il est possible d&#8217;indiquer des propriétés systèmes dans le plugin <em>FailSafe</em>. Pour cela, il suffit d&#8217;ajouter l&#8217;élément <em>&lt;systemPropertyVariables&gt;</em> dans <em>&lt;configuration&gt;</em> avec les différentes propriétés.<br
/> On remarque aussi la propriété <em>&lt;reportsDirectory&gt;</em> qui permet de générer les rapports de tests dans le même dossier que Surefire. Le serveur d&#8217;intégration inclura ainsi les résultats des tests Selenium avec ceux des tests unitaires. Une autre solution est de définir l&#8217;emplacement des rapports directement sur le serveur d&#8217;intégration continue. Par défaut, FailSafe place les rapports dans <em>basedir/target/failsafe-reports</em>.</p><h4><a
name="AjoutdupluginSeleniumPourdmarr"></a>Ajout du plugin Selenium (Pour démarrer et arrêter le serveur Selenium RC)</h4><p>Afin de lancer automatiquement le serveur Selenium RC pendant l&#8217;exécution de la phase <strong>integration-test</strong>, il faut ajouter <a
href="http://mojo.codehaus.org/selenium-maven-plugin/" title="le plugin" >le plugin</a> suivant dans le pom :</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
   &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
   &lt;artifactId&gt;selenium-maven-plugin&lt;/artifactId&gt;
   &lt;version&gt;1.0.1&lt;/version&gt;
   &lt;executions&gt;
      &lt;execution&gt;
         &lt;id&gt;start&lt;/id&gt;
         &lt;phase&gt;pre-integration-test&lt;/phase&gt;
         &lt;goals&gt;
            &lt;goal&gt;start-server&lt;/goal&gt;
         &lt;/goals&gt;
         &lt;configuration&gt;
            &lt;background&gt;true&lt;/background&gt;
         &lt;/configuration&gt;
      &lt;/execution&gt;
      &lt;execution&gt;
         &lt;id&gt;stop&lt;/id&gt;
         &lt;phase&gt;post-integration-test&lt;/phase&gt;
         &lt;goals&gt;
            &lt;goal&gt;stop-server&lt;/goal&gt;
         &lt;/goals&gt;
      &lt;/execution&gt;
   &lt;/executions&gt;
&lt;/plugin&gt;
</pre><p>L&#8217;option <em>&lt;background&gt;true&lt;/background&gt;</em> permet de ne pas bloquer le processus Maven pendant que le serveur Selenium RC est démarré.</p><h3><a
name="Configurationduserveurwebavecl"></a>Configuration du serveur web avec le plugin Jetty</h3><p>Préalablement à l&#8217;exécution des tests Selenium, il est nécessaire de démarrer l&#8217;application sur un serveur web durant la phase <em>pre-integration-test</em>. Le serveur sera arrêté durant la phase <em>post-integration-test</em>. Voici la manière de déclarer <a
href="http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin" title="le plugin Jetty" >le plugin Jetty</a> dans le pom :</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
   &lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;
   &lt;artifactId&gt;maven-jetty-plugin&lt;/artifactId&gt;
   &lt;version&gt;6.1.10&lt;/version&gt;
   &lt;configuration&gt;
      &lt;scanIntervalSeconds&gt;10&lt;/scanIntervalSeconds&gt;
      &lt;stopKey&gt;foo&lt;/stopKey&gt;
      &lt;stopPort&gt;9999&lt;/stopPort&gt;
      &lt;webAppSourceDirectory&gt;${webapp.dir}&lt;/webAppSourceDirectory&gt;
      &lt;connectors&gt;
         &lt;connector implementation=&quot;org.mortbay.jetty.nio.SelectChannelConnector&quot;&gt;
            &lt;port&gt;${jetty.port}&lt;/port&gt;
            &lt;maxIdleTime&gt;60000&lt;/maxIdleTime&gt;
         &lt;/connector&gt;
      &lt;/connectors&gt;
   &lt;/configuration&gt;
   &lt;executions&gt;
      &lt;execution&gt;
         &lt;id&gt;start-jetty&lt;/id&gt;
         &lt;phase&gt;pre-integration-test&lt;/phase&gt;
         &lt;goals&gt;
            &lt;goal&gt;run&lt;/goal&gt;
         &lt;/goals&gt;
         &lt;configuration&gt;
            &lt;scanIntervalSeconds&gt;0&lt;/scanIntervalSeconds&gt;
            &lt;daemon&gt;true&lt;/daemon&gt;
         &lt;/configuration&gt;
      &lt;/execution&gt;
      &lt;execution&gt;
         &lt;id&gt;stop-jetty&lt;/id&gt;
         &lt;phase&gt;post-integration-test&lt;/phase&gt;
         &lt;goals&gt;
            &lt;goal&gt;stop&lt;/goal&gt;
         &lt;/goals&gt;
      &lt;/execution&gt;
   &lt;/executions&gt;
&lt;/plugin&gt;
</pre><p>L&#8217;attribut <em>&lt;webAppSourceDirectory&gt;</em> permet d&#8217;indiquer le chemin de l&#8217;application web. On peut aussi remarquer l&#8217;utilisation d&#8217;une propriété <em>jetty.port</em> pour mettre en paramètre le port d&#8217;écoute de Jetty. Celle-ci se déclare de la manière suivante dans le pom.xml :</p><pre class="brush: xml; title: ; notranslate">
&lt;properties&gt;
   &lt;jetty.port&gt;9090&lt;/jetty.port&gt;
   ......
&lt;/properties&gt;
</pre><h3><a
name="Manipulationdelabasededonnes"></a>Manipulation de la base de données</h3><p>Il existe de nombreuses solutions pour préparer la base de données aux tests d&#8217;intégration. Même s&#8217;il est possible d&#8217;utiliser une base de données en mémoire, comme <a
href="http://hsqldb.org/" title="HSQLDB" >HSQLDB</a>, je recommanderais plutôt d&#8217;utiliser le même type de base qu&#8217;en production, parce que nous exécutons des tests end-to-end. Pour insérer les jeux de données, il est possible d&#8217;utiliser deux plugins Maven : SQL ou DbUnit. J&#8217;ai privilégié l&#8217;utilisation du <a
href="http://mojo.codehaus.org/sql-maven-plugin/" title="plugin SQL" >plugin SQL</a>, car mes scripts étaient déjà écrits en SQL. En effet, <a
href="http://www.dbunit.org/" title="DbUnit" >DbUnit</a> utilise son propre format en XML.<br
/> Le plugin SQL permet aussi d&#8217;exécuter des procédures stockées et des fonctions en changeant le type de délimiteur, qui est par défaut &#8216;;&#8217;. Dans <em>&lt;configuration&gt;</em>, on définit le driver, ainsi que les paramètres de connexion. J&#8217;ai ajouté une dépendance au driver d&#8217;Oracle dans mon exemple. Le paramètre <em>&lt;autocommit&gt;</em> permet d&#8217;indiquer si l&#8217;on veut que les scripts soient exécutés de manière transactionnelle ou non.<br
/> Ensuite, il suffit de déclarer un plan d&#8217;exécution <em>&#8216;insert_data&#8217;</em> pour la phase <em>pre-integration-test</em> et un autre <em>&#8216;drop_data&#8217;</em> pour la phase <em>post-integration-test</em> en indiquant les scripts SQL.</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
   &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
   &lt;artifactId&gt;sql-maven-plugin&lt;/artifactId&gt;
   &lt;version&gt;1.4&lt;/version&gt;
   &lt;dependencies&gt;
      &lt;dependency&gt;
         &lt;groupId&gt;com.oracle&lt;/groupId&gt;
         &lt;artifactId&gt;ojdbc14&lt;/artifactId&gt;
         &lt;version&gt;10.2.0.4&lt;/version&gt;
      &lt;/dependency&gt;
   &lt;/dependencies&gt;
   &lt;configuration&gt;
      &lt;driver&gt;oracle.jdbc.driver.OracleDriver&lt;/driver&gt;
      &lt;url&gt;jdbc:oracle:thin:@localhost:1521:capitaineHadoc&lt;/url&gt;
      &lt;username&gt;tintin&lt;/username&gt;
      &lt;password&gt;milou&lt;/password&gt;
      &lt;delimiter&gt;;&lt;/delimiter&gt;
      &lt;delimiterType&gt;normal&lt;/delimiterType&gt;
      &lt;keepFormat&gt;true&lt;/keepFormat&gt;
      &lt;skip&gt;${maven.test.skip}&lt;/skip&gt;
      &lt;autocommit&gt;true&lt;/autocommit&gt;
   &lt;/configuration&gt;
   &lt;executions&gt;
      &lt;execution&gt;
         &lt;id&gt;insert-data&lt;/id&gt;
         &lt;phase&gt;pre-integration-test&lt;/phase&gt;
         &lt;goals&gt;
            &lt;goal&gt;execute&lt;/goal&gt;
         &lt;/goals&gt;
         &lt;configuration&gt;
            &lt;orderFile&gt;ascending&lt;/orderFile&gt;
            &lt;fileset&gt;
               &lt;basedir&gt;${basedir}/path/to/sql/files&lt;/basedir&gt;
               &lt;includes&gt;
                  &lt;include&gt;insert-data.sql&lt;/include&gt;
               &lt;/includes&gt;
            &lt;/fileset&gt;
         &lt;/configuration&gt;
      &lt;/execution&gt;
      &lt;execution&gt;
         &lt;id&gt;drop-data&lt;/id&gt;
         &lt;phase&gt;post-integration-test&lt;/phase&gt;
         &lt;goals&gt;
            &lt;goal&gt;execute&lt;/goal&gt;
         &lt;/goals&gt;
         &lt;configuration&gt;
            &lt;orderFile&gt;ascending&lt;/orderFile&gt;
            &lt;fileset&gt;
               &lt;basedir&gt;${basedir}/path/to/sql/files&lt;/basedir&gt;
               &lt;includes&gt;
                  &lt;include&gt;drop-data.sql&lt;/include&gt;
               &lt;/includes&gt;
            &lt;/fileset&gt;
         &lt;/configuration&gt;
      &lt;/execution&gt;
   &lt;/executions&gt;
&lt;/plugin&gt;
</pre><h3><a
name="ExecutiondestestsSelenium"></a>Execution des tests Selenium</h3><h4><a
name="DepuisMaven"></a>Depuis Maven</h4><p>Après avoir déclaré tous les plugins dans le <em>pom.xml</em>, il suffit de lancer la commande suivante :</p><pre class="brush: bash; title: ; notranslate">
mvn verify
</pre><p>Voici alors une synthèse des logs que l&#8217;ont obtient :</p><pre class="brush: bash; title: ; notranslate">
[INFO] [selenium:start-server {execution: start}]
[INFO] 1
[INFO] [jetty:run {execution: start-jetty}]
[INFO] [failsafe:integration-test {execution: integration-test}]
[INFO] [selenium:stop-server {execution: stop}]
[INFO] 1
[INFO] [jetty:stop {execution: stop-jetty}]
[INFO] [failsafe:verify {execution: verify}]
[INFO] Failsafe report directory: D:Javasoftworkspacepid-trunktargetsurefire-reports
</pre><h4><a
name="DepuisvotreIDE"></a>Depuis votre IDE</h4><p>Lorsqu&#8217;on développe de nouveaux tests Selenium ou tout simplement pour débugger, il est nécessaire de les exécuter sur son IDE. Pour parvenir à cela, il suffit de lancer les commandes suivantes (dans des terminaux différents) :</p><ol><li>Préparer la base de données si nécessaire :<pre class="brush: bash; title: ; notranslate">mvn sql:execute</pre></li><li>Démarrer le serveur <em>Selenium RC </em>:<pre class="brush: bash; title: ; notranslate">mvn selenium:start-server</pre></li><li>Démarrer le serveur web <em>Jetty </em>:<pre class="brush: bash; title: ; notranslate">mvn jetty:run</pre></li><li>Exécuter le test depuis votre IDE.</li></ol><h3><a
name="Conclusion"></a>Conclusion</h3><p>Avec ses nombreux plugins, Maven est un puissant outil pour automatiser l&#8217;exécution des tests Selenium. Les solutions proposées dans cet article peuvent servir de manière générale aux tests d&#8217;intégration. Les prochaines versions de Maven ne prévoient pas une séparation des sources entre les tests unitaires et les tests d&#8217;integration (<em>src/main/test</em> vs <em>src/main/it</em>). En effet, le plugin <em>FailSafe</em> permet de gérer les tests d&#8217;intégration de manière dédiée.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/02/18/automatiser-les-tests-selenium-avec-maven/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Configurer automatiquement Eclipse avec Maven</title><link>http://blog.xebia.fr/2011/01/19/configurer-automatiquement-eclipse-avec-maven/</link> <comments>http://blog.xebia.fr/2011/01/19/configurer-automatiquement-eclipse-avec-maven/#comments</comments> <pubDate>Wed, 19 Jan 2011 13:58:22 +0000</pubDate> <dc:creator>Nathaniel Richand</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[java]]></category> <category><![CDATA[M2Eclipse]]></category> <category><![CDATA[Maven]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6684</guid> <description><![CDATA[En ce beau matin d&#8217;hiver, me voilà bien décidé à effectuer un peu de ménage sur notre projet. Ma cible d&#8217;aujourd&#8217;hui : la chasse aux warnings. Grosso modo, j&#8217;observe qu&#8217;il y a 3 types de warning : imports inutilisés (60%) unchecked casts (30%) variables ou méthodes private non utilisées (10%) Je prends mon bâton de [...]]]></description> <content:encoded><![CDATA[<p>En ce beau matin d&#8217;hiver, me voilà bien décidé à effectuer un peu de ménage sur notre projet. Ma cible d&#8217;aujourd&#8217;hui : la chasse aux warnings.</p><p>Grosso modo, j&#8217;observe qu&#8217;il y a 3 types de warning :</p><ul><li>imports inutilisés (60%)</li><li>unchecked casts (30%)</li><li>variables ou méthodes <em>private</em> non utilisées (10%)</li></ul><p>Je prends mon bâton de pèlerin et je nettoie. Cependant, je me rends bien compte que ces warnings sont pour la majorité des erreurs d&#8217;inattention qui pourraient être facilement évitées.</p><p>A quoi bon nettoyer, si c&#8217;est pour se retrouver dans la même situation dans trois mois ? Donc, en plus de ma maintenance corrective, je pars également à la recherche d&#8217;une action préventive.</p><p>Première idée évidente, configurer Eclipse pour que celui-ci effectue ce genre de nettoyage lors d&#8217;une sauvegarde d&#8217;un fichier. Facile, il suffit de paramétrer ceci dans Properties -> Java Editor -> Save Actions (Plus de détails <a
href="http://mestreota.blogspot.com/2007/11/save-action-on-eclipse.html" title="ici" >ici</a>).</p><p>Cependant, à quoi bon le faire uniquement sur mon Eclipse ? Quel intérêt, si les autres membres de l&#8217;équipe ne bénéficient pas eux aussi de la même configuration ? Comment faire en sorte que ma configuration soit facilement partagée avec les autres ?</p><p>Le projet étant un projet maven, le <a
href="http://maven.apache.org/plugins/maven-eclipse-plugin/" title="maveneclipseplugin" >maven-eclipse-plugin</a> semble offrir la solution.</p><h3><a
name="Construiresaconfigurationcible"></a>Construire sa configuration cible idéale</h3><p>Le plus facile est de le faire via Eclipse. On choisit un projet java et on se définit la configuration voulue dans les properties. Je ne vais pas vous conseiller particulièrement, ceci étant souvent une affaire de gout. Allez jeter un coup d&#8217;œil notamment dans :</p><ul><li>Java Code Style : Clean Up, Code Templates, Formatter</li></ul><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2011/01/clean-up-ok.jpg"><img
src="http://blog.xebia.fr/wp-content/uploads/2011/01/clean-up-ok-300x231.jpg" alt="clean-up-ok" title="clean-up-ok" width="300" height="231" class="alignnone size-medium wp-image-6687" /></a></div><ul><li>Java Compiler -> Errors/Warning : pour redéfinir le niveau des alertes. Il peut être intéressant de bloquer directement depuis l&#8217;IDE certaines sources d&#8217;erreurs, comme par exemple : x == x ou x =x&#8230;</li></ul><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2011/01/errors-warning-ok.jpg"><img
src="http://blog.xebia.fr/wp-content/uploads/2011/01/errors-warning-ok-300x243.jpg" alt="errors-warning-ok" title="errors-warning-ok" width="300" height="243" class="alignnone size-medium wp-image-6688" /></a></div><ul><li>Java Editor -> Save Action (vu précédemment) :</li></ul><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2011/01/save-action-ok.jpg"><img
src="http://blog.xebia.fr/wp-content/uploads/2011/01/save-action-ok-300x243.jpg" alt="save-action-ok" title="save-action-ok" width="300" height="243" class="alignnone size-medium wp-image-6689" /></a></div><h3><a
name="EnregistersaconfigurationdansM"></a>Enregister sa configuration dans Maven</h3><p>Une fois le paramétrage effectué, il suffit d&#8217;aller récupérer le résultat dans le répertoire <em>.settings</em> du projet. Vous trouverez dans ce répertoire les fichiers contenant la configuration réalisée précédemment (<em>org.eclipse.jdt.ui.prefs</em>, <em>org.eclipse.jdt.core.prefs</em>, etc.). Ce sont des fichiers de propriétés contenant ce genre d&#8217;information :</p><pre class="brush: java; title: ; notranslate">
#Wed Dec 15 14:36:54 CET 2010
cleanup.add_default_serial_version_id=true
cleanup.add_generated_serial_version_id=false
cleanup.add_missing_annotations=true
cleanup.add_missing_deprecated_annotations=true
cleanup.add_missing_methods=false
cleanup.add_missing_nls_tags=false
cleanup.add_missing_override_annotations=true
cleanup.add_missing_override_annotations_interface_methods=true
...
</pre><p>Il suffit maintenant d&#8217;extraire tout le contenu nous intéressant et de le mettre dans la configuration du maven-eclipse-plugin. Par exemple :</p><pre class="brush: xml; title: ; notranslate">
&lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;    xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  &lt;groupId&gt;fr.xebia.build.tools&lt;/groupId&gt;
  &lt;artifactId&gt;testConfMaven&lt;/artifactId&gt;
  &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;
  &lt;build&gt;
    &lt;plugins&gt;
      &lt;plugin&gt;
        &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
        &lt;artifactId&gt;maven-eclipse-plugin&lt;/artifactId&gt;
        &lt;version&gt;2.7&lt;/version&gt;
        &lt;configuration&gt;
          &lt;downloadSources&gt;true&lt;/downloadSources&gt;
          &lt;additionalConfig&gt;
            &lt;file&gt;
              &lt;name&gt;.settings/org.eclipse.jdt.ui.prefs&lt;/name&gt;
              &lt;content&gt;&lt;![CDATA[
 eclipse.preferences.version=1
 editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
 sp_cleanup.add_default_serial_version_id=true
 sp_cleanup.add_missing_annotations=true
 sp_cleanup.add_missing_deprecated_annotations=true
 sp_cleanup.add_missing_override_annotations=true
 sp_cleanup.add_missing_override_annotations_interface_methods=true
 sp_cleanup.always_use_blocks=true
 sp_cleanup.make_private_fields_final=true
 sp_cleanup.make_variable_declarations_final=true
 sp_cleanup.never_use_parentheses_in_expressions=true
 sp_cleanup.organize_imports=true
 sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
 sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
 sp_cleanup.remove_private_constructors=true
 sp_cleanup.remove_trailing_whitespaces_all=true
 sp_cleanup.remove_unnecessary_casts=true
 sp_cleanup.remove_unused_imports=true
 sp_cleanup.remove_unused_private_fields=true
 sp_cleanup.remove_unused_private_types=true
 sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
 sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
                ]]&gt;
              &lt;/content&gt;
            &lt;/file&gt;
          &lt;/additionalConfig&gt;
        &lt;/configuration&gt;
      &lt;/plugin&gt;
    &lt;/plugins&gt;
  &lt;/build&gt;
&lt;/project&gt;
</pre><p>A noter, on peut également mettre cette configuration dans des <a
href="http://maven.apache.org/plugins/maven-eclipse-plugin/eclipse-mojo.html#additionalConfig" title="fichiers externes" >fichiers externes</a>, qui seraient embarqués dans une dépendance maven :</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
  &lt;artifactId&gt;maven-eclipse-plugin&lt;/artifactId&gt;
  &lt;version&gt;2.7&lt;/version&gt;
  &lt;configuration&gt;
    &lt;additionalConfig&gt;
      &lt;file&gt;
        &lt;name&gt;.settings/org.eclipse.jdt.ui.prefs&lt;/name&gt;
        &lt;location&gt;settings/org.eclipse.jdt.ui.prefs&lt;/location&gt;
      &lt;/file&gt;
      &lt;file&gt;
        &lt;name&gt;.checkstyle&lt;/name&gt;
        &lt;location&gt;/.checkstyle&lt;/location&gt;
      &lt;/file&gt;
    &lt;/additionalConfig&gt;
  &lt;/configuration&gt;
  &lt;dependencies&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;fr.xebia.build.tools&lt;/groupId&gt;
      &lt;artifactId&gt;xebia-eclipse-conf&lt;/artifactId&gt;
      &lt;version&gt;0.0.1&lt;/version&gt;
    &lt;/dependency&gt;
  &lt;/dependencies&gt;
&lt;/plugin&gt;
</pre><p>Notre projet xebia-eclipse-conf est une dépendance maven du projet et possède la structure suivante :</p><p>|-src<br
/> |&#8212;main<br
/> |&#8212;&#8211;resources<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&#8211;.checkstyle<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&#8211;settings<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&#8211;org.eclipse.jdt.ui.prefs</p><p>Une fois la configuration faite, il suffira aux développeurs d&#8217;exécuter la commande <strong>mvn eclipse:m2eclipse</strong> ou <strong>mvn eclipse:eclipse</strong> (si vous n&#8217;utilisez pas m2Eclipse) puis de faire un refresh sur votre projet.</p><p>Nous utilisons la version 2.7 du maven-eclipse-plugin, car le goal eclipse:m2eclipse a été supprimé de la version 2.8 (voir <a
href="http://maven-users.828.n2.nabble.com/searching-for-eclipse-m2eclipse-td4743556.html" title="lexplication de Jason van Zyl" >l&#8217;explication de Jason van Zyl</a>). Cependant, aucune autre alternative valable n&#8217;existe à notre connaissance pour générer les fichiers de configuration d&#8217;Eclipse. Le salut pourra venir des <a
href="http://m2eclipse.sonatype.org/extensible-project-configuration-framework.html">&laquo;&nbsp;Extension points&nbsp;&raquo;</a>, cependant cette solution ne paraît pas encore utilisable en l&#8217;état.</p><h3><a
name="Pointdattention"></a>Point d&#8217;attention</h3><p>Ce n&#8217;est pas parce que l&#8217;on peut tout faire, qu&#8217;il est souhaitable de tout mettre dans notre configuration. Le mieux est l&#8217;ennemi du bien, et il convient donc de trouver un juste équilibre entre ce qui est vraiment utile et ce qui pourrait devenir une contrainte pour certaines personnes. Quoi qu&#8217;il arrive, il est important que l&#8217;équipe valide ensemble le contenu plutôt qu&#8217;une personne isolée fasse selon ses goûts.</p><p>Voilà pour l&#8217;astuce ! Maintenant, vous allez me dire que dans votre équipe un vilain petit canard utilise Intellij Idea. Je ne connais pas encore le pendant de cette méthode. Peut-être que le maven-idea-plugin fait l&#8217;affaire. Si vous connaissez une solution viable, n&#8217;hésitez pas à poster la solution en commentaire.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/01/19/configurer-automatiquement-eclipse-avec-maven/feed/</wfw:commentRss> <slash:comments>18</slash:comments> </item> <item><title>Choisir son outil pour automatiser les déploiements</title><link>http://blog.xebia.fr/2010/12/01/choisir-son-outil-pour-automatiser-les-deploiements/</link> <comments>http://blog.xebia.fr/2010/12/01/choisir-son-outil-pour-automatiser-les-deploiements/#comments</comments> <pubDate>Wed, 01 Dec 2010 07:43:01 +0000</pubDate> <dc:creator>Emmanuel Servent</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Automatisation]]></category> <category><![CDATA[build]]></category> <category><![CDATA[Déploiement]]></category> <category><![CDATA[DeployIt]]></category> <category><![CDATA[Maven]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6034</guid> <description><![CDATA[Depuis le traditionnel outil make, introduit en 1977 pour livrer en production un logiciel, plusieurs étapes, de la construction du logiciel au processus de livraison, ont été automatisées. En réalité, être professionnel lorsqu&#8217;on parle de développer des logiciels, c&#8217;est, a minima, savoir automatiser la compilation et les tests en intégration continue. Mais un autre sujet [...]]]></description> <content:encoded><![CDATA[<p>Depuis le traditionnel outil <a
href="http://www.gnu.org/software/make/" title="make" >make</a>, introduit en 1977 pour livrer en production un logiciel, plusieurs étapes, de la construction du logiciel au processus de livraison, ont été automatisées. En réalité, être professionnel lorsqu&#8217;on parle de développer des logiciels, c&#8217;est, a minima, savoir automatiser la compilation et les tests en <a
href="http://martinfowler.com/articles/continuousIntegration.html" title="intégration continue" >intégration continue</a>. Mais un autre sujet progresse aussi dans le domaine de la gestion du <a
href="http://en.wikipedia.org/wiki/Application_Lifecycle_Management" title="cycle de vie des applications" >cycle de vie des applications</a> (Application Lifecycle Management &#8211; ALM), il s&#8217;agit de l&#8217;automatisation des déploiements. Cette progression est en partie due à nos environnements (serveurs d&#8217;application, ESB, EAI, etc.) qui sont de plus en plus complexes et étendus. Le nombre croissant de nouvelles versions d&#8217;une application, demandées par le business moderne, et le fait que le déploiement doit être suffisamment fiable pour ne pas risquer d&#8217;interrompre un service en ligne sont deux raisons supplémentaires qui poussent à s&#8217;intéresser à cette question. Ajoutez à cela que les infrastructures en cloud gagnent un peu plus de terrain chaque jour, et vous conviendrez que l&#8217;on a encore un long chemin, à la fois motivant et intéressant, à parcourir.</p><h3><a
name="Estcequenosoutilsdepackagingac"></a>Est-ce que nos outils de packaging actuels peuvent déployer nos applications?</h3><p>Dans cet article, je souhaite comparer l&#8217;automatisation du déploiement au plus connu des processus automatiques du développement logiciel : le packaging de l&#8217;application. En simplifiant, le processus de packaging part du code source pour le transformer en code exécutable. La façon la plus simple pour créer ce code est d&#8217;utiliser un script shell qui lance le compilateur, mais ce processus a beaucoup mûri. Grâce à des outils comme Make, cité précédemment, mais aussi à <a
href="http://ant.apache.org/" title="Ant" >Ant</a> et <a
href="http://maven.apache.org/" title="Maven" >Maven</a>, l&#8217;utilisateur peut spécifier de manière très détaillée tout le processus. Prenons l&#8217;exemple de Maven, la plupart des projets n&#8217;ont plus besoin de scripter quoique soit. Le fichier <a
href="http://maven.apache.org/pom.html" title="POM" >POM</a> décrit les composants du projet, les plugins utilisés, et la façon de packager l&#8217;application. Et en ce moment même, de nouveaux outils font leur apparition, comme <a
href="http://www.gradle.org/" title="Gradle" >Gradle</a>, qui offre encore un peu plus de flexibilité.</p><p>Mais ces outils nous permettent-ils de faire du déploiement automatique? Dans un <a
href="http://blog.xebia.fr/2009/10/20/le-deploiement-cas-decole" title="billet prcdent" >billet précédent</a>, mon collègue <a
href="http://blog.xebia.com/author/rvanloghem/" title="Robert van Loghem">Robert van Loghem</a> a expliqué en quoi le déploiement est un processus complexe qui inclut un certain nombre d&#8217;étapes comme l&#8217;installation des EAR/WAR, la configuration des datasources et le redémarrage des serveurs.<br
/> Bien que Wikipedia inclut la fonction de déploiement vers des systèmes en production, lorsqu&#8217;il définit <a
href="http://en.wikipedia.org/wiki/Build_Automation" title="l'automatisation du packaging" >l&#8217;automatisation du packaging</a>, les outils actuels n&#8217;ont pas intégré ces concepts de <a
href="http://www.infoq.com/articles/dev-op-xebia" title="packages de déploiement" >packages de déploiement</a> (i.e. les livrables), les environnements cibles (test, recette, production, etc.) ou <a
href="http://blog.xebia.com/2010/07/05/customize-this-tailoring-deployment-packages-to-your-target-environments/" title="la modification des valeurs selon lenvironnement" >la modification des valeurs selon l&#8217;environnement</a>. En réalité, ils n&#8217;ont pas de connaissances liées aux middlewares sur lesquels on déploie et ne proposeront certainement jamais des scenarii de déploiement. Au final, ce qu&#8217;offrent ces outils, c&#8217;est le moyen de scripter, bien connu des développeurs, et de stocker ces scripts avec les sources à installer. Cela amène irrémédiablement à de nombreux scripts « maison » pour automatiser les déploiements.</p><p>Mais ce n&#8217;est pas tellement surprenant. Dans Wikipedia, <a
href="http://en.wikipedia.org/wiki/Build_Automation#Requirements_of_a_build_system" title="les prrequis dun systme dautomatisation" >les pré-requis d&#8217;un système d&#8217;automatisation</a> ne mentionnent pas le Déploiement. Un système de déploiement automatique a pour objectif de déployer du code exécutable sur un environnement cible, alors que le système d&#8217;automatisation du packaging ne fait que produire ce code exécutable.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/11/build_automation_to_deployment_automation.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/build_automation_to_deployment_automation.png" width="587" height="173" alt="build_automation_to_deployment_automation" title="build_automation_to_deployment_automation" /></a></div><h3><a
name="Lesprrequisncessairespourqueno"></a>Les pré-requis nécessaires pour que notre outil déploie</h3><p>Voici une liste de pré-requis que devrait satisfaire un outil de déploiement automatique :</p><ul><li>Avoir nativement les concepts de base du déploiement : packages, environnements, lien entre les middlewares, etc.</li><li>Support inclus pour les middlewares principaux avec une possibilité de l&#8217;étendre.</li><li>Support inclus pour les scenarii courants de déploiement avec un moyen de les personnaliser.</li><li>Proposer une séparation des rôles : les développeurs livrent le projet, un groupe d&#8217;administrateur définit les environnements et un autre groupe déploie l&#8217;application, etc.</li><li>Supporter une charge croissante d&#8217;environnements avec plusieurs applications et de nombreux utilisateurs.</li><li>Être capable de faire des déploiements multi-plateformes : des environnements complexes peuvent s&#8217;étendre sur de multiples systèmes d&#8217;opération et versions.</li></ul><p>Les outils d&#8217;automatisation de packaging ne répondent pas à ces pré-requis et vouloir les étendre ne fera que complexifier leur utilisation sans pour autant faciliter convenablement les déploiements.<br
/> Cela explique l&#8217;émergence d&#8217;outils de déploiement automatique, qui ont dépassé les anciens outils de scripts « maison ».</p><p>Que l&#8217;on soit bien d&#8217;accord, les outils de déploiement automatique ne remplacent pas les outils d&#8217;automatisation des packages. Mais les deux ont leur place dans le paysage des livraisons d&#8217;applications. Les outils de packaging produisent le code exécutable et les outils de déploiements s&#8217;assurent de rendre ce code disponible pour les utilisateurs finaux !</p><p><em>Dans le prochain article de cette série, nous expliquerons en quoi le déploiement automatique est différent du mécanisme de gestion des livraisons de nouvelles versions.</em></p><hr
/> <em>Traduction libre du billet <a
href="http://blog.xebia.com/2010/10/12/deployment-automation-vs-build-automation/" title=""Deployment automation vs. build automation"" >&laquo;&nbsp;Deployment automation vs. build automation&nbsp;&raquo;</a> publié par <a
href="http://blog.xebia.com/author/vpartington/" title="Vincent Partington" >Vincent Partington</a> sur <a
href="http://blog.xebia.com" title="blogxebiacom" >blog.xebia.com</a>.</em></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/12/01/choisir-son-outil-pour-automatiser-les-deploiements/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/</link> <comments>http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#comments</comments> <pubDate>Tue, 07 Sep 2010 10:00:33 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[cloud]]></category> <category><![CDATA[GWT]]></category> <category><![CDATA[HornetQ]]></category> <category><![CDATA[Hudson]]></category> <category><![CDATA[JBoss]]></category> <category><![CDATA[JRuby]]></category> <category><![CDATA[JUG]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[OAuth]]></category> <category><![CDATA[RoR]]></category> <category><![CDATA[Saas]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Twitter]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5326</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Cloudbees propose Hudson en Software as a Service JBoss met en avant les performances de HornetQ SOA Lancement de vFabric au VMworld 2010 : Spring in the cloud Le coin de la technique GWT 2.1 sera Maven compliant OAuth : [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /></p><p><em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#CloudbeesproposeHudsonenSoftwa">Cloudbees propose Hudson en Software as a Service</a></li><li><a
href="http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#JBossmetenavantlesperformances">JBoss met en avant les performances de HornetQ</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#LancementdevFabricauVMworldSpr">Lancement de vFabric au VMworld 2010 : Spring in the cloud</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#GWTseraMavencompliant">GWT 2.1 sera Maven compliant</a></li><li><a
href="http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#OAuthpasleprotocoledauthentifi">OAuth : pas le protocole d&#8217;authentification ultime ?</a></li><li><a
href="http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#RubyonRailsestsortiduboisJRuby">Ruby on Rails 3 est sorti du bois, JRuby l&#8217;attendait au bar</a></li></ul><p><strong>Evènements  de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#JugSummerCampLaRochelle">Jug Summer Camp 2010 &#8211; La Rochelle</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="CloudbeesproposeHudsonenSoftwa"></a>Cloudbees propose Hudson en Software as a Service</h4><p>Le Software as a Service fait beaucoup de bruit, mais peu d&#8217;initiatives tangibles émergent. C&#8217;est peut être à cause de la complexité de nos logiciels, ou bien à cause du manque de maitrise qui en résulte, que nous hésitons à les déporter sur un environnement de type cloud. Alors, pourquoi ne pas commencer petit, avec un logiciel que nous maitrisons parfaitement ? Plutôt que d&#8217;arriver chez vos clients et de systématiquement reconstruire une plateforme d&#8217;intégration continue, Cloudbees propose Hudson &laquo;&nbsp;à la demande&nbsp;&raquo; (_HaaS_ Hudson as a Service). Avec un dimensionnement automatique du nombre d&#8217;agents nécessaires pour effectuer l&#8217;ensemble des taches de votre build, Cloubees offre une réelle parallélisation des traitements, et donc des builds plus rapides. Ant, Maven et le Jdk sont disponibles dans une grande variété de versions. Et, petit plus appréciable, Cloudbees propose &laquo;&nbsp;gratuitement&nbsp;&raquo; des repositories GIT, SVN et un dépôt Maven privés.<br
/> La facturation se décompose en deux parties :</p><ul><li>un partie fixe, de 25$ à 35$ par mois, en fonction du nombre de user (5 ou 10).</li><li>une partie variable, par agent et par minute d&#8217;utilisation (0,6$ par heure et par agent).</li></ul><p>Reste à sortir les calculatrices, pour savoir si dans votre cas mieux vaut mobiliser un master et plusieurs slaves Hudson dans votre propre infrastructure, ou bien si le tarif agressif de ce nouveau mode d&#8217;intégration continue vous décidera à déposer vos sources sur le <em>cloud</em>.  Pour tester ce nouveau service, <a
title="Cloudbess propose une version dvaluation de 7 jours" href="http://cloudbees.com/dev-pricing.cb">Cloudbess propose une version d&#8217;évaluation de 7 jours</a>, incluant 7 heures de build.</p><h4><a
name="JBossmetenavantlesperformances"></a>JBoss met en avant les performances de HornetQ</h4><p>Un peu plus d&#8217;un an après la <a
title="sortie officielle" href="http://blog.xebia.fr/2009/08/31/revue-de-presse-xebia-124/#JBossHornetQ">sortie officielle</a> d&#8217;HornetQ, sur les fondations de JBoss Messaging, RedHat tente de prouver sa maturité et son avance sur d&#8217;autres produits du marché. Un <a
title="benchmark" href="https://community.jboss.org/servlet/JiveServlet/download/15777-7-16513/JMS_Market_Throughput_Comparison.pdf">benchmark</a>, proposé par eux-mêmes, compare les produits suivants:</p><ul><li>HornetQ 2.1.1 final</li><li>ActiveMQ 5.3.2 GA</li><li>SwiftMQ 7.6</li><li>OpenMQ 4.4</li><li>d&#8217;autres produits mais anonymes</li></ul><p>Les scénarios choisis suivent ces critères:</p><ul><li>le nombre d&#8217;acteurs: d&#8217;un producteur et un consommateur  (1/1) jusqu&#8217;à un scénario avec 40 acteurs de chaque côté.</li><li>la taille des messages allant de 12 bytes à 1k byte.</li><li>de type publish/subscribe ou point-à-point</li><li>la persistance ou non des messages</li><li>la persistance transactionnelle ou non</li></ul><p>Sans trop de surprises, HornetQ s&#8217;en sort très bien au niveau des résultats, ActiveMQ trainant beaucoup la patte, même face à d&#8217;autre concurrents. Bien que forcément partial, on peut cependant dégager quelques remarques intéressantes sur les points forts de HornetQ:</p><ul><li>le MoM devance de loin ses concurrents sur le transfert de petits messages non persistés</li><li>la différence est moins grande pour le transfert de messages non persistés plus gros (1k), et se fait parfois même dépasser</li><li>la différence est à nouveau grande dans les scénarios de persistance</li></ul><p>HornetQ est capable d&#8217;utiliser un mode asynchrone pour l&#8217;écriture des fichiers à condition d&#8217;être sur une distribution particulière de linux. Cette option n&#8217;est pas spécifiée dans le benchmark et donc ne doit pas être utilisée, mais une précision serait la bienvenue, histoire d&#8217;être sûr.</p><p>Les benchmarks de ce type sont souvent sujet à polémiques et celui-ci <a
title="en fait partie" href="http://www.theserverside.com/discussions/thread.tss?thread_id=60827">en fait partie</a>. Les scénarios sont souvent trop simples, chaque éditeur a ses options très spécifiques à tel cas d&#8217;utilisation. Néanmoins on peut lire entre les lignes les points forts et les points faibles et ensuite à chacun de se faire une opinion.</p><h3><a
name="SOA"></a>SOA</h3><h4><a
name="LancementdevFabricauVMworldSpr"></a>Lancement de vFabric au VMworld 2010 : Spring in the cloud</h4><p>La semaine dernière, VMWare était au coeur de l&#8217;actualité avec l&#8217;évènement <a
title="VMworld" href="http://www.vmworld.com/index.jspa">VMworld</a> qui a été le théâtre de plusieurs <a
title="annonces" href="http://www.vmware.com/next-decade/">annonces</a> dont celle de <a
title="VFabric" href="http://www.springsource.com/products/cloud-application-platform">VFabric</a>.<br
/> VMWare souhaite pousser les applications dans le Cloud et il a rassemblé sous le nom VFabric, les différents éléments de sa plateforme pour le développement et l&#8217;exploitation d&#8217;applications cloudifiées.<br
/> L&#8217;annonce est relayée sur le <a
title="blog" href="http://blog.springsource.com/2010/08/31/cloud-platform/">blog</a> de Rod Johnson qui nous donne sa vision de cette nouvelle plateforme. SpringSource qui s&#8217;est fait connaitre grâce au framework Spring dispose maintenant d&#8217;un portefeuille de technologies conséquent :</p><ul><li>son serveur d&#8217;application <a
title="tcServer" href="http://www.springsource.com/products/tcserver">tcServer</a> (reposant sur Tomcat),</li><li>le datagrid <a
title="GemFire" href="http://www.springsource.com/products/data-management">GemFire</a>,</li><li>le serveur web et le load balancer de la solution <a
title="Enterprise Ready Server" href="http://www.springsource.com/products/apache-web-server">Enterprise Ready Server</a> (basé sur le serveur web Apache),</li><li>la solution de monitoring <a
title="Hyperic" href="http://www.springsource.com/products/systems-management">Hyperic</a>,</li><li>le système de messaging <a
title="RabbitMQ" href="http://www.springsource.com/products/messaging">RabbitMQ</a>.</li></ul><p>Ces différentes technologies sont associées aux solutions de virtualisation de VMWare pour former leur boîte à outils du cloud computing VFabric.</p><p>VMWare et SpringSource continuent donc sur la route initiée il y a un peu plus d&#8217;un an par le rachat de SpringSource par VMware (dont nous vous parlions <a
title="ici" href="http://blog.xebia.fr/2009/08/17/pourquoi-vmware-springsource-virtualisation-materielle-vs-cloud/">ici</a>) et le rachat de CloudFoundry (<a
title="ici" href="http://blog.xebia.fr/2009/08/19/java-platform-as-a-service-springsource-accelere/">ici</a> pour plus d&#8217;informations) avec pour but que le cloud soit l&#8217;infrastructure d&#8217;exécution des applications informatiques de demain.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="GWTseraMavencompliant"></a>GWT 2.1 sera Maven compliant</h4><p>Google depuis quelques mois fait de gros efforts pour rendre leurs GWT et AppEngine plus <em>Maven-friendly</em>. L&#8217;arborescence assez spécifique de ces projets obligeait jusqu&#8217;à maintenant de se contenter de solutions intermédiaires. Nicolas De Loof nous <a
title="annonce" href="http://blog.loof.fr/2010/09/gwt-21-will-be-maven-compliant.html">annonce</a> sur son blog l&#8217;arrivée d&#8217;une nouvelle version compatible entièrement avec la future version 2.1 de GWT. Par exemple une option <code>-maven</code> du script <code>webAppCreator</code> permettra de construire le fichier selon les conventions Maven.</p><p>Une des plus grosses difficultés provient des changements parfois assez importants d&#8217;une version à une autre de GWT. Or le plugin actuellement est maintenu de sorte qu&#8217;il soit compatible avec toutes les anciennes SDK. Nicolas De Loof propose à présent que chaque nouvelle version du plugin soit callée sur celle de GWT. Si vous êtes d&#8217;accord avec ce principe vous pouvez voter <a
title="ici" href="http://markmail.org/search/?q=list:org.codehaus.mojo.dev#query:list%3Aorg.codehaus.mojo.dev+page:1+mid:vdxubybus3tfii6e+state:results">ici</a>.</p><h4><a
name="OAuthpasleprotocoledauthentifi"></a>OAuth : pas le protocole d&#8217;authentification ultime ?</h4><p>En 2007, suite à des réflexions sur le moyen de déléguer à des API l&#8217;accès à des ressources privées, les créateurs du site Ma.gnolia finirent par inventer <a
title="OAuth" href="http://en.wikipedia.org/wiki/OAuth">OAuth</a>, un protocole ouvert destiné à remplir cette fonction. Beaucoup ont alors cru voir arriver le protocole d&#8217;authentification ultime. Mais si la sécurité informatique était simple, cela se saurait !</p><p>Jusqu&#8217;à il y a peu, les applications clientes de Twitter se connectaient à celui-ci en demandant simplement leur mot de passe et login aux utilisateurs. Mais cela représentait un risque: rien ne dit qu&#8217;une application à laquelle on donne ses codes d&#8217;accès ne va pas les transmettre à quelqu&#8217;un de mal intentionné qui pourrait en faire mauvais usage ou tenter de réutiliser votre mot de passe sur d&#8217;autres sites (au cas ou vous feriez partie des nombreuses personnes qui réutilisent le même mot de passe pour de nombreux services, ce qui n&#8217;est bien sûr pas votre cas <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). Mais récemment, Twitter a fermé son accès <em>basic auth</em> et oblige les applications à utiliser le protocole OAuth. Et comme le raconte <a
title="Ryan Paul" href="http://arstechnica.com/author/ryan-paul/">Ryan Paul</a>, le développeur du client de microblogging Gwibber <a
title="sur Ars Technica" href="http://arstechnica.com/security/guides/2010/09/twitter-a-case-study-on-how-to-do-oauth-wrong.ars">sur Ars Technica</a> cela ne va pas sans poser problème.  Par exemple pour les applications <em>standalone</em>, les clefs requises par le protocole doivent se trouver dans le programme. Or toute donnée informatique, même bien obfusquée, peut se retrouver (avec un peu de travail ou parfois même un simple éditeur héxa !). Ainsi les clefs qui sont sensées garantir l&#8217;identité de l&#8217;application appelante ne garantissent plus rien. Ryan Paul a lui même facilement fait passer auprès de Twitter sa propre application pour le client Twitter officiel. Lorsque l&#8217;on sait que Twitter menace de désactiver certaines applications en cas d&#8217;abus ou si leur clefs sont compromises, on peut logiquement s&#8217;attendre à voir arriver des attaques visant à désactiver les applications des concurrents.</p><p>Un autre cas problématique est la position des nombreux clients Twitter Open-Source. Comment garder ses clefs secrètes tout en publiant son code source ?! Epineux problème !</p><p>Bref, il semble que la question, loin d&#8217;être simple, ne soit pas prête d&#8217;être réglée. C&#8217;est pour cela qu&#8217;elle mérite que l&#8217;on s&#8217;y intéresse de prés, au travers <a
title="du long article" href="http://arstechnica.com/security/guides/2010/09/twitter-a-case-study-on-how-to-do-oauth-wrong.ars">du long article</a> de Ryan Paul qui passe en revue les différents problèmes, dont certains spécifiques à l&#8217;implémentation OAuth de Twitter. Et dans l&#8217;état actuel des choses, cette dernière semble plus destiné à permettre les interactions de serveur (client) à serveur (Twitter) plûtot que d&#8217;application <em>standalone</em> à serveur (Twitter).</p><h4><a
name="RubyonRailsestsortiduboisJRuby"></a>Ruby on Rails 3 est sorti du bois, JRuby l&#8217;attendait au bar</h4><p>Avis au amateurs de Ruby et de JRuby ! Le célèbre framework web le plus productif au monde est sorti dans sa version 3.0. La communauté Ruby vibre déjà et les observateurs externes se demandent si le buzz va devenir aussi gros que lors de la sortie de la 1.0 en 2006. Parmi les nouveautés, on peut citer :</p><ul><li>intégration d&#8217;un nouveau moteur de génération de requêtes SQL : <a
title="ARel" href="http://github.com/brynary/arel">ARel</a>.</li><li>refonte du moteur de routing url -&gt; contrôleur pour une approche plus REST.</li><li>refonte des entrailles pour passer d&#8217;un code monolithique à du tout modulaire.</li><li>nouvelle API de plugins</li></ul><p>Le point important pour nous autre du monde Java, c&#8217;est que l&#8217;équipe JRuby a travaillé, en parallèle de Rails, à intégrer toutes les nouveautés. JRuby 1.5 supporte Rails 3 depuis sa version bêta de février, mais pour l&#8217;instant il n&#8217;y a que peu de retours JRuby + Rails 3.0, donc si le coeur vous en dit, testez et remontez du feedback.</p><ul><li><a
title="Lannonce officielle" href="http://weblog.rubyonrails.org/2010/8/29/rails-3-0-it-s-done">L&#8217;annonce officielle</a></li></ul><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements  de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="JugSummerCampLaRochelle"></a>Jug Summer Camp 2010 &#8211; La Rochelle</h4><p>Le 10 Septembre aura lieu à la Rochelle le Jug Summer Camp. Il s&#8217;agit de la conférence Java de la rentrée qui s&#8217;étale sur toute la journée du vendredi.<br
/> Le <a
title="programme" href="http://sites.google.com/site/jugsummercamp/programmation">programme</a> est bien fourni, et les sujets tourneront principalement autour de Java EE 6 (avec GlassFish, JPA 2, JSF 2 &#8230;) et n&#8217;oublions pas Maven 3 avec Nicolas De Loof et Spring 3 avec Julien Dubois. Le planning est disponible <a
title="ici" href="http://sites.google.com/site/jugsummercamp/planning">ici</a> et les inscriptions sont maintenant closes. Vous n&#8217;avez pas pu vous inscrire mais vous voulez quand même savoir ce qui s&#8217;est passé ? Alors pensez au blog des <a
title="Duchess France" href="http://jduchess.org/duchess-france/">Duchess France</a> qui seront présentes durant cette journée et couvriront l&#8217;évènement. Merci à Orianne Tisseuil et Jérôme Petit, JUG Leader du Poitou Charentes JUG, pour l&#8217;organisation de cet évènement.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/06/01/revue-de-presse-xebia-161/</link> <comments>http://blog.xebia.fr/2010/06/01/revue-de-presse-xebia-161/#comments</comments> <pubDate>Tue, 01 Jun 2010 05:36:54 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Ehcache]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Oracle]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[Terracotta]]></category> <category><![CDATA[Threads]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4836</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Où sont passées les stars de Sun ? Le coin de la technique Nouvelle version pour EhCache jucProfiler Maven Enforcer Actualité éditeurs / SSII Où sont passées les stars de Sun ? Un an après le rachat de Sun par [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/01/revue-de-presse-xebia-161/#OsontpasseslesstarsdeSun">Où sont passées les stars de Sun ?</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/01/revue-de-presse-xebia-161/#NouvelleversionpourEhCache">Nouvelle version pour EhCache</a></li><li><a
href="http://blog.xebia.fr/2010/06/01/revue-de-presse-xebia-161/#jucProfiler">jucProfiler</a></li><li><a
href="http://blog.xebia.fr/2010/06/01/revue-de-presse-xebia-161/#MavenEnforcer">Maven Enforcer</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="OsontpasseslesstarsdeSun"></a>Où sont passées les stars de Sun ?</h4><p>Un an après le rachat de Sun par Oracle, qu&#8217;est il advenu des stars de Sun ? La réponse est plutôt radicale : elles se sont envolées vers des cieux plus cléments. Avant d&#8217;entrer dans plus de détails, on peut d&#8217;abord noter que la différence &laquo;&nbsp;génétique&nbsp;&raquo; entre Sun, moteur d&#8217;innovation proche d&#8217;une entreprise de recherche, et Oracle, éditeur logiciel centré sur le business, augurait de nombreux chocs culturels.<br
/> Certains ont été violents, et la rupture a été amère. C&#8217;est le cas pour James Gosling, qui a été le plus prolixe (<a
href="http://blogs.sun.com/jag/entry/javame_is_not_dead" title="sur son blog" >sur son blog</a>) au sujet de son départ, évoquant une démission qui l&#8217;a occupé à plein temps pendant plusieurs semaines. De manière comparable, Tim Bray a rejoint Google, en ne détaillant pas les raisons qui l&#8217;ont poussées à quitter Oracle mais en laissant transparaître une certaine amertume.<br
/> D&#8217;autres sont partis car Oracle ne leur donnait pas de garanties sur leur technologie : Charles Nutter et Thomas Enebo ont rejoint <a
href="http://www.engineyard.com/" title="Engine Yard" >Engine Yard</a> pour continuer à développer JRuby. Kohsuke Kawaguchi a monté sa société pour porter Hudson.<br
/> Enfin, certains n&#8217;ont pas reçu d&#8217;offre d&#8217;Oracle. C&#8217;était attendu pour Jonathan Schwartz et Scott McNealy qui étaient quasiment condamnés par leur position au sommet de la hiérarchie de Sun. C&#8217;était plus surprenant pour Simon Phipps, responsable de l&#8217;open source, qui occupe un poste équivalent chez <a
href="http://forgerock.com/" title="ForgeRock" >ForgeRock</a> (qui entend développer -OpenSSO- pardon OpenAM, le nom OpenSSO étant déposé).<br
/> Alors, cette vague de départs sera t&#8217;elle préjudiciable à Oracle ? Sur le plan de l&#8217;innovation, certainement. Sur un plan purement business, on peut en douter, aucun des &laquo;&nbsp;sous&nbsp;&raquo;-produits (sans que nous portions de jugement de qualité) de Sun n&#8217;étant stratégiques pour la firme de Larry Ellison. D&#8217;ailleurs, si l&#8217;on jette rapidement un œil à ceux qui sont restés, on note John Fowler, Cindy Reese, et Mike Splain, tous trois impliqués dans la branche hardware. De là à dire que c&#8217;était la principale visée d&#8217;Oracle (avec la JVM)&#8230; &laquo;&nbsp;Malheureusement&nbsp;&raquo;, Oracle a aussi hérité de bébés bien encombrants, comme les JUG (voir <a
href="http://blog.loof.fr/2010/05/oracle-et-les-jugs.html" title="larticle de Nicolas de Loof  ce sujet" >l&#8217;article de Nicolas de Loof à ce sujet</a>).</p><p><a
href="http://www.infoworld.com/d/the-industry-standard/suns-stars-where-are-they-now-and-why-did-they-leave-765?source=footer" title="Via infoWorld" >Via infoWorld</a></p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="NouvelleversionpourEhCache"></a>Nouvelle version pour EhCache</h4><p>Terracotta maintient le rythme des évolutions Ehcache, en nous livrant cette nouvelle version numérotée 2.1.<br
/> Après un mois de maturation en bêta, l&#8217;éditeur officialise donc la dernière mouture stable de son célèbre cache.<br
/> C&#8217;est surtout l&#8217;occasion d&#8217;étoffer son offre produit en ajoutant notamment un plugin de monitoring permettant de surveiller en temps réel les métriques essentielles du cache. Grâce à lui, les développeurs pourront affiner la configuration du cache, par contre pour l&#8217;utiliser en production il vous faudra une version payante.<br
/> Le support Websphere a bénéficié lui aussi d&#8217;améliorations pour garantir à ses utilisateurs l&#8217;accès à toutes les fonctionnalités du produit.<br
/> Cela inclut tout naturellement, le support la solution Terracotta Web Session, un cluster de session web à haute disponibilité, déjà disponible pour Weblogic, JBoss, Tomcat et Jetty.<br
/> L&#8217;utilisation de JTA a aussi été largement améliorée, les configurations standalone et Hibernate sont à présent supportées, ce qui permet de couvrir l&#8217;intégralité des stratégies Hibernate.<br
/> En dernier point d&#8217;amélioration, le développement a été axé vers de meilleures performances et un paramétrage fin des SLAs. C&#8217;est par exemple la fonctionnalité <a
href="http://ehcache.org/documentation/non_stop_cache.html" title="NonStopCache" >NonStopCache</a> qui permet de contrôler le timeout des opérations sur le cache, voire même de passer automatiquement d&#8217;un cache sur disque à un cache en mémoire vive en cas d&#8217;indisponibilité. Par ailleurs le <a
href="http://ehcache.org/documentation/unlocked_reads_view.html" title="UnlockedReadsView" >UnlockedReadsView</a> offre une vue non consistante du cache. Dans les faits, elle ignore les verrous d&#8217;écriture et ne pose pas de verrou de lecture, l&#8217;équivalent d&#8217;un READ_UNCOMITTED avec des performances très largement accrues.</p><ul><li><a
href="http://www.terracotta.org/news/pr/2010-05-25-ehcache-2.1" title="Lannonce Terracotta" >L&#8217;annonce Terracotta</a></li><li><a
href="http://dsoguy.blogspot.com/2010/04/ehcache-21-beta-lots-of-stuff-still.html" title="Un article plus pouss par Steve Harris" >Un article plus poussé par Steve Harris</a></li><li><a
href="http://ehcache.org/" title="La page daccueil du projet" >La page d&#8217;accueil du projet</a></li></ul><h4><a
name="jucProfiler"></a>jucProfiler</h4><p>Il y a quelques années, <a
href="http://blog.xebia.fr/2007/11/29/chroniques-de-la-performance-a-propos-de-contentions/" title="certains se sont arrachés les cheveux pour détecter les contentions dans un programme massivement parallélisé" >certains se sont arrachés les cheveux pour détecter les contentions dans un programme massivement parallélisé</a>. Malheureusement pour les amoureux des nœuds au cerveau, les développeurs de chez IBM se sont penchés sur le sujet et proposent un outil pour diagnostiquer ce type de problèmes : <a
href="http://aminoprj.blogspot.com/2010/01/jucprofiler-javautilconcurrent-locks.html" title="jucProfiler" >jucProfiler</a> (pour java.util.concurrent). Le principe est simple : instrumenter le bytecode de certaines classes de <code>java.util.concurrent.locks</code> et tracer les appels à <code>java.util.concurrent.locks.LockSupport</code> et <code>java.util.concurrent.locks.AbstractQueuedSynchronizer</code>.<br
/> L&#8217;outil génère ensuite un rapport permettant d&#8217;identifier deux types de problèmes sur les thread, consomateurs de temps :</p><ul><li>du temps de contention : un verrou est réservé par un autre thread.</li><li>du temps d&#8217;attente : le thread est en <code>wait</code>.</li></ul><p>Et cerise sur le gâteau, pour ceux d&#8217;entre vous lassés de devoir diagnostiquer des problèmes de performances en analysant des fichiers texte de trois pieds de long, un éditeur graphique est même fourni.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/06/juc.jpg" border="0" alt="" /></div><p>Comme le dit justement la conclusion de l&#8217;article, la généralisation de la programmation parallèle nous oblige à nous armer de meilleurs outils. Il semblerait que jucProfiler en fasse partie. Si l&#8217;un de nos lecteurs a eu l&#8217;opportunité de l&#8217;utiliser en condition réelle, nous sommes bien sûr preneurs d&#8217;un retour d&#8217;expérience.</p><h4><a
name="MavenEnforcer"></a>Maven Enforcer</h4><p>Sonatype a récemment mis en ligne une présentation en deux parties (<a
href="http://www.sonatype.com/people/2010/05/sonatypes-maven-training-on-youtube/" title="ici" >ici</a> et <a
href="http://www.sonatype.com/people/2010/05/maven-enforcer-plugin-tutorial-part-2/" title="là" >là</a>) sur le plugin <a
href="http://maven.apache.org/enforcer/index.html" title="Maven Enforcer" >Maven Enforcer</a>.<br
/> Ce plugin permet de définir des règles afin d&#8217;obtenir un build Maven reproductible sur différents environnements. Il permet entre autres :</p><ul><li>de spécifier une version ou une plage de versions de Maven,</li><li>de spécifier une version ou une plage de versions du JDK,</li><li>de spécifier une architecture (OS/CPU) sur laquelle s&#8217;exécute le build,</li><li>de s&#8217;assurer que le projet ne contient pas de dépendances (transitives) vers des versions non explicites (SNAPSHOT, LATEST ou RELEASE),</li><li>de s&#8217;assurer que le projet n&#8217;utilise pas de plugins ayant une version non explicite (SNAPSHOT, LATEST ou RELEASE),</li><li>de bannir des dépendances,</li><li>de définir ses propres règles (en Java ou avec un script BeanShell).</li></ul><p>La présentation met l&#8217;accent sur la nécessité de fixer les versions des dépendances et des plugins afin d&#8217;éviter qu&#8217;un build ne devienne instable suite à la publication d&#8217;une nouvelle version d&#8217;une dépendance ou d&#8217;un plugin. Il préconise notamment l&#8217;emploi de Maven en version supérieure à 2.0.9 pour laquelle le POM parent n&#8217;utilise plus que des versions explicites des plugins.</p><p>Elle recommande aussi de spécifier une version du JDK (1.5.x par exemple) afin d&#8217;éviter différentes problématiques telles que l&#8217;utilisation d&#8217;API non supportées ou la différence de comportement de certains plugins Maven en fonction de la version de la JVM sur laquelle ils sont exécutés.</p><p>Une fois les bonnes pratiques exposées, la configuration des différentes règles permettant d&#8217;effectuer les vérifications est abordée.</p><p>Le plugin Maven Enforcer est encore peu connu mais gagnerait à être utilisé pour éviter des problèmes récurrents. Cette présentation est un bon point de départ pour aborder sa mise en place.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/06/01/revue-de-presse-xebia-161/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>SBT (simple-build-tool) pour Scala</title><link>http://blog.xebia.fr/2010/05/06/sbt-simple-build-tool-pour-scala/</link> <comments>http://blog.xebia.fr/2010/05/06/sbt-simple-build-tool-pour-scala/#comments</comments> <pubDate>Thu, 06 May 2010 07:53:40 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Ivy]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[SBT]]></category> <category><![CDATA[scala]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4568</guid> <description><![CDATA[Maintenant que vous êtes tous convaincus par Scala, nous allons regarder durant les prochaines semaines quelques outils et frameworks indispensables pour démarrer nos projets d&#8217;entreprise. En effet, tout comme dans nos projets Java, il n&#8217;est plus envisageable au jour d&#8217;aujourd&#8217;hui de commencer un projet sans un environnement minimum : un bon IDE, un outil de [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2010/05/scala-logo.png" border="0" alt="" style="margin: 1em 1em 1em 2em; float: right;" /><br
/> Maintenant que vous êtes tous <a
href="http://blog.xebia.fr/2010/04/20/merci-paris-jug/" title="convaincus par Scala" >convaincus par Scala</a>, nous allons regarder durant les prochaines semaines quelques outils et frameworks indispensables pour démarrer nos projets d&#8217;entreprise. En effet, tout comme dans nos projets Java, il n&#8217;est plus envisageable au jour d&#8217;aujourd&#8217;hui de commencer un projet sans un environnement minimum : un bon IDE, un outil de build, de l&#8217;intégration continue, un outil de couverture de tests et bien d&#8217;autres. Leurs buts : nous faciliter le développement et nous avertir d&#8217;éventuels problèmes dans notre code <em>(manque de tests, trop de warnings&#8230;)</em>.</p><p>Le sujet de cet article n&#8217;est autre que le framework Scala qui monte <em>(très vite)</em> en ce moment à savoir <a
href="http://code.google.com/p/simple-build-tool/" title="sbt (pour simple-build-tool)" >sbt (pour simple-build-tool)</a>. Nous verrons dans cet article ce qu&#8217;est sbt, ses différentes fonctionnalités et en quoi cet outil va nous être très utile dans nos développements quotidiens.</p><h3><a
name="YetAnotherBuildTool"></a>Yet Another Build Tool ?</h3><p>sbt est un outil de build qui se veut simple d&#8217;utilisation. Son objectif est de fournir des fonctionnalités basiques et avancées très simples à implémenter sur un projet Scala ou Java.<br
/> On pourra dès lors n&#8217;utiliser notre IDE qu&#8217;en tant qu&#8217;éditeur de texte et laisser à sbt les tâches de compilation, de tests unitaires sur une ou plusieurs versions de Scala <em>(très utile pour les concepteurs d&#8217;API)</em>, changer de version de Scala en cours de développement&#8230;</p><p>La configuration de se fait en Scala à l&#8217;aide d&#8217;un DSL qui vous permettra de spécifier ses dépendances de projet, ses plugins et beaucoup d&#8217;autres paramètres. Le gestionnaire de dépendances utilisé est ivy. Il est possible pour son projet de spécifier un repository maven ou autre et ainsi n&#8217;avoir qu&#8217;un seul repository centralisé sur sa machine.</p><p>A notez que sbt tourne au minimum sur Java 5.</p><h3><a
name="Fonctionnalits"></a>Fonctionnalités</h3><h4><a
name="Gnrales"></a>Générales</h4><p>L&#8217;outil propose plusieurs fonctionnalités en standard dont :</p><ul><li>Configuration du projet en Scala,</li><li>Compilations et tests en continu,</li><li>Support de projets Java et Scala,</li><li>Génération de la <code>scaladoc</code>,</li><li>Frameworks ScalaCheck, Specs et ScalaTest supportés par défaut,</li><li>Démarrage du REPL avec projet et dépendances dans le classpath,</li><li>Exécution de tâches en parallèle <em>(dont les tests)</em>,</li><li>Gestion de dépendances inline, ivy ou maven.</li></ul><p>Nous allons regarder plus en détail les actions possibles dans sbt, la configuration d&#8217;un projet sbt ainsi que les quelques cas d&#8217;utilisation.</p><h4><a
name="Actions"></a>Actions</h4><p>Il y a plusieurs manières d&#8217;utiliser sbt. Soit en lançant la console sbt pour effectuer nos actions unitairement dans l&#8217;environnement sbt, soit en mode batch avec certaines commandes prédéfinies dans l&#8217;appel à sbt. Il est aussi possible <em>(nous le détaillerons plus tard dans l&#8217;article)</em> de mettre une action en attente de modification de fichiers pour ensuite être lancée.</p><pre class="brush: java; title: ; notranslate">
// Console
$ sbt
&gt; compile
&gt; test
&gt; ...
// Batch
$ sbt clean compile &quot;get sbt.version&quot;
// Wait
$ sbt
&gt; ~ test
</pre><p>Il est possible de lancer une action sur une version de Scala spécifique. Ainsi, si l&#8217;on souhaite par exemple compiler notre projet en Scala 2.8.0 alors que notre projet est actuellement en Scala 2.7.7, nous ferons :</p><pre class="brush: java; title: ; notranslate">
// 2.7.7 by default
&gt; compile
// Force 2.8.0.Beta1 version
&gt; ++2.8.0.Beta1 compile
</pre><p>Les actions possibles sont assez <a
href="http://code.google.com/p/simple-build-tool/wiki/RunningSbt#Actions" title="nombreuses" >nombreuses</a> sachant que vous connaissez déjà bon nombre d&#8217;entre elles :</p><ul><li><code>clean</code>, <code>compile</code>, <code>exec</code>, <code>jetty-run</code>, <code>package</code>, <code>test</code>&#8230; qui font ce que vous savez <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ,</li><li><code>update</code> pour mettre à jour vos dépendances,</li><li><code>sh</code> qui invoque le shell unix pour par exemple exécuter un find,</li><li>nombreuses actions sur <code>test-*</code> et <code>package-*</code> avec plusieurs déclinaisons <em>(<code>all, docs, project, failed, quick...</code>)</em>,</li><li><code>console</code> et <code>console-quick</code> pour démarrer l&#8217;interpréteur Scala <em>(REPL)</em>, la différence entre les deux se faisant sur le classpath chargé au démarrage,</li></ul><p>Concernant les actions qui touchent à l&#8217;environnement sbt, nous avons :</p><ul><li><code>exit</code>, <code>quit</code>, <code>help</code>, <code>info</code>, <code>debug</code>, <code>trace</code>, <code>warn</code>, <code>error</code>&#8230;,</li><li><code>reload</code> qui permet de recharger les modifications effectuées sur la configuration de notre projet,</li><li><code>current</code> qui nous donne le nom du projet ainsi que le niveau de log actuel,</li><li><code>projects</code> qui liste tous les projets disponibles en cas d&#8217;arborescence de projets,</li><li><code>; A ; B</code> qui exécute une action A et qui, si elle réussie, exécute une action B.</li></ul><p>Il est bien sûr possible de créer ses propres actions en construisant une tâche <code>Task</code> de la manière suivante :</p><pre class="brush: java; title: ; notranslate">
lazy val foo = task { log.info(&quot;Foo !&quot;); None }
</pre><p>La tâche <code>foo</code> sera alors créée et disponible dans la console sbt. A noter qu&#8217;une syntaxe minuscule et une séparation par tiret est respectée pour les noms de tâche, ainsi une variable nommée <code>fooBar</code> donnera comme tâche <code>foo-bar</code>.</p><p>Il est possible de définir sur quelle phase du build la tâche doit être lancée et de fournir une description de la tâche :</p><pre class="brush: java; title: ; notranslate">
lazy val jars = task { ... } dependsOn(compile, doc) describedAs(&quot;Package classes and API docs.&quot;)
</pre><p>Il est aussi possible de modifier des actions existantes comme <code>clean</code>, <code>test</code> ou bien encore <code>package</code> mais aussi de modifier la dépendance de ces tâches par rapport à d&#8217;autres tâches. Vous pouvez aussi faire de l&#8217;exécution conditionnelle pour des tâches générant des fichiers. Différentes stratégies existent, on pourra ainsi définir qu&#8217;une tâche ne doit être exécutée que si les fichiers cibles qu&#8217;elle génère sont périmés ou bien constamment générer ces fichiers cibles.</p><h4><a
name="Configuration"></a>Configuration</h4><p>L&#8217;arborescence d&#8217;un projet sbt est la suivante :</p><pre class="brush: java; title: ; notranslate">
lib/
lib_managed/
project/
   boot/
   build/
      MyProjectConf.scala
   plugins/
      Plugins.scala
   build.properties
src/
   main/
      scala/
      resources/
   test/
      scala/
      resources/
target/
</pre><p>On remarque la même arborescence de dossier que pour un projet maven à savoir <code>src/main/scala</code> et <code>src/main/resources</code> pour les sources et <code>src/test/scala</code> et <code>src/test/resources</code> pour les tests. Concernant les autres dossiers, <code>lib</code> vous permettra de déposer vos librairies, <code>lib_managed</code> contiendra vos dépendances <em>(si aucun repository n&#8217;est spécifié)</em>, <code>project/build</code> votre configuration projet tandis que <code>project/plugins</code> vous permettra de définir les plugins que votre projet utilisera.</p><p>La définition des dépendances et la gestion des plugins se fait en Scala. Voici quelques exemples de définition de dépendances :</p><pre class="brush: java; title: ; notranslate">
lazy val jetty = &quot;org.mortbay.jetty&quot; % &quot;jetty&quot; % &quot;6.1.22&quot;
lazy val h2 = &quot;com.h2database&quot; % &quot;h2&quot; % &quot;1.2.121&quot;
lazy val junit = &quot;junit&quot; % &quot;junit&quot; % &quot;4.5&quot; % &quot;test&quot;
lazy val slf4 = &quot;org.slf4j&quot; % &quot;slf4j-log4j12&quot; % &quot;1.4.1&quot;
</pre><p>Il est possible de définir un projet de type parent qui contiendra plusieurs projets <em>(modules)</em>. La configuration pour ce type de projet est la suivante :</p><pre class="brush: java; title: ; notranslate">
import sbt._
class ParentProject(info: ProjectInfo) extends ParentProject(info) {
   lazy val core = project(&quot;core&quot;, &quot;Core project&quot;)
   lazy val client = project(&quot;client&quot;, &quot;Client project&quot;, core) // Project based on core
   lazy val dao = project(&quot;dao&quot;, &quot;DAO project&quot;, new DAOProject(_))
   class DAOProject(info: ProjectInfo) extends DefaultProject(info) {
      // Define here custom dependencies
   }
}
</pre><p>Il est aussi possible de définir sa configuration projet à partir d&#8217;un fichier maven <code>pom.xml</code> ou d&#8217;un fichier ivy <code>ivy.xml</code>. Pour cela, il suffit de les ajouter à la racine de votre projet. Ainsi, sur une commande <code>update</code>, sbt utilisera le fichier maven ou ivy pour gérer les dépendances du projet.</p><p>Les configurations possibles sont nombreuses. Pour une configuration plus avancée, je vous renvoie vers <a
href="http://code.google.com/p/simple-build-tool/wiki/BuildConfiguration" title="cette page" >cette page</a> qui détaille exhaustivement tout ce que l&#8217;on peut faire en terme de configuration dans un projet sbt, du changement de l&#8217;arborescence des dossiers aux options de compilation, package et test.</p><h3><a
name="Casdutilisation"></a>Cas d&#8217;utilisation</h3><h4><a
name="Triggeredexecution"></a>Triggered execution</h4><p>En effet, sbt ne se résume pas qu&#8217;à un simple outil de configuration projet. Nous avons vu au début de cet article les actions possibles dans sbt, comme par exemple <code>compile</code> ou <code>test</code>. Ce sont des actions <em>one shot</em> qu&#8217;il faudra relancer autant de fois que l&#8217;on voudra pour, dans ce cas, compiler ou tester.</p><p>Mais, en préfixant ces actions par le caractère <code>~</code>, sbt se mettra en attente de modification dans le <em>scope</em> de l&#8217;action et dès qu&#8217;une modification sera effectuée, l&#8217;action sera <em>déclenchée</em>, d&#8217;où leur nom : <em>triggered execution</em>. Ainsi, si une modification se produit par exemple dans <code>src/main/scala</code>, <code>compile</code> et <code>test</code> seront appelés car ils sont en attente de modifications sur les fichiers sources du projet.</p><p>Actuellement, trois types d&#8217;actions sont de type <em>triggered  execution</em> :</p><ul><li> compilation : avec la compilation continue par <code>~ test-compile</code> ou uniquement la compilation des sources dans <code>main</code> avec <code>~ compile</code> ;</li><li>test : avec <code>~ test-quick</code> pour lancer les tests qui n&#8217;ont pas encore réussi <em>(nouveau ou failed du tests précédent)</em> ou qui ont été recompilés, <code>~ test-failed</code> pour lancer uniquement les tests qui n&#8217;ont pas encore réussi <em>(mais ne relance pas les tests recompilés comme <code>~ test-quick</code>)</em> et <code>~ test-only mytestpackage.MyTest</code> pour lancer les tests de la classe spécifiée ;</li><li>web-app : si vous utilisez jetty et une fois jetty lancé <em>(<code>jetty-run</code>)</em>, la commande <code>~ prepare-webapp</code> recompilera la webapp pour prendre en compte les modifications. Pour avoir une compilation continue <em>totale</em>, je vous renvoie à la section <a
href="http://code.google.com/p/simple-build-tool/wiki/WebApplications#JRebel" title="JRebel" >JRebel</a> qui explique comment prendre en compte JRebel pour scanner certains dossiers à recharger dynamiquement et ainsi éviter les reloads de Jetty.</li></ul><h4><a
name="Crossbuilding"></a>Cross building</h4><p>L&#8217;autre cas d&#8217;utilisation qu&#8217;offre sbt est le <em>cross building</em>. Cette fonctionnalité est un véritable atout pour toute API ayant comme cible de nombreuses versions de Scala, surtout si elles ne sont pas binairement compatibles entre elles, comme par exemple Scala 2.7.7 et la prochaine version 2.8.0 <em>(mais c&#8217;est aussi le cas entre 2.7.2 et 2.7.4)</em>.</p><p>Voyons d&#8217;abord comment utiliser une librairie <em>packagée</em> différemment pour cette version de Scala. L&#8217;exemple ci-dessous montre en premier le fait d&#8217;imposer la version de Scala. Le problème est que si l&#8217;on change temporairement de version de Scala dans notre projet, il risque de ne pas builder. Le second exemple nous montre que sbt peut récupérer la bonne version de la librairie en fonction de la version de Scala courante de notre projet à l&#8217;aide de la dépendance spéciale <code>%%</code> :</p><pre class="brush: java; title: ; notranslate">
val dispatch = &quot;net.databinder.dispatch&quot; % &quot;dispatch_2.7.7&quot; % &quot;0.7.2&quot;
val dispatch = &quot;net.databinder.dispatch&quot; %% &quot;dispatch&quot; % &quot;0.7.2&quot;
</pre><p>Maintenant, nous allons pouvoir construire notre projet dans différentes versions de Scala en très peu de configuration et surtout en un caractère ! La définition se fait directement dans la console sbt de la manière suivante :</p><pre class="brush: java; title: ; notranslate">
$ sbt
&gt; set build.scala.versions 2.7.7 2.8.0.Beta1 2.7.5 2.7.3 2.7.2
&gt; reload
</pre><p>Par défaut, sbt utilisera la première version définie comme version par défaut. Vous pouvez bien sûr changer de version à tout moment à l&#8217;aide de la commande <code>++version</code>.</p><p>Et pour le <em>cross building</em>, il suffit de préfixer notre action par <code>+</code> pour qu&#8217;elle soit exécutée sur toutes les versions ciblées par notre projet :</p><pre class="brush: java; title: ; notranslate">
&gt; +package
&gt; +publish
</pre><p>Point important : certaines dépendances de votre projet ne seront peut-être pas les mêmes selon les versions de Scala que vous ciblez. Il est donc important de faire un pattern matching sur les API qui pourraient poser problème :</p><pre class="brush: java; title: ; notranslate">
val scalatest = buildScalaVersion match {
   case &quot;2.7.5&quot; =&gt; &quot;org.scala-tools.testing&quot; % &quot;scalatest&quot; % &quot;0.9.5&quot;
   case &quot;2.7.2&quot; =&gt; &quot;org.scalatest&quot; % &quot;scalatest&quot; % &quot;0.9.3&quot;
   case x =&gt; error(&quot;Unsupported Scala version &quot; + x)
}
</pre><h4><a
name="Projectconsole"></a>Project console</h4><p>Dernier cas d&#8217;utilisation que nous verrons dans cet article, le lancement de la console avec tout le contexte de projet intégralement chargé. Ainsi, <code>console-project</code> démarre l&#8217;interpréteur Scala avec le projet courant chargé. On peut dès lors utiliser tous nos objets et faire quelques tests directement dans la console.<br
/> Mais ce mode permet bien plus que l&#8217;appel de nos objets, il permet aussi, entre autres, de :</p><ul><li>voir les options de compilation : <code>compileOptions.foreach(println)</code> ;</li><li>voir tous les repository : <code>repositories.foreach(println)</code> et <code>ivyRepositories.foreach(println)</code> ;</li><li>voir le classpath de compilation et celui des test : <code>compileClasspath</code> et <code>testClasspath</code> ;</li><li>ou bien encore voir les dépendances de projet : <code>mainDependencies.external</code>, <code>mainDependencies.libraries</code> et <code>mainDependencies.scalaJars</code>.</li></ul><h3><a
name="Installation"></a>Installation</h3><p>Maintenant que vous en savez plus sur sbt, j&#8217;espère que vous avez l&#8217;eau à la bouche et que avez envie de jouer avec l&#8217;outil <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Nous allons donc voir comment installer la bête. Tout d&#8217;abord, rendez-vous sur <a
href="http://code.google.com/p/simple-build-tool/downloads/list" title="cette page" >cette page</a> pour télécharger la dernière version de sbt.</p><p>Pour l&#8217;installation sous Mac, il suffit d&#8217;ajouter un fichier dont le nom sera <code>sbt</code> au même niveau que votre Jar sbt avec le contenu suivant :</p><pre class="brush: java; title: ; notranslate">
java -Xmx512M -jar `dirname $0`/sbt-launch.jar &quot;$@&quot;
</pre><p>Il faudra ensuite ajouter dans votre <em>path</em> le répertoire contenant ce fichier et le Jar sbt. Exemple dans <code>.bash_profile</code> :</p><pre class="brush: java; title: ; notranslate">
export SBT_HOME=$HOME/dev/scala/sbt
export PATH=$SBT_HOME:$PATH
</pre><p>Voilà, c&#8217;est installé ! Pour les accros de la ligne de commande, voici un mode d&#8217;installation fait pour eux <em>(unix)</em> qui est d&#8217;ailleurs expliqué sur le <a
href="http://code.google.com/p/simple-build-tool/wiki/Setup#Unix" title="site de sbt" >site de sbt</a> qui installe sbt dans <code>/usr/local/bin/</code> :</p><pre class="brush: java; title: ; notranslate">
$ cd ~
$ wget http://simple-build-tool.googlecode.com/files/sbt-launcher-0.7.3.jar
$ sudo mv sbt-launcher-0.5.6.jar /usr/local/bin/sbt-launcher.jar
$ echo &quot;java -Xmx512M -jar /usr/local/bin/sbt-launcher.jar &quot;$@&quot;&quot; | sudo tee /usr/local/bin/sbt
$ sudo chmod +x /usr/local/bin/sbt
</pre><p>En ce qui concerne l&#8217;installation Windows, cela se passe <a
href="http://code.google.com/p/simple-build-tool/wiki/Setup#Windows" title="ici" >ici</a>.</p><p>Nous allons maintenant tester l&#8217;installation. Commençons par créer un dossier, déplaçons nous dedans et lançons la commande sbt en répondant <code>s</code> à la question de création de projet <em>(pour <code>scratch</code> qui fera une configuration rapide du projet)</em>. Faisons ensuite un <code>compile</code> même si aucune source n&#8217;existe actuellement :</p><pre class="brush: java; title: ; notranslate">
$ mkdir foobar-project
$ cd foobar-project
$ sbt
</pre><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/05/1-sbt-installation.png" border="0" alt="" /></div><p>Build successful ! Ajoutons maintenant un fichier <code>PrintMessage.scala</code> dans <code>src/main/scala</code> qui affichera un message dans la console sur la tâche <code>run</code> :</p><pre class="brush: java; title: ; notranslate">
object PrintMessage {
  def main(args: Array[String]) = println(&quot;Foobar Scala !&quot;)
}
</pre><p>Et maintenant lançons notre message à l&#8217;aide de l&#8217;action <code>run</code> :</p><pre class="brush: java; title: ; notranslate">
$ sbt run
</pre><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/05/2-sbt-installation-run.png" border="0" alt="" /></div><p>Vous voilà prêt pour utiliser sbt !</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Cet outil est déjà très utilisé par plusieurs projets Scala open-source <em>(dont par exemple <a
href="http://akkasource.org/" title="akka" >akka</a>)</em>. Les possibilités sont très nombreuses et n&#8217;ont pas toutes été énumérées dans le présent article. Je vous renvoie vers le <a
href="http://code.google.com/p/simple-build-tool/wiki/BuildConfiguration" title="wiki" >wiki</a> de sbt pour un détail complet des fonctionnalités de l&#8217;outil.</p><p>Ce qui ressort après quelques heures d&#8217;utilisation c&#8217;est l&#8217;extrême simplicité d&#8217;utilisation de l&#8217;outil, la simplicité de configuration d&#8217;un projet et la puissance d&#8217;avoir en tâche de fond les tests en continu. <a
href="http://macstrac.blogspot.com/2010/01/using-sbt-on-your-scala-maven-project.html" title="Certaines" >Certaines</a> <a
href="http://twitter.com/hseeberger/status/13121125642" title="personnes" >personnes</a> vont même jusqu&#8217;à se désynchroniser totalement de leur IDE qui ne devient dès lors qu&#8217;un simple éditeur de texte laissant à sbt la compilation, les tests et l&#8217;exécution. <a
href=" http://zikaprog.wordpress.com/2010/04/19/scala-eclipse-sbt-and-debugging/" title="Dautres" >D&#8217;autres</a> nous expliquent comment configurer Eclipse pour faire du debug sur des tests lancés depuis la console sbt.</p><p>Un petit exemple de projet sbt est d&#8217;ailleurs disponible sur mon <a
href="http://github.com/rmat0n/scala-samples" title="GitHub" >GitHub</a>. A vous de jouer !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/05/06/sbt-simple-build-tool-pour-scala/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Premiers pas avec GreenPepper XWiki</title><link>http://blog.xebia.fr/2010/04/09/premiers-pas-avec-greenpepper-xwiki/</link> <comments>http://blog.xebia.fr/2010/04/09/premiers-pas-avec-greenpepper-xwiki/#comments</comments> <pubDate>Fri, 09 Apr 2010 07:44:49 +0000</pubDate> <dc:creator>Nathaniel Richand</dc:creator> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Acceptance Test Driven Development]]></category> <category><![CDATA[ATDD]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[GreenPepper]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[XWiki]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4367</guid> <description><![CDATA[Adepte de longue date de Fitnesse, j&#8217;ai toujours aimé l&#8217;aspect collaboratif du wiki permettant de sortir les tests du code et de les exposer à d&#8217;autres populations moins technique. Cependant, malgré le succès du projet et la grande communauté qui l&#8217;entoure, Fitnesse reste compliqué à mettre en place et certaines fonctionnalités de bases font cruellement [...]]]></description> <content:encoded><![CDATA[<div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/04/logoGP.png" border="0" alt="" /></div><p>Adepte de longue date de <a
href="http://fitnesse.org/" title="Fitnesse" >Fitnesse</a>, j&#8217;ai toujours aimé l&#8217;aspect collaboratif du wiki permettant de sortir les tests du code et de les exposer à d&#8217;autres populations moins technique. Cependant, malgré le succès du projet et la grande communauté qui l&#8217;entoure, Fitnesse reste compliqué à mettre en place et certaines fonctionnalités de bases font cruellement défaut. De plus, le passage de Fit à <a
href="http://blog.objectmentor.com/articles/2008/10/02/slim" title="Slim" >Slim</a> a fortement contribué à complexifier le projet.<br
/> Pour moi, Fitnesse est un projet passionnant et porteur de nombreuses innovations. Cependant, l&#8217;absence de structuration et le manque de documentation le rend très difficile à mettre en oeuvre et demande une réelle expérience. Je vous conseille tout de même de garder un oeil sur celui-ci, car, depuis l&#8217;année dernière, le projet est redevenu très dynamique (pas moins de sept releases) et semble gagner en maturité (je vous conseille notamment <a
href="http://blog.octo.com/fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%E2%80%99acceptance/">cet article</a> sur les nouveautés).</p><p>J&#8217;ai plusieurs fois dans le passé eu l&#8217;occasion de voir des présentations de <a
href="http://www.greenpeppersoftware.com/" title="GreenPepper" >GreenPepper</a> par les équipes de Pyxis. GreenPepper partage le même concept que Fit/Fitnesse mais a fait le choix de s&#8217;appuyer sur un Wiki existant robuste et mature : <a
href="http://www.atlassian.com/software/confluence/" title="Confluence" >Confluence</a>. Ce choix est un des gros atouts de GreenPepper, mais c&#8217;est aussi la raison qui m&#8217;a toujours fait écarter cette alternative. En effet, j&#8217;ai toujours trouvé difficile de promouvoir un logiciel en expliquant qu&#8217;il faudrait non pas acheter une mais deux licences (pour les entreprises non équipées en Confluence) et qu&#8217;il faudrait configurer et maintenir les deux logiciels.</p><p>Cependant, ce point de blocage a été adressé lors de la version 2.6 sortie en novembre 2009, qui permet désormais de pouvoir faire reposer GreenPepper sur XWiki qui est gratuit et open source.</p><p>Je vous propose donc de m&#8217;accompagner dans le test de cette nouvelle version au travers de cet article qui aborde :</p><ul><li>l&#8217;installation de GreenPepper et la configuration de XWiki,</li><li>la création des premiers tests,</li><li>la configuration de Maven et Eclipse pour GreenPepper,</li><li>la création des fixtures,</li><li>un petit retour d&#8217;expérience,</li><li>mes espoirs pour le futur.</li></ul><p>Avant de vous lancer dans la lecture de cet article, notez que celui-ci est purement technique et nullement philosophique. La présentation de l&#8217;<a
href="http://www.slideshare.net/ehendrickson/introduction-to-acceptance-test-driven-development-3491703" title="ATDD" >ATDD</a> (Acceptance Test Driven Development) ne sera pas abordée ici.</p><h3><a
name="InstallationdeGreenPepperetcon"></a>Installation de GreenPepper et configuration de XWiki</h3><p>Pour ce test, je suis parti sur la version <a
href="http://www.greenpeppersoftware.com/confluence/display/GPW/Download" title="Standalone" >Standalone</a> avec Jetty et HsqlDB embarqués. Téléchargement, unzip, <code>start_xwiki.bat</code>, c&#8217;est parti!</p><p>Je me connecte avec un login d&#8217;administrateur pour configurer GreenPepper (par défaut Admin/admin). Il faut noter qu&#8217;il n&#8217;y a pas de groupe de droits dédié pour GreenPepper, uniquement le groupe &laquo;&nbsp;greenpepper-users&nbsp;&raquo; destiné à identifier les utilisateurs autorisés pour la version avec licence.</p><p>Pour les besoins de ce test, je saisis un numéro de licence d&#8217;essai.</p><p>Puis je me crée un nouvel espace qui va accueillir les tests de mon application. Ici, un batch créé précédemment pour les besoins d&#8217;un XKE :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/04/New_space.jpg" border="0" alt="" /></div><p>Et je définis mon espace comme un projet GreenPepper :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/04/GPRegisterSpace.jpg" border="0" alt="" /></div><h3><a
name="Crationdespremierstests"></a>Création des premiers tests</h3><p>Le wiki étant prêt, je peux passer à l&#8217;écriture de mes premiers tests. Pour cela, je commence par créer une page pour accueillir mon test :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/04/createPage.jpg" border="0" alt="" /></div><h4><a
name="Premiertest"></a>Premier test</h4><p>Pour mon premier test je vais tester le format <a
href="http://www.greenpeppersoftware.com/confluence/display/GPWODOC/4.+Do+With+fixture" title="do with" >do with</a> qui correspond à un flow, voici mon test en format wiki :</p><pre class="brush: java; title: ; notranslate">
|= import| fr.xebia.batch.fixture
Ce test va simplement lancer mon batch et m'afficher en couleur le résultat d'exécution :
|= do with|=xebian
|lancer le batch
</pre><p>Cependant, il est très agréable également d&#8217;utiliser l&#8217;éditeur WYSIWYG. Celui-ci fera plaisir au gens du métier qui n&#8217;aime en général pas trop la syntaxe Wiki :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/04/GPWysiwyg.jpg" border="0" alt="" /></div><p>Il existe des compléments dans fitnesse tels <a
href="http://sourceforge.net/projects/richnesse/develop" title="RichNesse" >RichNesse</a> pour avoir un éditeur graphique, mais cette alternative était assez buggée lors de ma dernière utilisation&#8230;</p><h4><a
name="Secondtest"></a>Second test</h4><p>Pour ce deuxième test je vais essayer le format <a
href="http://www.greenpeppersoftware.com/confluence/display/GPWODOC/5.+Scenario+Fixture" title="scenario" >scenario</a>. Ce format est assez révolutionnaire, et permet d&#8217;écrire une spécification de manière naturelle sans devoir découper dans un tableau le passage de variables. Pour récupérer dans le code les variables, on procèdera par des expressions régulières (voir plus bas).</p><pre class="brush: java; title: ; notranslate">
{{greenpepper-import parameter=&quot;fr.xebia.batch.fixture&quot;/}}
|= Scenario |= XebianScenario
|= lancer le batch xebia avec le fichier toto.xml
|= vérifier que les 2 affaires ont été créées
</pre><p>Les variables qu&#8217;il nous faudra récupérer sont &laquo;&nbsp;xebia&nbsp;&raquo;, &laquo;&nbsp;toto.xml&nbsp;&raquo; et &laquo;&nbsp;2&#8243;. A noter que j&#8217;ai utilisé ici la macro <a
href="http://www.greenpeppersoftware.com/confluence/display/GPWODOC/XWiki+Import+macro|import macro" title="import" >import</a>. Son intérêt est de masquer le tableau contenant les imports de package. Ainsi notre page ne contient que des données métiers et aucune donnée technique :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/04/ScenarioEditeur.jpg" border="0" alt="" /></div><h4><a
name="Organisationdestests"></a>Organisation des tests</h4><p>Lorsque nous avons plusieurs tests, nous voulons pouvoir exécuter tous nos tests en un seul clic, ou bien tous les tests correspondants à une story donnée. Sous GreenPepper, on retrouve la notion de Suite existant dans Fitnesse. Pour faire ceci, j&#8217;ai trouvé deux macros différentes. Soit la macro children <code>greenpepper-children expanded="true"/</code> qui va récupérer toutes les pages GreenPepper filles, soit la macro labels qui va récupérer toutes les pages d&#8217;un tag donné, par exemple : <code>{{greenpepper-labels spaceKey="GreenPepper Batch" title="Batch" labels="Batch" expanded="true" openInSameWindow="true"/}}</code>. Voici ce que donne nos deux macros :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/04/MacroExec.jpg" border="0" alt="" /></div><h3><a
name="ConfigurationdeMavenetEclipse"></a>Configuration de Maven et Eclipse</h3><p>Configurer un projet java simple sous GreenPepper est trivial (tout comme sous Fitnesse). Il suffit d&#8217;utiliser le runner Java et de définir le chemin vers les jars que l&#8217;on teste, notre SUT (System Under Test), ainsi que le chemin vers nos fixtures (nos tests qui vont appeler notre SUT).</p><h4><a
name="Maven"></a>Maven</h4><p>Le challenge pour moi, était de voir comment se comportait GreenPepper avec Maven. J&#8217;avais été très déçu par Fitnesse qui a pendant très longtemps dénigré Maven malgré sa popularité. S&#8217;il existe beaucoup de solutions pour intégrer Maven à Fitnesse, aucune ne fonctionne vraiment. Après m&#8217;être arraché les cheveux, j&#8217;avoue avoir fini par me faire ma propre solution &#8216;bancale&#8217;.</p><p>Pour intégrer Maven à GreenPepper, j&#8217;ai au final dû passer deux heures maximum (en me faisant aider par le forum cependant). A noter que l&#8217;intégration de Maven n&#8217;est pas parfaite, mais elle a le mérite d&#8217;être fonctionnelle. Elle se contente de chercher les <code>&lt;dependencies&gt;</code> définie dans le <code>pom.xml</code>.</p><p>Procédure d&#8217;installation (voir également la <a
href="http://www.greenpeppersoftware.com/confluence/display/GP/Maven+Runner" title="documentation" >documentation</a>) :</p><p>Copiez le jar du runner maven (<a
href="http://www.greenpeppersoftware.com/confluence/display/GPW/Download" title=" tlcharger" >à télécharger</a>) dans le répertoire : <em>greenpepper/maven/runner</em></p><p>Ajoutez un nouveau Runner :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/04/MavenRunner.jpg" border="0" alt="" /></div><ul><li>Command Line :</li></ul><pre class="brush: java; title: ; notranslate">
java -mx252m -cp ${classpaths} ${mainClass} ${inputPath} ${outputPath} -l ${locale} -r ${repository} -f ${fixtureFactory} --xml --pdd ${projectDependencyDescriptor}
</pre><ul><li>Main class : com.greenpepper.maven.runner.Main</li><li>Environment : Java</li></ul><ul><li>Ajoutez dans la partie classpath le runner maven ainsi que les jar de maven embedded :</li></ul><pre class="brush: java; title: ; notranslate">
greenpepper/maven/runner/greenpepper-maven-runner-2.7-complete.jar
C:\apache-maven-2.2.1\lib\maven-2.2.1-uber.jar
C:\apache-maven-2.2.1\boot\classworlds-1.1.jar
</pre><p>Ensuite, définissez votre SUT en renseignant le nouveau Runner Maven ainsi que le chemin vers le pom.xml (Project dependency descriptor) :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/04/SutMaven.jpg" border="0" alt="" /></div><p>Attention 1 : Il ne faut pas renseigner les champs &laquo;&nbsp;System under test classpaths&nbsp;&raquo; et &laquo;&nbsp;fixture classpaths&nbsp;&raquo; qui rentrent en conflit avec la définition du <code>pom.xml</code>.<br
/> Attention 2 : De part l&#8217;utilisation de maven embedded, le fichier <em>settings.xml</em> de maven n&#8217;est pas utilisé. Il faut donc placer son dépôt local dans le répertoire par défaut (<em>user/.m2/repository</em>). Si cela vous pose problème, suivez l&#8217;évolution de la <a
href="http://www.greenpeppersoftware.com/jira/browse/GP-818" title="JIRA associe" >JIRA associée</a>.</p><p>Et voilà, tout fonctionne correctement <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p><h4><a
name="Eclipse"></a>Eclipse</h4><p>Autre déception pour moi avec Fitnesse, son manque d&#8217;intégration avec nos IDE. Il existe quelques embryons de projets d&#8217;intégration de Fitnesse et Eclipse, mais je n&#8217;ai jamais réussi à avoir quelque chose qui soit véritablement fonctionnel &#8230;</p><p>Voici ma procédure avec GreenPepper :</p><ul><li>Installer le plugin depuis l&#8217;update site : <a
href="http://www.greenpeppersoftware.com/greenpepper-eclipse" title="httpwwwgreenpeppersoftwarecomgreenpeppereclipse" >http://www.greenpeppersoftware.com/greenpepper-eclipse</a></li></ul><ul><li>Configurer le plugin, dans windows => preferences :</li></ul><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/04/EclipseGP.jpg" border="0" alt="" /></div><p>Server&#8217;s context path : <a
href="http://localhost:8080/xwiki/greenpepper/xmlrpc" title="httplocalhost8080xwikigreenpepperxmlrpc" >http://localhost:8080/xwiki/greenpepper/xmlrpc</a><br
/> Server&#8217;s XML RPC handler : greenpepper1</p><ul><li>GreenPepperiser le projet depuis le menu &laquo;&nbsp;GreenPepper&nbsp;&raquo;.</li></ul><ul><li>Configurer le SUT dans les paramètres du projet (project->properties->GreenPepper).</li></ul><p>Il y a beaucoup d&#8217;options, j&#8217;ai juste sélectionné dans la liste mon projet, mon SUT et renseigné un lien vers mon runner (C:\greenpepper-xwiki-enterprise-jetty-hsqldb-2.7\greenpepper\java\runner).</p><p>Après avoir fait ceci, mes tests remontent directement sous Eclipse et sont exécutables :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/04/EclipseGPRun.jpg" border="0" alt="" /></div><h3><a
name="Crationdesfixtures"></a>Création des fixtures</h3><p>Après avoir écrit nos tests, il faut maintenant faire le lien avec le code que l&#8217;on souhaite tester en créant des fixtures.</p><ul><li>Test 1 (Do with):</li></ul><p>Cette fixture, va être appelée par notre premier test défini plus tôt.</p><pre class="brush: java; title: ; notranslate">
public class XebianFixture {
    public boolean lancerLeBatch(){
	//Exécute mon batch
	return &quot;COMPLETED&quot;.equals(monBatch.getExitCode());
    }
 }
</pre><ul><li>Test 2 (Scenario):</li></ul><p>Rajouter la dépendance vers GreenPepper dans le projet de fixtures pour avoir les annotations :</p><pre class="brush: xml; title: ; notranslate">
&lt;dependency&gt;
      &lt;groupId&gt;greenpepper-open&lt;/groupId&gt;
      &lt;artifactId&gt;greenpepper-core&lt;/artifactId&gt;
      &lt;version&gt;2.7&lt;/version&gt;
  &lt;/dependency&gt;
   &lt;repositories&gt;
      &lt;repository&gt;
	  &lt;id&gt;GreenPepper&lt;/id&gt;
	  &lt;name&gt;GreenPepper&lt;/name&gt;
	  &lt;url&gt;http://www.greenpeppersoftware.com/nexus/content/groups/public&lt;/url&gt;
      &lt;/repository&gt;
   &lt;/repositories&gt;
</pre><p>Puis faire le lien avec notre code à tester :</p><pre class="brush: java; title: ; notranslate">
public class XebianScenarioFixture {
	int resultingAffaire;
	@Given(&quot;lancer le batch (\\w+) avec le fichier (\\w+\\.xml)&quot;)
	public void launch(String batchName, String fileName){
		System.out.println(batchName);
		System.out.println(fileName);
		//Appeler notre batch et stocker le nombre d'affaire créées dans resultingAffaire
	}
	@Check(&quot;vérifier que les (\\d+) affaires ont été créées&quot;)
	public boolean verifyResult(int expectedAffaire){
		return expectedAffaire == resultingAffaire;
	}
}
</pre><p>On voit que le mode scénario apporte de nombreux avantages. Outre le fait de pouvoir écrire des tests de manière très naturelle, nos fixtures deviennent également beaucoup plus lisibles ! Les méthodes ne possèdent pas de noms à rallonge comme sous Fitnesse et, de plus, l&#8217;intention de la méthode est clairement exprimée par l&#8217;annotation  (<code>@Given</code>, <code>@When</code>, <code>@Then</code>, <code>@Check</code>, &#8230;). Les arguments sont automatiquement mappés grâce aux expressions régulières qui restent relativement triviales à écrire. Si vous cherchez plus d&#8217;exemples, je vous propose <a
href="http://www.greenpeppersoftware.com/blog/2010/02/02/un-exemple-bdd-avec-greenpepper/" title="un article" >un article</a> sur le blog de GreenPepper. Mon seul bémol porte sur l&#8217;utilisation de l&#8217;annotation <code>@Then</code> que je n&#8217;ai pas encore bien compris, je lui préfère le <code>@Check</code> pour le moment.</p><h3><a
name="Retourdexprience"></a>Retour d&#8217;expérience</h3><p>Vous aurez donc compris à la lecture de cet article que j&#8217;ai vraiment été conquis par GreenPepper. Au bout de seulement quelques heures je me sens à l&#8217;aise et pleinement prêt à l&#8217;utiliser.</p><p>Thomas, il y a un peu plus d&#8217;un an, parlait dans son article (<a
href="http://www.tomsquest.com/blog/presentation-et-retour-sur-greenpepper/" title="que je vous encourage  lire" >que je vous encourage à lire</a>) de certaines difficultés rencontrées lors de la mise en place de GreenPepper, dont notamment la documentation, Eclipse et Maven. Le produit a bien évolué depuis (3 releases en 2009) et je n&#8217;ai pas du tout rencontré ce genre de soucis. Au contraire, je trouve la documentation plutôt bonne ce qui compense l&#8217;absence de réelle communauté autour du projet (c&#8217;est exactement l&#8217;inverse avec Fitnesse).</p><p>Enfin, une note particulière sur le support : félicitations ! J&#8217;ai connu des supports payants totalement incompétents, dont je ne citerai pas les noms, qui se contentaient de vous recommander d&#8217;acheter la version supérieure. Ici, je n&#8217;ai pas déboursé un seul centime et j&#8217;ai eu des réponses pointues <a
href="http://www.greenpeppersoftware.com/site/forums/show/7.page" title="dans un dlai variant de 10 minutes  quelques heures" >dans un délai variant de 10 minutes à quelques heures</a> (et encore l&#8217;équipe de développement semble être au Canada). Un grand merci aux équipes de GreenPepper et plus particulièrement à François Denommée pour leur professionnalisme.</p><h3><a
name="Futur"></a>Futur</h3><p>La version de GreenPepper sur XWiki est encore jeune (fin de l&#8217;année 2009) et certaines fonctionnalités ne sont encore présentes que dans la version confluence. On attend donc encore certaines fonctionnalités avec impatience (ce qui ne devrait pas tarder vu le dynamisme du produit).<br
/> Parmi celles-ci, j&#8217;en retiens trois particulièrement qui continueront de rendre ce produit indispensable :</p><ul><li>la notion de &laquo;&nbsp;tag as implemented&nbsp;&raquo; : le testeur ou la personne du métier rédige le cas de test, or celui-ci n&#8217;est pas exécutable tant que le développeur n&#8217;a pas créé la fixture associée.</li></ul><p>Ce flag permet de marquer (directement depuis Eclipse) que le test est prêt à être exécuté.</p><ul><li>La macro <a
href="http://www.greenpeppersoftware.com/confluence/display/GPWODOC/Historic+macro" title="historique dexcution" >historique d&#8217;exécution</a> : cette macro permet de suivre l&#8217;évolution de l&#8217;exécution des tests dans le temps.</li><li>La macro <a
href="http://www.greenpeppersoftware.com/confluence/display/GPWODOC/Include+macro" title="include" >include</a> : qui permet d&#8217;inclure une page de test dans un autre test. Cette fonctionnalité est très intéressante notamment dans le cas où on a une page qui contient l&#8217;initialisation de données communes à plusieurs tests.</li></ul><p>Voilà, je vous laisse maintenant avec toutes les cartes en main pour essayer. Bons tests à vous (dans les 2 sens) !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/04/09/premiers-pas-avec-greenpepper-xwiki/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Maven et Android, comment utiliser le plugin ?</title><link>http://blog.xebia.fr/2010/03/23/maven-et-android-comment-utiliser-le-plugin/</link> <comments>http://blog.xebia.fr/2010/03/23/maven-et-android-comment-utiliser-le-plugin/#comments</comments> <pubDate>Tue, 23 Mar 2010 13:06:35 +0000</pubDate> <dc:creator>Erwan Alliaume</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Mobilité]]></category> <category><![CDATA[Android]]></category> <category><![CDATA[build]]></category> <category><![CDATA[dépendances]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[maven definitive guide]]></category> <category><![CDATA[mutlmodules]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4258</guid> <description><![CDATA[Si vous êtes développeur Android, vous aurez sans doute remarqué qu&#8217;aucun mécanisme ne permet de partager des ressources entre plusieurs projets. Étant l&#8217;auteur d&#8217;une petite dizaine d&#8217;applications, la gestion des ressources communes commence à devenir un véritable problème. En effet, s&#8217;il est très simple de partager du code Java par l&#8217;intermédiaire de jars, il vous [...]]]></description> <content:encoded><![CDATA[<p>Si vous êtes développeur Android, vous aurez sans doute remarqué qu&#8217;aucun mécanisme ne permet de partager des ressources entre plusieurs projets. Étant l&#8217;auteur d&#8217;une <a
href="http://www.android-mini-market.com/" title="petite dizaine dapplications" >petite dizaine d&#8217;applications</a>, la gestion des ressources communes commence à devenir un véritable problème. En effet, s&#8217;il est très simple de partager du code Java par l&#8217;intermédiaire de jars, il vous est impossible de partager des images ou des layouts entre plusieurs applications. Ceci vient de la gestion même des ressources dans un projet Android et de leur utilisation. En effet chaque ressource est référencée sous la forme d&#8217;une constante dans un fichier &#8216;R.java&#8217; automatiquement généré. C&#8217;est cette constante que vous devez utiliser pour utiliser vos différentes ressources dans vos applications. Comme il n&#8217;est pas possible d&#8217;inclure un projet Android dans un autre, nous somme bloqués.</p><p>Étonnamment, ce besoin ne semble pas intéresser plus que cela la communauté Android. En consultant la liste des <a
href="http://b.android.com/" title="demandes d'évolutions" >demandes d&#8217;évolutions</a>, seule une <a
href="http://code.google.com/p/android/issues/detail?id=3987&#038;q=include%20external%20apk&#038;colspec=ID%20Type%20Status%20Owner%20Summary%20Stars" title="fiche" >fiche</a> fait référence à ce type de besoin. Cette demande me paraissant pourtant légitime, j&#8217;en ai discuté avec Romain Guy, l&#8217;un des développeurs Android. Selon lui, la plateforme Android ne permet pas de répondre directement à cette problématique. Tournons-nous donc vers nos outils de builds.</p><p>Cet article présente une manière de configurer un build Maven sur une application Android. Après la lecture de cet article, vous saurez comment construire et déployer un projet Android en utilisant Maven, mais également comment découper vos applications pour partager du code entre votre application Android et sa partie serveur, et comment partager du code et des ressources entre différentes applications Android. Le contenu de cet article est largement inspiré  de la <a
href="http://maven-definitive-guide.fr/maven-reference-fr/site/reference/android-dev.html" title="traduction officielle du chapitre Android du Maven Reference Guide" >traduction officielle du chapitre Android du Maven Reference Guide</a> que je viens tout juste de terminer.</p><h3><a
name="LepluginMavenAndroid"></a>Le plugin Maven Android</h3><p>Le plugin Maven Android permet de construire, déployer et publier des applications Android avec Maven. Vous pouvez ainsi tirer parti des fonctionnalités Maven dans une application Android. Voyons comment utiliser un projet multi-module et la gestion des dépendances pour arriver d&#8217;une part à factoriser du code entre l&#8217;application Android et ses services web côté serveur, d&#8217;autre part à externaliser les assets/ressources communs entre plusieurs projets Android.</p><p>Pour installer ce plugin, récupérez-les <a
href="http://code.google.com/p/maven-android-plugin/" title="sources du projet sur google code" >sources du projet sur google code</a> et installez les artefacts dans votre dépôt :</p><pre class="brush: java; title: ; notranslate">
git clone git://github.com/jayway/maven-android-plugin.git
cd maven-android-plugin
mvn clean install
</pre><h3><a
name="PrparezvotreenvironnementAndro"></a>Préparez votre environnement Android pour Maven</h3><p>Avant de pouvoir utiliser Maven pour construire vos applications Android, quelques tâches préalables sont nécessaires :</p><ul><li>Installation du SDK Android</li><li>Installation des jars de l&#8217;API Android dans un dépôt (local et/ou distant)</li><li>Configuration de Maven pour simplifier l&#8217;utilisation du Maven Android Plugin</li></ul><h4><a
name="InstallationduSDKAndroid"></a>Installation du SDK Android</h4><p>Le plugin Android Maven nécessite la présence du SDK Android dans votre environnement de développement. La variable d&#8217;environnement <code>ANDROID_HOME</code> doit être configurée pour pointer vers le répertoire d&#8217;installation du SDK Android. Ce SDK doit être installé en suivant les consignes disponibles sur le site officiel <a
href="http://developer.android.com/sdk/index.html" title="Android Developer" >Android Developer</a>.</p><p>En plus du SDK, vous devez également installer les différentes versions des plates-formes dont vous avez besoin pour votre développement. Il s&#8217;agit des différentes versions des runtimes Android dont vous désirez vous servir. Par défaut, vous pouvez choisir de toutes les télécharger.  Pour en savoir plus à ce sujet, rendez-vous également sur la <a
href="http://developer.android.com/sdk/adding-components.html" title="documentation officielle" >documentation officielle</a>.</p><p>Enfin, afin de faciliter l&#8217;utilisation des outils du SDK en ligne de commande, vous pouvez rajouter le répertoire <code> ANDROID_HOME/tools</code> à votre <code>PATH</code>.</p><h4><a
name="InstallationdesartefactsAndroi"></a>Installation des artefacts Android dans votre dépôt</h4><p>Une fois que le SDK est installé, vous devez mettre à disposition les différents JARs d&#8217;API dans un dépôt Maven. L&#8217;outil <a
href="http://github.com/mosabua/maven-android-sdk-deployer" title="Maven Android SDK Deployer" >Maven Android SDK Deployer</a> permet d&#8217;effectuer cette tâche. Une fois l&#8217;outil téléchargé, rendez vous dans son répertoire et tapez la commande <code>mvn clean install</code>. Par défaut, cette commande installe les JARs <code>android.jar</code> et <code>maps.jar</code> dans votre dépôt local. Cet outil vous permet de n&#8217;installer qu&#8217;une partie des plateformes dans votre dépôt ou de les déployer dans sur un serveur distant, si ces fonctionnalités vous intéressent, rendez-vous à <a
href="http://maven-definitive-guide.fr/maven-reference-fr/site/reference/android-dev-sect-repository-install.html" title="ladresse suivante" >l&#8217;adresse suivante</a></p><h4><a
name="ConfigurationdeMavenpourAndroi"></a>Configuration de Maven pour Android</h4><p>Afin de pouvoir utiliser les goals du plugin Maven Android à partir de la ligne de commande en utilisant la version courte du nom du plugin &#8216;android&#8217;, vous devez ajouter l&#8217;extrait de configuration suivant dans votre fichier <code>settings.xml</code>.</p><pre class="brush: xml; title: ; notranslate">
&lt;pluginGroups&gt;
   &lt;pluginGroup&gt;
     com.jayway.maven.plugins.android.generation2
   &lt;/pluginGroup&gt;
&lt;/pluginGroups&gt;
</pre><h3><a
name="UtilisationduMavenAndroidPlugi"></a>Utilisation du Maven Android Plugin dans un projet simple</h3><p>Une fois que votre environnement est correctement configuré, vous pouvez configurer Maven pour construire vos applications Android. Pour cela, ajoutez ce <code>pom.xml</code> à la racine de votre application.</p><pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
  &lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot;
           xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
           xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd&quot;&gt;
      &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
      &lt;groupId&gt;fr.xebia.android.demo.simple&lt;/groupId&gt;
      &lt;artifactId&gt;simple-android-project&lt;/artifactId&gt;
      &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
      &lt;packaging&gt;apk&lt;/packaging&gt;
      &lt;name&gt;Simple Android Project&lt;/name&gt;
      &lt;dependencies&gt;
          &lt;dependency&gt;
              &lt;groupId&gt;android&lt;/groupId&gt;
              &lt;artifactId&gt;android&lt;/artifactId&gt;
              &lt;version&gt;2.1_r1&lt;/version&gt;
              &lt;scope&gt;provided&lt;/scope&gt;
          &lt;/dependency&gt;
      &lt;/dependencies&gt;
      &lt;build&gt;
          &lt;sourceDirectory&gt;src&lt;/sourceDirectory&gt;
          &lt;plugins&gt;
              &lt;plugin&gt;
                  &lt;groupId&gt;com.jayway.maven.plugins.android.generation2&lt;/groupId&gt;
                  &lt;artifactId&gt;maven-android-plugin&lt;/artifactId&gt;
                  &lt;version&gt;2.2.3-SNAPSHOT&lt;/version&gt;
                  &lt;configuration&gt;
                      &lt;sdk&gt;
                          &lt;platform&gt;2.1&lt;/platform&gt;
                      &lt;/sdk&gt;
                      &lt;deleteConflictingFiles&gt;true&lt;/deleteConflictingFiles&gt;
                     &lt;undeployBeforeDeploy&gt;true&lt;/undeployBeforeDeploy&gt;
                  &lt;/configuration&gt;
                  &lt;extensions&gt;true&lt;/extensions&gt;
              &lt;/plugin&gt;
              &lt;plugin&gt;
                  &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
                  &lt;configuration&gt;
                      &lt;source&gt;1.5&lt;/source&gt;
                      &lt;target&gt;1.5&lt;/target&gt;
                  &lt;/configuration&gt;
              &lt;/plugin&gt;
          &lt;/plugins&gt;
      &lt;/build&gt;
  &lt;/project&gt;
</pre><p>Ce <code>pom.xml</code> est tout à fait traditionnel excepté les points suivants :</p><ul><li>Il dispose d&#8217;un nouveau type de packaging &#8216;APK&#8217;</li><li>Deux plugins sont configurés dans le <code>build</code> : Maven Android et Maven Compiler</li></ul><p>Le type de packaging APK permet d&#8217;activer le cycle de vie spécifique à Android. Il fait le lien entre Maven et les outils du SDK Android, permet la gestion des ressources, la conversion du bytecode Java en code exécutable Dalvik &#8230;</p><p>La dépendance vers le JAR de la plateforme doit utiliser la version de la cible telle qu&#8217;elle a été publiée dans le dépôt Maven par l&#8217;Android SDK Deployer. Il récupère les versions à partir des valeurs <code>Platform.Version</code> et <code>Pkg.Revision</code> renseignées dans le fichier de propriétés <code>source.properties</code> qui se trouve dans le dossier de la plateforme du SDK Android.</p><p>La configuration du plugin Maven Compiler dans le build est également nécessaire, car Android utilise les fonctionnalités Java 5 (annotations, boucles simplifiées&#8230;).</p><p>Pour construire l&#8217;application et l&#8217;exécuter sur un émulateur déjà lancé, lancez la commande :</p><pre class="brush: java; title: ; notranslate">
mvn clean install android:deploy
</pre><h3><a
name="Ajoutezdestestsvotreapplicatio"></a>Ajoutez des tests à votre application Android</h3><p>Le test du code d&#8217;une application Android peut-être effectué à la manière d&#8217;un test unitaire traditionnel <em>junit</em> dans le cadre du SDK Android, mais aussi par l&#8217;intermédiaire de tests <em>d&#8217;intégration</em>. Ces derniers sont appelés &#8216;instrumentation tests&#8217;.</p><h4><a
name="Excutiondestestsunitairesdunpr"></a>Exécution des tests unitaires d&#8217;un projet Android via Maven</h4><p>Le plugin Android Maven lance l&#8217;exécution des tests unitaires à la manière du plugin Surefire. Comme le chemin par défaut des classes de tests dans Eclipse et dans l&#8217;Android Development Toolkit ne respecte pas la convention Maven, vous devez configurer spécifiquement le dossier d&#8217;accès au code de vos tests unitaires.</p><pre class="brush: xml; title: ; notranslate">
&lt;build&gt;
  &lt;testSourceDirectory&gt;test&lt;/testSourceDirectory&gt;
  ...
&lt;/build&gt;
</pre><h4><a
name="GrezvostestsdinstrumentationAn"></a>Gérez vos tests d&#8217;instrumentation Android avec Maven</h4><p>Les tests d&#8217;instrumentation sont des tests d&#8217;intégration packagés dans une application qui est lancée dans un émulateur (ou un téléphone) et qui interagit avec une autre application pour tester son comportement. Pour exécuter les ces tests d&#8217;instrumentation, vous devez disposer de deux projets distincts : l&#8217;un pour l&#8217;application, l&#8217;autre pour les tests d&#8217;instrumentation. Ces modules sont liés par l&#8217;intermédiaire d&#8217;un pom parent.</p><p>La configuration du plugin Maven Android pour l&#8217;application contenant les tests d&#8217;instrumentation est la même que pour celle de l&#8217;application principale avec une seule différence : l&#8217;ajout d&#8217;une dépendance vers l&#8217;application principale. Il est important d&#8217;ajouter le <em>type apk</em> sur cette dépendance pour permettre au plugin Maven Android de trouver le package de l&#8217;application.</p><pre class="brush: xml; title: ; notranslate">
&lt;dependency&gt;
      &lt;groupId&gt;fr.xebia.android.demo.simple&lt;/groupId&gt;
      &lt;artifactId&gt;simple-android-project&lt;/artifactId&gt;
      &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
      &lt;type&gt;apk&lt;/type&gt;
&lt;/dependency&gt;
</pre><h3><a
name="RajoutezdesAddOnvosapplication"></a>Rajoutez des <em>Add-On</em> à vos applications Android</h3><p>Pour la majorité des applications, l&#8217;artefact du SDK (android.jar) suffit, il arrive pourtant que certaines applications nécessitent des Add Ons. L&#8217;un des Add-Ons les plus connus est celui de Google Maps. Cet Add-On a été déployé dans votre dépôt Maven par l&#8217;outil Maven Android SDK Deployer. Afin de pouvoir utiliser cette API, vous avez besoin d&#8217;ajouter une dépendance à votre application :</p><pre class="brush: xml; title: ; notranslate">
&lt;dependency&gt;
  &lt;groupId&gt;com.google.android.maps&lt;/groupId&gt;
  &lt;artifactId&gt;maps&lt;/artifactId&gt;
  &lt;version&gt;7_r1&lt;/version&gt;
  &lt;scope&gt;provided&lt;/scope&gt;
&lt;/dependency&gt;
</pre><h3><a
name="DcoupezvosprojetsAndroidavecMa"></a>Découpez vos projets Android avec Maven</h3><p>Le plugin Maven Android peut être utilisé sur un projet multi-module de manière transparente, voici comment je vais découper mes projets :</p><p>Le socle contient :</p><ul><li>Une application contenant le code et les ressources Android communes à toutes mes applications Android</li></ul><p>Chaque application contient :</p><ul><li>Un projet pour le code Java réutilisé côté serveur. Cela permet de partager du code entre une application Android et une application Web.</li><li>Une application web de type WAR contenant la partie serveur de l&#8217;application. C&#8217;est cette partie qui fournit les services distants à l&#8217;application Android.</li><li>L&#8217;application Android proprement dite est un projet Maven de type APK qui possède une dépendance sur le modèle et une dépendance sur le socle. C&#8217;est son pom qui configure le plugin Maven Android. Notez le type particulier de la dépendance vers le socle : <a
href="http://code.google.com/p/maven-android-plugin/wiki/ApkSourcesDependency" title="apksources" >apksources</a>, les sources et ressources incluses dans cette dépendance sont poussées dans l&#8217;application courante avant sa construction.</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;dependency&gt;
      &lt;groupId&gt;fr.xebia.android.demo.socle&lt;/groupId&gt;
      &lt;artifactId&gt;socle-sample&lt;/artifactId&gt;
      &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
      &lt;type&gt;apksources&lt;/type&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
      &lt;groupId&gt;fr.xebia.android.demo.simple&lt;/groupId&gt;
      &lt;artifactId&gt;simple-model&lt;/artifactId&gt;
      &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
&lt;/dependency&gt;
</pre><ul><li>Un dernier projet contenant les tests d&#8217;intégration qui dépend de l&#8217;application précédente.</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;dependency&gt;
      &lt;groupId&gt;fr.xebia.android.demo.simple&lt;/groupId&gt;
      &lt;artifactId&gt;simple-android-project&lt;/artifactId&gt;
      &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
      &lt;type&gt;apk&lt;/type&gt;
&lt;/dependency&gt;
</pre><div
align="center"> <img
src=" http://blog.xebia.fr/wp-content/uploads/2010/03/android-multimodules.png" border="0" alt="android maven multimodules" /></div><p>Notez cependant que ce plugin Maven Android est toujours en cours de développement, j&#8217;ai rencontré de nombreux bugs. Le dernier en date, et pas des moindres : la fonctionnalité &#8216;apksources&#8217; ne fonctionnait plus. Utilisez ce genre de fonctionnalité que si vous n&#8217;avez pas peur de mettre les mains dans les sources du plugin en cas de problème. Tout cela sent encore la peinture fraîche, reste à savoir si elle va tenir.</p><p>La solution Maven ne vous a pas séduit ? Il est vrai qu&#8217;elle reste lourde et relativement compliquée, mais il existe bon nombre d&#8217;alternatives <a
href="http://www.linux-mag.com/cache/7667/1.html" title="Ant" >Ant</a>, <a
href="http://code.google.com/p/autoandroid/wiki/AndroidAnt" title="AndroidAnt" >AndroidAnt</a>, <a
href="http://help.eclipse.org/galileo/index.jsp?topic=/org.eclipse.jdt.doc.user/reference/ref-properties-build-path.htm" title="Eclipse Linked Source" >Eclipse Linked Source</a>, <code>ln -s</code> &#8230;</p><div
align="center"> <a
href="http://twitter.com/ealliaume" ><br
/> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/04/twitter4.png"  alt="twitter erwan alliaume" title="twitter erwan alliaume" border="0" /><br
/> </a></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/03/23/maven-et-android-comment-utiliser-le-plugin/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/</link> <comments>http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#comments</comments> <pubDate>Mon, 01 Mar 2010 18:25:17 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[closures]]></category> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Hotspot]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JDK]]></category> <category><![CDATA[JEE]]></category> <category><![CDATA[Jigsaw]]></category> <category><![CDATA[JRockIt]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[OpenJDK]]></category> <category><![CDATA[Sonatype]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4116</guid> <description><![CDATA[La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Sonatype ouvre son dépôt maven pour java.net La fusion JRockIt / Hotspot pas pour demain Agilité Utilisez-vous des métriques intelligentes sur vos projets ? Le coin de la technique Jigsaw, les modules du pauvre ? Comment les closures seront implémentées [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /><br
/> <em>La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#Sonatypeouvresondptmavenpourja">Sonatype ouvre son dépôt maven pour java.net</a></li><li><a
href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#LafusionJRockItHotspotpaspourd">La fusion JRockIt / Hotspot pas pour demain</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#Utilisezvousdesmtriquesintelli">Utilisez-vous des métriques intelligentes sur vos projets ?</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#Jigsawlesmodulesdupauvre">Jigsaw, les modules du pauvre ?</a></li><li><a
href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#Commentlesclosuresserontimplme">Comment les <em>closures</em> seront implémentées dans OpenJDK 7 ?</a></li><li><a
href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#LactualitdesbasesdedonnesNoSQL">L&#8217;actualité des bases de données NoSQL toujours aussi riche</a></li><li><a
href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/#Astucedelasemainercuprezlalist">Astuce de la semaine, récupérez la liste complète des options de votre JVM</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="Sonatypeouvresondptmavenpourja"></a>Sonatype ouvre son dépôt maven pour java.net</h4><p>L&#8217;idée est venue d&#8217;une quantité toujours grandissante de plaintes sur les dépôts Maven fournis par java.net. A l&#8217;heure de la fusion annoncée entre Kenai et java.net, Kenai n&#8217;a aucune solution pour gérer les dépôts et java.net fait mauvaise presse sur ce point. Il n&#8217;aura pas fallu longtemps à Sonatype pour saisir l&#8217;opportunité de mettre en avant sa solution Nexus. L&#8217;éditeur propose donc à tous les projets java.net de migrer vers leur instance Nexus OSS, allant même jusqu&#8217;à organiser le 5 mars une grande journée migration, avec la mise à disposition pour tous des services de conseil et d&#8217;ingénierie interne. Outre la performance et la stabilité du dépôt Maven maintenu par Sonatype, Nexus génère des fichiers d&#8217;index utilisés par nos IDE pour rechercher les dépendances de nos POM.</p><ul><li><a
title="La nouvelle sur DZone" href="http://java.dzone.com/news/sonatype-free-maven-repo">La nouvelle sur DZone</a></li><li><a
title="Lannonce sur le blog Sonatype" href="http://www.sonatype.com/people/2010/02/java-net-maven-repository-rescue-mission-on-march-5th/">L&#8217;annonce sur le blog Sonatype</a></li></ul><h4><a
name="LafusionJRockItHotspotpaspourd"></a>La fusion JRockIt / Hotspot pas pour demain</h4><p><a
title="Nous en parlions il y a quelques semaines" href="http://blog.xebia.fr/2010/02/01/revue-de-presse-xebia-145/">Nous en parlions il y a quelques semaines</a>, Oracle envisage de ne proposer à l&#8217;avenir qu&#8217;une seule JVM, qui tirerait le meilleur des deux que la firme s&#8217;est offert (JRockit via BEA, et Hotpsot via Sun). Dans un récent <a
title="webcast" href="https://channelsun.sun.com/media/show/15028">webcast</a> (via InfoQ), Mark Reinhold s&#8217;est exprimé sur le sujet. Cette fusion n&#8217;est pas pour tout de suite : trop de clients utilisent les fonctionnalités spécifiques à l&#8217;une ou l&#8217;autre des JVMs en production, et il serait risqué de les forcer à migrer vers une version fusionnée bancale. Ce dernier se dit jaloux de certaines fonctionnalités de JRockIt et donc particulièrement excité d&#8217;avoir l&#8217;occasion de l&#8217;étudier en profondeur. Cependant, ce qui transparait dans son discours (et peut être via nos diverses expérience), c&#8217;est que la JVM de Sun est en avance sur celle de BEA. La prochaine version fusionnée devrait donc tendre plus vers Hotspot que vers JRockit. En résumé rapide, cette future VM Oracle devrait avoir les fonctionnalités <em>runtime</em> de Hotspot, et le <em>garbage collector</em> et la robustesse de JRockit. Finalement, à part l&#8217;ébauche d&#8217;une <em>timeline</em>, nous ne sommes pas beaucoup plus avancés.<br
/> Coté nouveautés du JDK 7, Mark Reinhold se dit aussi particulièrement excité par l&#8217;intégration du projet Coin (au contraire de la grande majorité des consultants Xebia, qui trouvent que la plupart de ces évolutions syntaxiques confinent au gadget).<br
/> Il reparle aussi des <em>closures</em>, principalement sous l&#8217;angle des raisons de la polémique, mais personne ne semble réellement savoir comment elles seront implémentées dans le JDK 7 (voir ci-dessous pour l&#8217;avancement du projet Lambda).<br
/> Dernière annonce, pour ceux qui comme lui sont impatients de voir une JVM enfin modulaire (aka Jigsaw, prévu dans le JDK 7, voir ci-dessous), ils devraient en avoir un aperçu mi-mars, avec la <em>release</em> 88 de l&#8217;OpenJDK.</p><p>Certains noteront avec un certain amusement (ou une certaine nostalgie) quelques ratés : <em>&laquo;&nbsp;We, at Sun&#8230;&nbsp;&raquo;</em></p><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="Utilisezvousdesmtriquesintelli"></a>Utilisez-vous des métriques intelligentes sur vos projets ?</h4><p><a
title="Mike Griffiths" href="http://leadinganswers.typepad.com/leading_answers/2010/02/smart-metrics-slides.html">Mike Griffiths</a>, agiliste expérimenté et bloggeur actif, nous présente sa réflexion sur l&#8217;utilisation des métriques dans un projet.<br
/> Au préalable,  Mike nous prévient que :</p><ul><li>Toutes les observations ne sont pas utiles et d&#8217;une grande aide pour analyser et comprendre un phénomène. Elles peuvent même amener à de mauvaises conclusions.</li><li>Certaines mesures très utiles ne sont pas facilement observables.</li></ul><p>Une autre caractéristique à ne pas négliger est <strong>l&#8217;effet Hawthorne</strong> :  L&#8217;observateur influence la mesure. On retrouve d&#8217;ailleurs ce phénomène en physique quantique. Mike nous explique alors que le fait d&#8217;observer et donc d&#8217;influencer la mesure,  à un effet <strong>positif</strong>.</p><p>Pour lui, une métrique « intelligente » doit avoir les caractéristiques suivantes :</p><ul><li>Simple et auto-générée.</li><li>Influence de manière significative ce que l&#8217;on cherche à observer.</li><li>Permet de prendre des décisions et décrire des tendances pour le futur.</li></ul><p>Mike nous conseille de donner plus d&#8217;attention aux métriques  permettant d&#8217;observer des tendances futures et d&#8217;anticiper.</p><p>On peut ainsi opposer aux vieilles métriques :  nombres de lignes codées,  points de fonctions réalisés ou nombres d&#8217;heures travaillées ;  des métriques plus « intelligentes » : confiance des sponsors, satisfaction client, nombre de fonctionnalités réalisées,  ou encore temps passé à la correction de bugs.</p><p>Dans la dernière partie de l&#8217;article sont présentés un certain nombre de métriques plus ou moins connues des agilistes, comme : le <em>taskboard</em> de <em>Scrum</em> ou <em>Kanban</em>. L&#8217;utilisation de métriques intelligentes est indispensable pour mener à bien un projet. Elles permettent d&#8217;observer des tendances, d&#8217;identifier et d&#8217;anticiper des problèmes; et ainsi, de prendre les bonnes décisions.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="Jigsawlesmodulesdupauvre"></a>Jigsaw, les modules du pauvre ?</h4><p><a
title="Adam Bien" href="http://www.adam-bien.com/inhalte/about/index.htm">Adam Bien</a> est l&#8217;un des <a
title="Java champions" href="https://java-champions.dev.java.net/">Java champions</a> les plus visibles et les plus lus d&#8217;internet. Il a publié cette semaine un petit article au titre accrocheur : « <a
title="Jigsaw  JDK 17 sera une solution qui permettra  de rpondre  80 des besoins de modularit" href="http://www.adam-bien.com/roller/abien/entry/jigsaw_jdk_1_7_will">Jigsaw / JDK 1.7 sera une solution qui permettra de répondre à 80% des besoins de modularité</a> ». Vous avez probablement suivi les différents épisodes et rebondissements de la modularité dans le JDK 7. C&#8217;est peut-être l&#8217;occasion de faire le point sur ce que propose Jigsaw.</p><p>Le projet <a
title="Jigsaw" href="http://openjdk.java.net/projects/jigsaw/">Jigsaw</a> proposera une implémentation permettant la mise en place d&#8217;un système de modules bas niveau pour vos projets. Il sera également utilisé en interne pour découper le JDK Oracle/Sun lui-même.</p><ul><li>Jigsaw vous permettra  de choisir <strong>tout ou partie</strong> du JDK tout en restant 100% rétro-compatible, d&#8217;améliorer les temps de démarrage de la JVM et son utilisation mémoire.</li><li>Jigsaw  pourra être utilisé <strong>directement</strong> sur vos projets si vous disposez d&#8217;une JVM reposant sur ce système. Jigsaw sera chargé avant <code>rt.jar</code> et sera donc disponible à quiconque désirant l&#8217;utiliser. Ce projet étant open source, il sera également possible de réutiliser celui-ci dans d&#8217;autres contextes.</li><li>Jigsaw vous permettra de rendre vos applications modulaires <strong>progressivement</strong>. Nul besoin de migrer vos applications dans leur ensemble pour tirer parti des bénéfices de la modularité. Un même <em>package</em> peut être éclaté dans plusieurs modules.</li><li>Contrairement à OSGi, Jigsaw ne vous permet pas le rechargement de modules à chaud. Vos modules sont chargés <strong>statiquement</strong> au démarrage de vos applications.</li><li>Tous vos modules sont chargés dans <strong>un même classloader</strong>, cela permet de simplifier grandement son utilisation. Du même coup, il vous sera probablement possible de &#8216;tricher&#8217; en chargeant, au runtime,  des classes d&#8217;un module sans que vous en ayez réellement le droit.</li></ul><p>Si vous confondiez modularité du JDK avec OSGi, cette liste vous a certainement ouvert les yeux :  Jigsaw vous propose une solution beaucoup moins fournie qu&#8217;OSGi.</p><p>Dans les faits, ce projet a été créé, avant tout, pour casser  notre bon vieux JDK monolithique. Bon nombre de polémiques ont été faites sur ce choix. Pourquoi  se contenter d&#8217;aborder 80% des problématiques de la modularisation avec une nouvelle solution alors qu&#8217;OSGi en aborderait 90% ? La simplicité et la souplesse d&#8217;utilisation ont été préférées à une solution décrite comme lourde (nécessitant beaucoup de glue), vieillissante (datant de 1998) et difficile à maîtriser. Ce choix a été sans conteste difficile à effectuer, il s&#8217;est ailleurs attiré les foudres des défenseurs d&#8217;OSGi, mais reste complètement défendable.</p><h4><a
name="Commentlesclosuresserontimplme"></a>Comment les <em>closures</em> seront implémentées dans OpenJDK 7 ?</h4><p>Fin 2009, le projet Lambda, dont le but est d&#8217;apporter les <em>closures</em> à la prochaine version de Java, <a
title="apparaissait au sein d'OpenJDK" href="http://blog.xebia.fr/2009/12/14/revue-de-presse-xebia-138/#LeprojetLambdaapparatauseindOp">apparaissait au sein d&#8217;OpenJDK</a>. Le lancement du projet faisait suite <a
title="aux rebondissements" href="http://blog.xebia.fr/2009/11/23/revue-de-presse-xebia-135/#JDKJEEetMavenlesannoncesdeDevo">aux rebondissements</a> dans l&#8217;actualité du JDK 7 lors de la conférence Devoxx un mois auparavant. Une <a
title="documentation" href="http://cr.openjdk.java.net/~mr/lambda/straw-man/">documentation</a> montrant la syntaxe des <em>closures</em> avait accompagné la création du projet, plus tard, un <em>draft</em> d&#8217;une <a
title="spcification plus formelle" href="http://mail.openjdk.java.net/pipermail/lambda-dev/attachments/20100212/af8d2cc5/attachment-0001.txt">spécification plus formelle</a> est apparue, mais <em>quid</em> de l&#8217;implémentation ?<br
/> Rémi Forax, contributeur au projet Lambda, <a
title="a mis à disposition" href="http://weblogs.java.net/blog/forax/archive/2010/02/22/fosdem-presentations">a mis à disposition</a> la présentation qu&#8217;il a faite au FOSDEM&#8217;10, dans laquelle il résume <a
title="les discussions" href="http://mail.openjdk.java.net/pipermail/lambda-dev/2009-December/thread.html">les discussions</a> ayant eu lieu sur la <em>mailing list</em> du projet concernant les possibilités d&#8217;implémentation :</p><ul><li>Convertir les <em>closures</em> en classes anonymes. Cette solution présente l&#8217;inconvénient de produire beaucoup de classes et pose problème pour certaines constructions liées au <em>closures</em>.</li><li>Convertir les <em>closures</em> en invocations dynamiques telles que le permettra la <a
title="JSR-292 (Supporting Dynamically Typed Languages on the Java Platform)" href="http://www.jcp.org/en/jsr/detail?id=292">JSR-292 (Supporting Dynamically Typed Languages on the Java Platform)</a>. Cette solution ne produit pas de classes supplémentaires et bénéficie de bonnes performances puisque l&#8217;invocation dynamique présentera un temps d&#8217;exécution similaire aux invocations de méthode classiques.</li></ul><p>Le reste de ses <em>slides</em> présente certaines des problématiques d&#8217;implémentations des <em>closures</em> liées à l&#8217;accès aux variables locales et aux champs de la classe hôte.</p><h4><a
name="LactualitdesbasesdedonnesNoSQL"></a>L&#8217;actualité des bases de données NoSQL toujours aussi riche</h4><p>Depuis plusieurs mois maintenant le mouvement NoSQL <a
title="s'est installé dans l'actualité" href="http://blog.xebia.fr/2009/11/09/revue-de-presse-xebia-133/#LemouvementNoSQLdiviseetintrig">s&#8217;est installé dans l&#8217;actualité</a>. A Paris, le <a
title="NoSQL User Group" href="https://sites.google.com/a/octo.com/nosql/home">NoSQL User Group</a> a attiré l&#8217;attention en réunissant une cinquantaine de personnes à chacune de ses 2 sessions jusqu&#8217;à présent.</p><p>D&#8217;un point de vue plus général, l&#8217;actualité des bases de données NoSQL est marquée par l&#8217;intérêt croissant qu&#8217;elles suscitent, et par leur évolution rapide grâce à l&#8217;effort soutenu de leurs développeurs. Ainsi on a pu noter récemment :</p><ul><li><a
title="Neo4j" href="http://neo4j.org/">Neo4j</a>, une base de données orienté graphe, est maintenant <a
title="disponible en version 10 finale" href="http://news.neo4j.org/2010/02/neo4j-10-released.html">disponible en version 1.0 finale</a>. L&#8217;intérêt de la représentation en graphe est la possibilité de modéliser les données relatives aux réseaux sociaux, mais également tout type d&#8217;objets qui seraient liés entre eux de manière arbitraire. De plus, il est possible d&#8217;appliquer à ces données divers algorithmes de graphe classiques tels que la détermination du plus court chemin entre deux objets ou de l&#8217;objet central/majeur dans un nuage d&#8217;élément.</li><li><a
title="Cassandra" href="http://incubator.apache.org/cassandra/">Cassandra</a> vient pour sa part d&#8217;être publié en version 0.5.1, et connait un succès tout particulier puisque Twitter vient d&#8217;annoncer qu&#8217;il l&#8217;utiliserait désormais comme solution de persistance en remplacement de MySQL. Par ailleurs le projet <a
href="http://github.com/tjake/Lucandra">Lucandra</a> a été créé récemment pour permettre d&#8217;utiliser Cassandra comme solution de persistance pour les indexes Lucene. Donné à la Fondation Apache par Facebook, Cassandra est pour rappel un hybride entre BigTable de Google et Dynamo d&#8217;Amazon.</li><li><a
title="HBase" href="http://hadoop.apache.org/hbase/">HBase</a> profite d&#8217;une communauté très active et d&#8217;un intérêt important, renforcé par sa position de sous-projet du <a
title="très populaire Hadoop" href="http://blog.xebia.fr/2009/06/15/revue-de-presse-xebia-113/#YahoodistribueHadoop">très populaire Hadoop</a>. Sematext vient de publier un <a
title="&lt;i&gt;digest&lt;/i&gt; de l'actualité récente" href="http://blog.sematext.com/2010/02/28/hbase-digest-february-2010/"><em>digest</em> de l&#8217;actualité récente</a> de ce projet. Celle-ci est principalement marquée par le développement d&#8217;une <a
title="réplication &lt;i&gt;multi datacenter&lt;/i&gt;" href="https://issues.apache.org/jira/browse/HBASE-1295">réplication <em>multi datacenter</em></a>, par l&#8217;arrivée d&#8217;un <a
title="plugin DataNucleus pour HBase" href="http://www.datanucleus.org/plugins/store.hbase.html">plugin DataNucleus pour HBase</a> et par la disponibilité prochaine d&#8217;une solution de <a
title="benchmark pour les cloud storages" href="http://www.brianfrankcooper.net/pubs/ycsb.pdf"><em>benchmark</em> pour les <em>cloud storages</em></a> développée par Yahoo!.</li></ul><p>Enfin, deux conférences entièrement dédiées au NoSQL sont à venir : <a
title="NoSQL Live" href="http://nosqlboston.eventbrite.com/">NoSQL Live</a> le 11 mars à Boston et, plus proche de nous, <a
title="NoSQL Europe" href="http://nosqleu.com/">NoSQL Europe</a> du 20 au 22 avril à Londres.</p><h4><a
name="Astucedelasemainercuprezlalist"></a>Astuce de la semaine, récupérez la liste complète des options de votre JVM</h4><p>Cette astuce est complètement inutile, et donc également complètement indispensable. <a
title="Cet article" href="http://representz.blogspot.com/2010/02/get-complete-list-of-all-possible-jvm.html">Cet article</a> nous propose une petite commande permettant de récupérer la liste complète des options de votre JVM Hotspot à partir de sa library native Linux, la voici :</p><pre class="brush: java; title: ; notranslate">
prompt$  strings $JAVA_HOME/jre/lib/amd64/server/libjvm.so | grep -B646 assert_null$ | grep -v '{' | grep -v '&amp;amp;' | grep -v '/' | grep -v '%' | grep -v assert_null
</pre>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/02/08/revue-de-presse-xebia-146/</link> <comments>http://blog.xebia.fr/2010/02/08/revue-de-presse-xebia-146/#comments</comments> <pubDate>Mon, 08 Feb 2010 17:06:14 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[Guice]]></category> <category><![CDATA[Kenaï]]></category> <category><![CDATA[Maven]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3987</guid> <description><![CDATA[La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Kenaï, fermera, fermera pas ? Le coin de la technique Groovy++: bientôt dans votre JVM ? InfoQ sort un ebook gratuit sur Grails Maven vers une injection de dépendances via Guice Actualité éditeurs / SSII Kenaï, fermera, fermera pas ? [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/02/08/revue-de-presse-xebia-146/#Kenafermerafermerapas">Kenaï, fermera, fermera pas ?</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/02/08/revue-de-presse-xebia-146/#GroovybienttdansvotreJVM">Groovy++: bientôt dans votre JVM ?</a></li><li><a
href="http://blog.xebia.fr/2010/02/08/revue-de-presse-xebia-146/#InfoQsortunebookgratuitsurGrai">InfoQ sort un ebook gratuit sur Grails</a></li><li><a
href="http://blog.xebia.fr/2010/02/08/revue-de-presse-xebia-146/#Mavenversuneinjectiondedpendan">Maven vers une injection de dépendances via Guice</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="Kenafermerafermerapas"></a>Kenaï, fermera, fermera pas ?</h4><p>Comme il fallait le prévoir au vu de l&#8217;engouement d&#8217;Oracle pour les projets communautaires, la ferme de projets Kenaï vit ses derniers jours en tant que service public. La plateforme lancée en 2008 et construite autour de JRuby, Glassfish et MySQL fournissait un environnement de suivi de projet complet avec la gestion de version, des wikis, des mailing lists et que sais-je encore. Avec NetBeans 6.7, il est même possible de maintenir entièrement son projet depuis son IDE. Le site héberge encore aujourd&#8217;hui quelques 40 000 projets communautaires parmi lesquels on retiendra JRuby et Hudson. Oracle a d&#8217;abord annoncé la fermeture du site sous 60 jours afin de permettre aux projets de migrer vers d&#8217;autres solutions. L&#8217;idée de départ devait être de ré-utiliser la plateforme en interne mais plus du tout ouverte au public.<br
/> Faut il y voir les effets de la réaction d&#8217;une communauté importante ou un gros problème de communication : Oracle change son fusil d&#8217;épaule à travers la voix de Ted Farrell qui a clarifié l&#8217;avenir de la plateforme en annonçant que ce serait finalement une migration vers java.net. Dans son annonce, Farrell laisse entendre que tous les efforts seront poussés sur java.net et que la communauté Kenaï pourrait continuer à travailler sans perte sur la nouvelle version de cette ancienne plateforme de développement hosté.<br
/> Comme le dit la chanson, trois pas en avant, trois pas en arrière, &#8230;</p><ul><li><a
href="http://www.infoq.com/news/2010/02/kenai_to_close" title="Kena to close sur InfoQ" >Kenaï to close sur InfoQ</a></li><li><a
href="http://blogs.sun.com/projectkenai/entry/the_future_of_kenai_com" title="Le post de Ted Farrell" >Le post de Ted Farrell</a></li></ul><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="GroovybienttdansvotreJVM"></a>Groovy++: bientôt dans votre JVM ?</h4><p>Nous avons éhontément passé sous silence nombre de news du monde Groovy récemment:</p><ul><li><a
href="http://docs.codehaus.org/display/GROOVY/Groovy+1.7+release+notes" title="Groovy 17" >Groovy 1.7</a></li><li><a
href="http://www.grails.org/1.2.1+Release+Notes" title="Grails 12" >Grails 1.2</a></li><li>La sortie du plugin Groovy Eclipse <a
href="http://groovy.codehaus.org/Eclipse+Plugin" title="en version 20" >en version 2.0</a></li><li>La sortie de <a
href="http://groovy.dzone.com/announcements/griffon-021-and-03-beta-1" title="nouvelles versions de Griffon" >nouvelles versions de Griffon</a>, le framework pour  clients lourds qui reprend les idées de Grails</li></ul><p>Alors pour nous rattraper, nous ne passerons pas à coté de la nouvelle suivante : le développement de Groovy++ ! Alex Tkachman, l&#8217;initiateur du projet nous explique <a
href="http://groovy.dzone.com/news/alex-tkachman-static-groovy" title="dans une interview" >dans une interview</a> de quoi il retourne et Roshan Dawrani <a
href="http://groovy.dzone.com/articles/sneak-peak-groovy-what-it-why" title="nous explique ce qu'il retient du projet" >nous explique ce qu&#8217;il retient du projet</a>. En fait, malgré tous ses avantages, Groovy est encore assez lent. En tout cas beaucoup plus que Java, à cause de son coté dynamique. L&#8217;idée de Groovy++ est de continuer à utiliser Groovy normalement, mais en pluggant un compilateur spécial pour certaines parties du code annotées avec @Typed. Le code ainsi annoté devra respecter de légères contraintes  (contraintes par rapport au laxisme de Groovy, mais légères par rapport au typage fort de Java). Le compilateur pourra donc effectuer des optimisations, notamment grâce à <a
href="http://en.wikipedia.org/wiki/Type_inference" title="l'inférence de type" >l&#8217;inférence de type</a>, et nettement améliorer les performances. Les premiers résultats semblent encourageant en tout cas : 197 fois plus rapide d&#8217;après <a
href="http://stronglytypedblog.blogspot.com/2010/02/groovy-performance-now-were-talkin.html" title="ce micro-bench" >ce micro-bench</a> et 33% plus rapide <a
href="http://www.touilleur-express.fr/2010/02/08/grovvy-plus-plus/" title="daprs le touilleur" >d&#8217;après cet article lu sur le Touilleur Express</a>.</p><p>Alors ce Groovy++, une révolution ? Difficile à dire ! En effet, d&#8217;un coté Groovy est de plus en plus utilisé (notamment à travers Grails) et un coup de boost ne peut pas lui faire de mal. Mais d&#8217;un autre coté, l&#8217;interaction de Groovy et Java étant très avancée, on peut se contenter d&#8217;écrire en Java les parties du programme nécessitant des performances optimales. On peut aussi voir en Groovy++ l&#8217;ajout d&#8217;une énième librairie dans le développement, avec ses contraintes, ses bugs&#8230; D&#8217;autant que, pour des problèmes de licence sur certaines parties de code, le compilateur n&#8217;est pas encore OpenSource (ce qui est prévu pour la suite). Donc, si vous sous sentez l&#8217;âme d&#8217;un aventurier ou que vous avez désespérément besoin de gains de performances tout en gardant la &laquo;&nbsp;Groovy attitude&nbsp;&raquo;, n&#8217;hésitez pas à nous faire vos retours sur l&#8217;utilisation de Grovvy++ !</p><h4><a
name="InfoQsortunebookgratuitsurGrai"></a>InfoQ sort un ebook gratuit sur Grails</h4><p>InfoQ vient de sortir, dans sa série <a
href="http://www.google.com/search?q=minibooks+site%3Awww.infoq.com" title=""Minibooks"" >&laquo;&nbsp;Minibooks&nbsp;&raquo;</a> la seconde version de son <a
href="http://www.infoq.com/minibooks/grails-getting-started" title="Getting started with Grails" >&laquo;&nbsp;Getting started with Grails&nbsp;&raquo;</a>. La première version, datant d&#8217;il y a déjà 3 ans, était basée sur Grails 0.3.1 alors que celle-ci s&#8217;appuie sur le tout récent 1.2. Le principe reste identique : les auteurs s&#8217;appuient sur une application de gestion de course de chevaux pour nous faire découvrir au fur et à mesure nombre des possibilités offertes par le framework. A la vue du sommaire, largement remanié, on peut penser que les changements ont été profonds. Sans avoir encore lu cette seconde édition, nous pouvons d&#8217;ores et déjà la recommander chaudement à toute personne qui s&#8217;intéresse à Grails et voudrait rapidement avoir un éventail clair des possibilités qu&#8217;il offre (si elle est dans la même veine que la précédente). D&#8217;autant qu&#8217;au format électronique, le livre est gratuit (juste besoin de s&#8217;inscrire à InfoQ)!</p><h4><a
name="Mavenversuneinjectiondedpendan"></a>Maven vers une injection de dépendances via Guice</h4><p>Sonatype (<a
href="http://www.infoq.com/news/2010/02/maven3_guice" title="via InfoQ" >via InfoQ</a>) a annoncé la migration progressive de Maven vers une injection de dépendances gérée par Google Guice. Ce qui signifie l&#8217;abandon à moyen terme de Plexus, le framework quelque peu obsolète (et abscons, faute de documentation) utilisé depuis les débuts du framework de build. Dans un premier temps, la migration sera gérée via un bridge créé sous Guice.<br
/> De plus, l&#8217;introduction de Guice devrait se faire via les annotations de la JSR 330, ce qui rendra Maven moins adhérent à Guice dans le cas d&#8217;une nouvelle migration vers un autre framework d&#8217;IoC.<br
/> Cette nouvelle devrait réjouir les développeurs de plugins, qui n&#8217;auront plus à maitriser les arcanes de Plexus. Autre conséquence, plus directe, les développeurs Maven n&#8217;auront plus à jouer les comitters Plexus pour débugger et ou faire avancer cet outil (qui devrait rapidement se diriger vers une fin de vie en l&#8217;absence de ce soutien de poids).<br
/> On peut noter que Jason van Zyl, le créateur de Maven, et Bob Lee, l&#8217;un des principaux artisans de Guice, avaient œuvré ensemble à imposer la JSR 330 face à la JSR 299 (<a
href="http://blog.xebia.fr/2009/05/11/inject-standardisation-de-linjection-de-dependances/#more-1979" title="la fameuse bataille Inject contre WebBeans" >la fameuse bataille @Inject contre WebBeans</a>).</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/02/08/revue-de-presse-xebia-146/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Comment séparer ses tests d&#8217;intégration ?</title><link>http://blog.xebia.fr/2010/01/13/comment-separer-ses-tests-dintegrations/</link> <comments>http://blog.xebia.fr/2010/01/13/comment-separer-ses-tests-dintegrations/#comments</comments> <pubDate>Wed, 13 Jan 2010 11:28:40 +0000</pubDate> <dc:creator>Nathaniel Richand</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Intégration]]></category> <category><![CDATA[junit]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[TestNG]]></category> <category><![CDATA[Tests]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3782</guid> <description><![CDATA[Une question récurrente pour les équipes qui commencent à industrialiser leur build avec du Maven et qui utilisent de manière intensive JUnit. Au bout d&#8217;un moment, les tests d&#8217;intégrations ralentissent de manière conséquente le build et parfois découragent les développeurs à cause de leurs pré-requis plus importants que les tests unitaires. Comment les séparer des [...]]]></description> <content:encoded><![CDATA[<p>Une question récurrente pour les équipes qui commencent à industrialiser leur build avec du Maven et qui utilisent de manière intensive JUnit. Au bout d&#8217;un moment, les tests d&#8217;intégrations ralentissent de manière conséquente le build et parfois découragent les développeurs à cause de leurs pré-requis plus importants que les tests unitaires.<br
/> Comment les séparer des tests unitaires et comment éviter qu&#8217;ils soient lancés à chaque build Maven?</p><h3><a
name="Testunitaireoutestdintgration"></a>Test unitaire ou test d&#8217;intégration</h3><p><a
href="http://blog.xebia.fr/wp-content/uploads/2010/01/TestTypologie.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/01/TestTypologie-300x168.png" alt="TestTypologie" title="TestTypologie" width="300" height="168" style="margin: 1em 1em 1em 1em; float: right;" /></a></p><p>La démarcation entre les tests unitaires et les tests d&#8217;intégrations est souvent floue et longuement débattue sur un projet.</p><p>Ce qui caractérise avant tout les tests unitaires, c&#8217;est leur périmètre réduit et surtout leur rapidité d&#8217;exécution (<a
href="http://blog.xebia.fr/2008/04/11/les-10-commandements-des-tests-unitaires/" title="cf les 10 commandements des tests unitaires" >cf. les 10 commandements des tests unitaires</a>). De même, les tests unitaires ne doivent pas avoir de pré-requis complexes et ne pas dépendre d&#8217;un système extérieur pouvant être indisponible (une base de donnée, un service fourni par une autre application, un broker JMS, etc.).</p><p>Il est très important de soigner ses tests unitaires pour que ceux-ci restent une véritable aide au développement. Si l&#8217;un d&#8217;eux échoue pour une raison extérieure au test et au code testé, ou bien s&#8217;ils deviennent de plus en plus lents, vous allez voir fleurir des &nbsp;&raquo; <em>@Ignore</em> &nbsp;&raquo; et les développeurs vont prendre l&#8217;habitude de builder en rajoutant l&#8217;option &laquo;&nbsp;-Dmaven.test.skip&nbsp;&raquo;. Enfin avec le temps, les tests vont devenir une contrainte plus qu&#8217;une aide et vont progressivement disparaître.</p><p>Cependant, nous ne voulons pas pour autant faire une croix sur les tests d&#8217;intégration. Ceux-ci sont très utiles pour vérifier le lien entre les différentes parties, ou faire des tests plus élaborés. De même, ils restent indispensables sur certaines couches, notamment les couches DAO ou WebServices où l&#8217;utilité de tests unitaires reste à voir. En effet quel est l&#8217;intérêt de tester le bon fonctionnement d&#8217;un mock ?</p><p>La question à laquelle nous allons tacher de répondre est donc : <strong>comment séparer de manière propre ces différents types de tests ?</strong></p><h3><a
name="CommentfaireavecMaven"></a>Comment faire avec Maven</h3><h4><a
name="Sparerlestestsdintgrationdansu"></a>Séparer les tests d&#8217;intégration dans un module à part</h4><p>Il existe plusieurs façons de procéder avec Maven, la plus simple étant de placer les tests d&#8217;intégration dans un module séparé du reste du projet. Bien que facile à mettre en place, cela a pour effet de décorreler les sources des tests et de multiplier les modules.</p><p>Dans le même ordre d&#8217;idées, on peut envisager de créer un seul module qui contiendrait tous les tests d&#8217;intégration. Cependant, cette approche n&#8217;est envisageable que si le projet contient un nombre très réduit de modules. Le code de test doit être traité avec autant d&#8217;égard que le reste du code. Tout comme on essaye de bien segmenter le code en parties logiques, on essaiera également de ne pas transformer ses tests en grand plat de spaghettis.</p><h4><a
name="Utilisationdesprofilesmaven"></a>Utilisation des profiles maven</h4><p>L&#8217;approche recommandée est la séparation via un profil dédié et la différenciation des tests d&#8217;intégration par pattern. Le but est de définir une convention pour cataloguer ses tests d&#8217;intégration :</p><ul><li>soit sur le nom de la classe (ex : *ITest.java)</li><li>soit sur le nom du package (ex : **/integration/**)</li></ul><p><u>Exemple de séparation sur le nom de package :</u></p><p>Tout d&#8217;abord on enlève toutes les classes contenues dans un package &nbsp;&raquo; <em>integration</em> &nbsp;&raquo; des tests.</p><pre class="brush: xml; title: ; notranslate">
&lt;build&gt;
	&lt;plugins&gt;
        	&lt;plugin&gt;
			&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
			&lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
			&lt;version&gt;2.4.2&lt;/version&gt;
			&lt;configuration&gt;
				&lt;skip&gt;true&lt;/skip&gt;
			&lt;/configuration&gt;
			&lt;executions&gt;
				&lt;execution&gt;
					&lt;id&gt;surefire-test&lt;/id&gt;
					&lt;phase&gt;test&lt;/phase&gt;
					&lt;goals&gt;
						&lt;goal&gt;test&lt;/goal&gt;
					&lt;/goals&gt;
					&lt;configuration&gt;
						&lt;skip&gt;false&lt;/skip&gt;
						&lt;excludes&gt;
							&lt;exclude&gt;**/integration/**&lt;/exclude&gt;
						&lt;/excludes&gt;
					&lt;/configuration&gt;
				&lt;/execution&gt;
			&lt;/executions&gt;
        	&lt;/plugin&gt;
	&lt;/plugins&gt;
&lt;/build&gt;
</pre><p>Puis, on redéfinit la phase &nbsp;&raquo; <em>integration-test</em> &nbsp;&raquo; en lui intégrant les classes contenues dans les package &nbsp;&raquo; <em>integration</em> &laquo;&nbsp;.</p><pre class="brush: xml; title: ; notranslate">
&lt;profile&gt;
	&lt;id&gt;integration-testing&lt;/id&gt;
	&lt;build&gt;
		&lt;plugins&gt;
			&lt;plugin&gt;
				&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
				&lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
				&lt;version&gt;2.4.2&lt;/version&gt;
				&lt;configuration&gt;
					&lt;skip&gt;true&lt;/skip&gt;
				&lt;/configuration&gt;
				&lt;executions&gt;
					&lt;execution&gt;
						&lt;id&gt;surefire-itest&lt;/id&gt;
						&lt;phase&gt;integration-test&lt;/phase&gt;
						&lt;goals&gt;
							&lt;goal&gt;test&lt;/goal&gt;
						&lt;/goals&gt;
						&lt;configuration&gt;
							&lt;skip&gt;false&lt;/skip&gt;
							&lt;includes&gt;
								&lt;include&gt;**/integration/**&lt;/include&gt;
							&lt;/includes&gt;
						&lt;/configuration&gt;
					&lt;/execution&gt;
				&lt;/executions&gt;
			&lt;/plugin&gt;
		&lt;/plugins&gt;
	&lt;/build&gt;
&lt;/profile&gt;
</pre><p>Cette approche a l&#8217;avantage de garder dans un même module les tests d&#8217;intégration et le code, tout en les regroupant sous un même package. Cependant, le seul point faible de cette approche réside dans le fait que le test d&#8217;intégration ne se retrouve plus dans le même package que la classe testée. Ainsi, on ne pourra plus accéder aux variables et méthodes protected.</p><h4><a
name="Futur"></a>Futur?</h4><p>L&#8217;approche idéale dans Maven serait de séparer les tests d&#8217;intégrations de la même manière que les tests sont séparés du code. On pourrait ainsi avoir :</p><pre class="brush: java; title: ; notranslate">
+- main
  +-- java
  +-- resources
+- test
  +-- java
  +-- resources
+- it
  +-- java
  +-- resources
</pre><p>Cette possibilité est très attendue par les développeurs mais impossible avec Maven2.<br
/> Maven3 le permettra-t-il ? Pour l&#8217;instant aucune information n&#8217;a filtré à ce sujet&#8230;</p><h3><a
name="CommentfaireaveclerunnerJUnitd"></a>Comment faire avec le runner JUnit de Spring</h3><p>Spring propose une surcouche à JUnit en l&#8217;enrichissant de nouvelles fonctionnalités. Celle qui nous intéressera particulièrement est l&#8217;utilisation du runner JUnit : <a
href="http://static.springsource.org/spring/docs/2.5.6/reference/testing.html|Spring test reference" title="SpringJUnit4ClassRunner" >SpringJUnit4ClassRunner</a> en plus de l&#8217;annotation <a
href="http://static.springsource.org/spring/docs/2.5.6/reference/testing.html" title="IfProfileValue" >@IfProfileValue</a> . Celle-ci permet de catégoriser les tests. Ceux étant annotés ainsi ne seront exécutés que si une variable d&#8217;environnement équivalente au contenu de l&#8217;annotation est présente dans le classpath.</p><pre class="brush: java; title: ; notranslate">
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.annotation.IfProfileValue;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={&quot;/test-configuration.xml&quot;})
public class IntegrationTest {
	@IfProfileValue(name=&quot;test-group&quot;, value=&quot;integration&quot;)
	@Test
	public void test(){
		...
	}
}
</pre><p>De base, nos tests annotés ne sont pas exécutés. Pour qu&#8217;ils soient exécutés, il suffit de les lancer en rajoutant comme argument : <em>-Dtest-group=integration.</em></p><p><em>Si vous utilisez Eclipse et que vous souhaitez activer vos tests d&#8217;intégrations par défaut, rien de plus simple :</em></p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/01/EclipseTestConfig.png" border="0" alt="" /></div><p>En conclusion, cette solution offre l&#8217;avantage d&#8217;être assez souple et de pouvoir regrouper dans une même classe différents types de tests.</p><h3><a
name="CommentfaireavecTestNG"></a>Comment faire avec TestNG</h3><p>TestNG est un framework de tests offrant de nombreuses fonctionnalités supplémentaires par rapport à JUnit. Avec TestNG il est possible de spécifier le ou les groupes de tests concernés directement dans l&#8217;annotation @Test.</p><pre class="brush: java; title: ; notranslate">
@Test(groups = &quot;integrationTest&quot;)
public class Test {
  public foo() {}
  public bar() {}
}
</pre><p>Pour exclure des groupes de tests en utilisant TestNG, il suffit de lui rajouter l&#8217;option <em>-excludegroups=&nbsp;&raquo;xxx,yyy&nbsp;&raquo;</em>.<br
/> Si vous utilisez Maven il faut configurer <a
href="http://maven.apache.org/plugins/maven-surefire-plugin/examples/testng.html" title="Surefire" >Surefire</a> de la sorte :</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
    &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.4.2&lt;/version&gt;
    &lt;configuration&gt;
      &lt;groups&gt;integrationTest&lt;/groups&gt;
    &lt;/configuration&gt;
  &lt;/plugin&gt;
</pre><p>Cette solution est surement la plus complète et la plus souple avec les notions de groupe de groupes, groupes partiels, etc. (<a
href="http://testng.org/doc/documentation-main.html#test-groups" title="cf documentation" >cf. documentation</a>)</p><h3><a
name="EtpourJUnit"></a>Et pour JUnit?</h3><p>Attendue depuis longtemps par la communauté, JUnit propose dans sa version 4.8 une fonctionnalité expérimentale, les <a
href="http://kentbeck.github.com/junit/javadoc/4.8/org/junit/experimental/categories/package-summary.html" title="@Category" >@Category</a> (<a
href="http://java.dzone.com/articles/david-saff-talks-about-junit" title="Voir la prsentation de David Saff" >Voir la présentation de David Saff</a>) :</p><pre class="brush: java; title: ; notranslate">
public interface SlowTests {}
public class A {
   @Category(SlowTests.class)
   @Test
   public void testA(){
   }
}
@RunWith(Categories.class)
@IncludeCategory(SlowTests.class)
@SuiteClasses( { A.class})
public class SlowTestSuite {
}
</pre><p>Cette solution n&#8217;est cependant pas encore très mature. En effet, il est nécessaire de créer une interface pour chaque type de test et il faut impérativement définir manuellement la suite de tests en y ajoutant une à une les classes de tests à inclure (<a
href="http://wiki.community.objectware.no/display/smidigtonull/How+to+use+JUnit+Categories+to+implement+JigZaw" title="mme sil existe quelques astuces" >même s&#8217;il existe quelques astuces</a>). De plus, le lien avec le plugin Surefire de Maven n&#8217;existe pas encore.<br
/> Cette solution est donc une alternative à surveiller mais pas encore à utiliser.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Comme nous venons de le voir, il existe de nombreux moyens pour séparer nos différents types de tests. Attention cependant à ne pas utiliser cette technique pour masquer les test gênants. Si vous avez des soucis avec certains tests, mieux vaut s&#8217;attaquer à la source même du problème plutôt qu&#8217;à ses conséquences. De plus, cette séparation doit être une aide aux développeurs uniquement, il est primordial de demander au serveur d&#8217;intégration continue de lancer l&#8217;intégralité des tests. Ou bien de le paramétrer avec deux builds : un à la volée très rapide et un exécuté une fois par jour qui lancera l&#8217;intégralité des tests.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/01/13/comment-separer-ses-tests-dintegrations/feed/</wfw:commentRss> <slash:comments>10</slash:comments> </item> <item><title>Maven Definitive Guide FR, relecture finale</title><link>http://blog.xebia.fr/2009/12/04/maven-definitive-guide-fr-relecture-finale/</link> <comments>http://blog.xebia.fr/2009/12/04/maven-definitive-guide-fr-relecture-finale/#comments</comments> <pubDate>Fri, 04 Dec 2009 06:04:08 +0000</pubDate> <dc:creator>Erwan Alliaume</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[maven definitive guide]]></category> <category><![CDATA[Open Source]]></category> <category><![CDATA[Traduction]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3493</guid> <description><![CDATA[Les 19 chapitres de la traduction officielle du Maven Definitive Guide terminés, il est grand temps de nous lancer dans la dernière ligne droite avant la fin du projet : la relecture publique complète de la traduction. En tant que participant à ce projet, c&#8217;est avec un certain enjouement (ndlr : ouf, c&#8217;est fini !) [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://maven-definitive-guide.fr/" title="traduction francaise du Maven Definitive Guide" ><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/maven-logo.png" alt="maven-logo" title="maven-logo" style="margin: 1em 1em 1em 1em; float: right;" width="200px" /></a><br
/> Les <a
href="http://maven-definitive-guide.fr" title="19 chapitres de la traduction officielle du Maven Definitive Guide" >19 chapitres de la traduction officielle du Maven Definitive Guide</a> terminés, il est grand temps de nous lancer dans la dernière ligne droite avant la fin du projet : la <strong>relecture publique complète de la traduction</strong>. En tant que participant à ce projet, c&#8217;est avec un certain enjouement (ndlr : ouf, c&#8217;est fini !) que je relaie donc cet appel pour relire les 430 pages de ce guide. Je profite de cette occasion pour remercier les relecteurs de la première partie, et espère vous voir au moins aussi nombreux cette fois-ci. Notez que nous avons besoin de tout type de contributeur : vous lancer dans la relecture ne signifie pas forcément vous engager sur la relecture complète du livre.</p><p>Pour ceux que ça intéresserait, veuillez noter les points suivants :</p><ul><li>Les chapitres 1 à 8 (toute la première partie) ont déjà été relus <a
href="http://blog.xebia.fr/2009/09/30/traduction-du-maven-definitive-guide-premiere-relecture-publique/" title="fin septembre" >fin septembre</a>, privilégiez les suivants.</li><li>Il est préférable de nous contacter avant de vous lancer dans la relecture, nous pourrons ainsi répartir uniformément les relectures et éviter les corrections parallèles.</li><li>Privilégiez les versions <a
href="http://maven-definitive-guide.fr/site/reference/public-book.html" title="HTML" >HTML</a> ou <a
href="http://maven-definitive-guide.fr/site/pdf/maven-definitive-guide.pdf" title="PDF" >PDF</a> pour la relecture.</li></ul><p>Pour bien démarrer :</p><ul><li><a
href="http://www.maven-definitive-guide.fr/" title="Build journalier" >Build journalier</a> de la traduction ;</li><li>Sources de la traduction sur notre projet <a
href="http://wiki.github.com/ehsavoie/maven-guide-fr" title="GitHub" >GitHub</a> ;</li><li><a
href="https://github.com/signup/free" title="Créez un compte sur github" >Créez un compte sur github</a> pour pouvoir nous soumettre vos retours via l&#8217;<a
href="http://github.com/ehsavoie/maven-guide-fr/issues" title="Issue Tracker" >Issue Tracker</a> et télécharger la <a
href="http://github.com/ehsavoie/maven-guide-fr" title="version XML du docbook" >version XML du docbook</a> ;</li></ul><p>N&#8217;hésitez pas à en parler autour de vous, que ce soit à l&#8217;oral, par mail, ou sur vos blogs <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br
/> Bonnes relectures.</p><div
align="center"> <a
href="http://twitter.com/ealliaume" ><br
/> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/04/twitter4.png"  alt="twitter erwan alliaume" title="twitter erwan alliaume" border="0" /><br
/> </a></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/12/04/maven-definitive-guide-fr-relecture-finale/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Maven Definitive Guide FR &#8211; chiffrez vos mots de passe</title><link>http://blog.xebia.fr/2009/11/27/maven-definitive-guide-fr-chiffrez-vos-mots-de-passe/</link> <comments>http://blog.xebia.fr/2009/11/27/maven-definitive-guide-fr-chiffrez-vos-mots-de-passe/#comments</comments> <pubDate>Fri, 27 Nov 2009 15:52:25 +0000</pubDate> <dc:creator>Erwan Alliaume</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[chiffrage]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[maven definitive guide]]></category> <category><![CDATA[Sécurité]]></category> <category><![CDATA[Sonatype]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3399</guid> <description><![CDATA[Pour en avoir parlé fin septembre, vous savez peut-être que je participe à la traduction française du Maven Definitive Guide. Comme vous pouvez le constater, la traduction est maintenant bien avancée, nous lancerons d&#8217;ailleurs probablement très bientôt les demandes de relecture de la seconde et dernière partie (vous en serez informé sur ce blog). Je [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://maven-definitive-guide.fr/" title="traduction francaise du Maven Definitive Guide" ><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/maven-logo.png" alt="maven-logo" title="maven-logo" style="margin: 1em 1em 1em 1em; float: right;" width="200px" /></a><br
/> Pour en avoir parlé <a
href="http://blog.xebia.fr/2009/09/30/traduction-du-maven-definitive-guide-premiere-relecture-publique/" title="fin septembre" >fin septembre</a>, vous savez peut-être que je participe à la <a
href="http://maven-definitive-guide.fr/" title="traduction francaise du Maven Definitive Guide" >traduction française du Maven Definitive Guide</a>. Comme vous pouvez le constater, la traduction est maintenant bien avancée, nous lancerons d&#8217;ailleurs probablement très bientôt les demandes de relecture de la seconde et dernière partie (vous en serez informé sur ce blog).</p><p>Je profite de cette occasion pour vous en présenter un extrait en prenant l&#8217;exemple d&#8217;une fonctionnalité que je ne connaissais pas avant de m&#8217;y atteler : comment <strong>chiffrer vos mots de passe dans vos Settings Maven</strong>.</p><p>Si vous utilisez Maven pour déployer vos artefacts sur des dépôts distants ou tout autre service distant nécessitant l&#8217;utilisation de mots de passe, la meilleure solution est de stocker ces mots de passe dans vos Settings Maven. Sans un mécanisme pour chiffrer ces mots de passe, le fichier <em>~/.m2/settings.xml</em> devient rapidement une faille de sécurité, car il contient les mots de passe d&#8217;accès à vos différents serveurs en clair. Pour éviter ce problème, Maven 2.1 a introduit une fonctionnalité qui permet de chiffrer vos mots de passe. Pour ce faire, vous devez commencer par créer un mot de passe maître et stocker celui-ci dans un fichier de <em>security-settings.xml</em> à l&#8217;emplacement <em>~/.m2/settings-security.xml</em>. Vous pouvez ensuite utiliser ce dernier pour chiffrer vos autres mots de passe, ceux que vous deviez stocker en clair dans vos Settings Maven (<em>~/.m2/settings.xml</em>).</p><p>Pour illustrer cette fonctionnalité, regardons le processus utilisé par Maven pour récupérer le mot de passe non chiffré d&#8217;un serveur à partir des paramètres d&#8217;un utilisateur. Le schéma ci-dessous présente ce processus. Un utilisateur peut faire référence à un serveur en utilisant un identifiant dans le <em>POM</em> d&#8217;un projet, Maven recherche alors le serveur correspondant dans ses settings. Une fois trouvé, Maven utilisera le mot de passe associé à celui-ci. Le mot de passe est stocké en clair dans <em>~/.m2/settings.xml</em>, il est donc facilement accessible à toute personne qui dispose des droits de lecture sur ce fichier.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/settings_password-no-encryption.png" border="0" alt="" /></div><p>Maintenant, regardons comment Maven utilise des mots de passe chiffrés. Le diagramme ci-dessous présente ce processus.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/settings_password-encryption.png" border="0" alt="" /></div><p>Pour configurer la fonctionnalité de chiffrage des mots de passe, créez le mot de passe maître en exécutant l&#8217;une des commandes suivantes :</p><pre class="brush: java; title: ; notranslate">
shell&gt; mvn -emp &lt;PASSWORD&gt;
{rsB56BJcqoEHZqEZ0R1VR4TIspmODx1Ln8/PVvsgaGw=}
</pre><p>ou</p><pre class="brush: java; title: ; notranslate">
shell&gt; mvn --encrypt-master-password &lt;PASSWORD&gt;
{rsB56BJcqoEHZqEZ0R1VR4TIspmODx1Ln8/PVvsgaGw=}
</pre><p>Maven affiche alors une copie de la version chiffrée du mot de passe sur la sortie stantard. Copiez celui-ci et collez-le dans le fichier <em>~/.m2/settings-security.xml</em> comme le montre l&#8217;exemple suivant.</p><pre class="brush: java; title: ; notranslate">
&lt;settingsSecurity&gt;
  &lt;master&gt;{rsB56BJcqoEHZqEZ0R1VR4TIspmODx1Ln8/PVvsgaGw=}&lt;/master&gt;
&lt;/settingsSecurity&gt;
</pre><p>Après avoir créé le mot de passe principal, vous pouvez commencer à chiffrer vos mots de passe pour les utiliser dans vos settings. Pour chiffrer un mot de passe à l&#8217;aide du mot de passe maître, utilisez l&#8217;une des commande suivante <code>mvn -ep</code> ou <code>mvn --encrypt-password</code>.  Imaginons que vous disposez d&#8217;un gestionnaire de dépôt et que vous avez besoin d&#8217;un utilisateur &laquo;&nbsp;deployment&nbsp;&raquo; et d&#8217;un mot de passe &laquo;&nbsp;qualityFIRST&nbsp;&raquo; pour vous y connecter. Pour chiffrer ce mot de passe, utilisez la ligne de commande suivante :</p><pre class="brush: java; title: ; notranslate">
shell&gt; mvn -ep qualityFIRST
{uMrbEOEf/VQHnc0W2X49Qab75j9LSTwiM3mg2LCrOzI=}
</pre><p>Copiez ensuite le mot de passe chiffré affiché sur la sortie standard et collez-le dans vos settings Maven.</p><pre class="brush: java; title: ; notranslate">
&lt;settings&gt;
  &lt;servers&gt;
    &lt;server&gt;
      &lt;id&gt;nexus&lt;/id&gt;
      &lt;username&gt;deployment&lt;/username&gt;
      &lt;password&gt;{uMrbEOEf/VQHnc0W2X49Qab75j9LSTwiM3mg2LCrOzI=}&lt;/password&gt;
    &lt;/server&gt;
  &lt;/servers&gt;
  ...
&lt;/settings&gt;
</pre><p>Lorsque vous exécutez un build Maven qui a besoin d&#8217;interagir avec le gestionnaire de repository, Maven récupérera le mot de passe principal à partir du fichier <em>~/.m2/settings-security.xml</em> et utilisera celui-ci pour déchiffrer le mot de passe stocké dans votre fichier <em>~/.m2/settings.xml</em>. Maven utilisera ce mot de passe déchiffré pour se connecter au serveur.</p><p>Quels sont les bénéfices d&#8217;un tel mécanisme ? Il vous permet d&#8217;éviter de stocker en clair vos mots de passe dans le fichier <em>~/.m2/settings.xml</em>. Notez que cette fonctionnalité ne prévoit pas le chiffrage du mot de passe lors de l&#8217;envoi de celui-ci sur le serveur distant. Il est toujours possible, pour une personne mal intentionnée, de récupérer vos mots de passe en analysant les flux réseau.</p><p>Pour encore plus de sécurité, vous pouvez demander à vos développeurs de stocker le mot de passe maître chiffré sur un périphérique de stockage amovible comme un disque dur USB. En utilisant cette méthode, un développeur doit brancher son disque amovible sur sa station de travail lorsqu&#8217;il veut effectuer un déploiement ou une quelconque interaction avec un serveur distant. Pour cela, votre fichier <em>~/.m2/settings-security.xml</em> doit contenir une référence vers l&#8217;emplacement réel de votre fichier <em>settings-security.xml</em>. Cette configuration passe par l&#8217;utilisation de la balise <code>relocation</code>.</p><pre class="brush: java; title: ; notranslate">
&lt;settingsSecurity&gt;
  &lt;relocation&gt;/Volumes/usb-key/settings-security.xml&lt;/relocation&gt;
&lt;/settingsSecurity&gt;
</pre><p>Ainsi, le développeur peut stocker son fichier <em>settings-security.xml</em> sur son emplacement personnalisé <em>/Volumes/usb-key/settings-security.xml</em> et s&#8217;arranger pour que ce fichier ne soit  disponible que s&#8217;il est assis devant sa station de travail.</p><div
align="center"> <a
href="http://twitter.com/ealliaume" ><br
/> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/04/twitter4.png"  alt="twitter erwan alliaume" title="twitter erwan alliaume" border="0" /><br
/> </a></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/27/maven-definitive-guide-fr-chiffrez-vos-mots-de-passe/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Devoxx &#8211; Jour 4 &#8211; Maven Reloaded</title><link>http://blog.xebia.fr/2009/11/27/devoxx-jour-4-maven-reloaded/</link> <comments>http://blog.xebia.fr/2009/11/27/devoxx-jour-4-maven-reloaded/#comments</comments> <pubDate>Fri, 27 Nov 2009 12:47:03 +0000</pubDate> <dc:creator>Michaël Figuière</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Maven 3.0]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3383</guid> <description><![CDATA[Jason van Zyl, le leader emblématique du projet Maven, était présent à Devoxx pour présenter les nouveautés à venir dans l&#8217;environnement Maven : Maven 3.0 et 3.1, finalisation de M2Eclipse, améliorations à venir sur Nexus ; le contenu était dense. Il commence sa présentation en s&#8217;excusant pour la version 1.0 de Maven qui relevait de [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/jason-van-zyl.jpg" border="0" alt="" style="margin: 1em 1em 1em 1em; float: right;" /></p><p>Jason van Zyl, le <em>leader</em> emblématique du projet Maven, était présent à Devoxx pour présenter les nouveautés à venir dans l&#8217;environnement Maven : Maven 3.0 et 3.1, finalisation de M2Eclipse, améliorations à venir sur Nexus ; le contenu était dense.</p><p>Il commence sa présentation en s&#8217;excusant pour la version 1.0 de Maven qui relevait de l&#8217;expérimentation et n&#8217;était pas destinée à une telle diffusion. La version 2.0 présentait quant à elle de nombreux défauts, il le reconnaît également. Il promet alors un outil mature et abouti avec Maven 3.0.</p><p>Le projet a stagné pendant plusieurs années ne laissant la place à aucune amélioration majeure. La complexité du code source de Maven, basé sur Plexus, un conteneur d&#8217;injection de dépendances qui lui est propre, en est pour partie la raison. Jason van Zyl explique ainsi que peu de développeurs contribuent au <em>core</em> du projet, en comparaison de la large communauté travaillant sur des <em>plugins</em>.</p><p>Cette stagnation liée aux défauts de Maven 2.0 a conduit à la création de nombreux projets alternatifs qui gagnent en popularité : <a
href="http://ant.apache.org/ivy/" title="Ivy" >Ivy</a>, <a
href="http://www.gradle.org/" title="Gradle" >Gradle</a>, <a
href="http://buildr.apache.org/" title="Buildr" >Buildr</a>, &#8230; A ce sujet, le <em>leader</em> du projet Maven voit cette concurrence comme bénéfique mais insiste sur le besoin de conserver une compatibilité entre les artefacts produits par l&#8217;ensemble de ces outils.</p><h3><a
name="QuefaitSonatype"></a>Que fait Sonatype ?</h3><p><a
href="http://www.sonatype.com/" title="Sonatype" >Sonatype</a> a été créé il y a plusieurs années par Jason van Zyl. Au-delà de Maven, l&#8217;entreprise contribue à de nombreux projets :</p><ul><li><a
href="http://m2eclipse.sonatype.org/" title="M2Eclipse" >M2Eclipse</a> : le principal <em>plugin</em> Maven pour Eclipse, son concurrent direct <a
href="http://www.eclipse.org/iam/" title="Eclipse IAM" >Eclipse IAM</a> étant encore au stade embryonnaire</li><li><a
href="http://nexus.sonatype.org/" title="Nexus" >Nexus</a> : un <em>repository</em> Maven</li><li><a
href="https://hudson.dev.java.net/" title="Hudson" >Hudson</a> : un serveur d&#8217;intégration continue très populaire</li><li><a
href="http://docs.codehaus.org/display/M2ECLIPSE/Tycho+project+overview" title="Tycho" >Tycho</a> : un plugin Maven pour le développement Eclipse et OSGi</li><li><a
href="http://flexmojos.sonatype.org/" title="Flexmojos" >Flexmojos</a> : un ensemble de plugins Maven pour le développement Flex</li><li><a
href="http://www.ops4j.org/projects/pax/construct/maven-pax-plugin/" title="Pax" >Pax</a> : un plugin Maven pour OSGi</li><li><a
href="http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html" title="Mavenbundleplugin" >Maven-bundle-plugin</a> : un plugin Maven facilitant la création de bundle OSGi</li></ul><h3><a
name="Mavenpolyglotteetplusperforman"></a>Maven 3.0 : polyglotte et plus performant</h3><p>Comme expliqué en introduction, cette nouvelle version constituera une évolution importante pour Maven. Jason van Zyl annonce une <strong>finalisation autour de fin janvier 2010</strong>.</p><h4><a
name="Compatibilitascendante"></a>Compatibilité ascendante</h4><p>Du fait de la très vaste utilisation de Maven, la compatibilité ascendante est incontournable.</p><p>Ainsi, Jason van Zyl explique que de nombreux tests d&#8217;intégration ont été réalisés afin d&#8217;assurer que l&#8217;ensemble des projets Maven 2.0 seront entièrement compatibles avec Maven 3.0. La majorité des <em>plugins</em> seront compatibles sans réécriture. Toutefois, certaines modifications d&#8217;API introduites dans Maven 3.0 ne pourront être compensées par les mécanismes de compatibilité mis en place.</p><p>Dans la pratique, on peut donc s&#8217;attendre à une phase de démarrage pendant laquelle chacune des équipes qui maintiennent des <em>plugins</em> devront assurrer leur compatibilité avec Maven 3.0.</p><h4><a
name="Amliorations"></a>Améliorations</h4><p><strong>Exécution <em>multi-threadée</em></strong></p><p>Peu avant Devoxx, Jason van Zyl <a
href="http://www.sonatype.com/people/2009/11/maven-3x-community-participation-multi-threaded-execution/" title="annonait sur le blog de Sonatype" >annonçait sur le blog de Sonatype</a> que les simplifications d&#8217;architecture apportées par Maven 3.0 avaient permis de mettre en œuvre une amélioration espérée depuis longtemps : l&#8217;exécution du <em>build</em> sur plusieurs <em>threads</em>.</p><p>Dans un contexte où la construction d&#8217;un projet d&#8217;entreprise avec Maven peut très souvent prendre plusieurs minutes, cette amélioration pourra justifier à elle seule la migration vers Maven 3.0.</p><p><strong>Composition de POM avec les <em>mixins</em></strong></p><p>Les <a
href="http://fr.wikipedia.org/wiki/Mixin" title="mixins" >mixins</a> seront introduit dans Maven 3.0. Ils permettront de créer des POM par composition, chaque fragment importé peut ainsi être déployé en tant qu&#8217;artefact. L&#8217;héritage multiple que les <em>mixins</em> constituent <a
href="http://www.sonatype.com/people/2008/11/maven-project-model/" title="sera linarise en interne" >sera linéarisée en interne</a> afin de retrouver une chaine d&#8217;héritage simple.</p><p><strong>Simplification de l&#8217;intégration</strong></p><p>Une meilleure intégration à M2Eclipse permettra des <em>builds</em> incrémentaux évitant ainsi de ré-exécuter l&#8217;ensemble du cycle de vie à chaque fois. Maven 3.0 offrira également des points d&#8217;extension pour le cycle de vie. Il sera ainsi possible de définir des actions à exécuter avant et après l&#8217;ensemble du cycle de vie. Enfin, Maven sera plus facilement intégré dans les IDEs ou dans les serveurs d&#8217;intégration continue, en permettant un meilleur contrôle de son comportement par son hôte.</p><h4><a
name="PolyglotMaven"></a>Polyglot Maven</h4><p>Il sera possible d&#8217;écrire les POMs dans un autre langage que XML. La structure de données restera identique, mais il sera possible d&#8217;utiliser la syntaxe de Groovy, Ruby, Scala, Python ou YAML. Il sera possible de transformer les POMs d&#8217;une représentation à l&#8217;autre ce qui permettra d&#8217;assurer la compatibilité au niveau du <em>repository</em> en y déployant toujours un POM en XML. Dès lors, le choix de la représentation dépendra des préférences des développeurs.</p><p>L&#8217;exemple ci-dessous montre un POM simple représenté en Groovy :</p><pre class="brush: java; title: ; notranslate">
project {
    modelVersion '4.0.0'
    parent {
        artifactId 'xebia-parent'
        groupId 'fr.xebia'
        version '1.0.0-SNAPSHOT'
    }
    artifactId 'xebia-polyglotmaven-test'
    version '1.0.0-SNAPSHOT'
    name 'Polyglot Maven Test'
    url 'http://blog.xebia.fr'
    build {
        testResources {
            testResource {
                filtering 'true'
                directory 'src/test/resources'
            }
        }
    }
    dependencies {
        dependency {
            groupId 'junit'
            artifactId 'junit'
            version '4.7'
            scope 'test'
        }
    }
}
</pre><p>Polyglot Maven <a
href="http://www.sonatype.com/people/2009/11/maven-3x-paving-the-desire-lines-part-two/" title="ne sera pas en standard dans Maven 30" >ne sera pas en standard dans Maven 3.0</a>, il s&#8217;agira d&#8217;une extension.</p><h4><a
name="MavenShell"></a>Maven Shell</h4><p>Le Maven Shell est une extension pour le moins inattendue mais qui s&#8217;est montrée convaincante. Il s&#8217;agit d&#8217;un environnement d&#8217;exécution pour Maven qui, dans sa version interactive, permet à l&#8217;utilisateur de saisir ses commandes Maven comme dans le <em>shell</em> natif de son système d&#8217;exploitation. Tout l&#8217;intérêt est alors le gain de performance qu&#8217;il est possible de réaliser grâce à la conservation en cache des données du <em>reactor</em> Maven entre chaque exécution.</p><p>Démonstration de Jason van Zyl: une première exécution du <em>build</em> en 14 secondes, il relance alors la même commande une seconde fois en seulement 7 secondes.</p><p>Maven Shell offre également un environnement interactif avec des nombreuses commandes supplémentaires, simplifiant les tâches Maven courantes. Il pourra être intégré à Hudson et à Nexus pour faire bénéficier à ces serveurs de fonctionnalités Maven plus puissantes.</p><h3><a
name="MavenlarrivedeGuice"></a>Maven 3.1 : l&#8217;arrivée de Guice</h3><p>Plexus, le conteneur d&#8217;injection de dépendance historique de Maven, sera remplacé par <a
href="http://code.google.com/p/google-guice/" title="Guice" >Guice</a> dans Maven 3.1. Cette simple décision aura pour conséquence de simplifier la lisibilité du code source, le développement des plugins, et donc d&#8217;élargir la communauté de développeurs travaillant sur le projet. Jason van Zyl explique vouloir se baser au maximum sur la <a
href="http://www.jcp.org/en/jsr/detail?id=330" title="JSR 330 (Dependency Injection for Java)" >JSR 330 (Dependency Injection for Java)</a>.</p><p><a
href="http://code.google.com/p/peaberry/" title="Peaberry" >Peaberry</a>, l&#8217;extension OSGi de Guice, sera également utilisée, ce qui apportera à Maven une modularité standardisée pour ses plugins.</p><p>Là où l&#8217;ensemble des nouveautés introduites par Maven 3.0 permettent la compatibilité ascendante, Maven 3.1 sera plus audacieux. Ainsi, on peut s&#8217;attendre à une évolution plus importante du modèle de projet (POM). La compatibilité au niveau du <em>repository</em> continuera d&#8217;être assurée avec les clients Maven 2.0.</p><p>Afin de pouvoir continuer à capitaliser sur la masse importante de code réalisé pour Plexus, une extension pour Guice a été développée pour assurer l&#8217;intégration des composants Plexus historiques dans le conteneur Guice.</p><p>Aucune date n&#8217;est pour le moment indiquée pour cette version 3.1.</p><h3><a
name="MEclipseetNexus"></a>M2Eclipse et Nexus</h3><p>M2Eclipse, le plugin Eclipse qui apporte le support de Maven à Eclipse, sort de sa gestation et va bientôt être finalisé. Jason van Zyl assure que les nombreux problèmes de stabilité et de comportement avec les gros projets Maven sont corrigés. L&#8217;intégration plus poussée à l&#8217;IDE que permettra Maven 3.0 devrait elle aussi améliorer l&#8217;ergonomie de ce plugin.</p><p>Nexus, pour sa part, va lui aussi abandonner Plexus au profit de Guice et Peaberry. Cette migration interviendra d&#8217;ailleurs en premier sur Nexus, Maven 3.1 suivra.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Maven est en général un sujet sulfureux dans la communauté Java. Son <em>leader</em>, Jason van Zyl, ne fait lui même pas l&#8217;unanimité et <a
href="http://www.touilleur-express.fr/2009/11/19/devoxx-2009-resume-de-la-journee-de-jeudi/" title="sa prsentation a t diversement apprcie" >sa présentation a été diversement appréciée</a>.</p><p>Malgré tout, il faut bien reconnaître que les chantiers engagés sur Maven sont cette fois bien réels. Les démonstrations faites se sont montrées convaincantes, même si seule la mise en œuvre pratique permettra de juger de cette nouvelle version.</p><p>On regrettera tout de même le peu d&#8217;information actuellement disponible sur Maven 3 en dehors de quelques billets sur le blog de Sonatype.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/27/devoxx-jour-4-maven-reloaded/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2009/10/12/revue-de-presse-xebia-129/</link> <comments>http://blog.xebia.fr/2009/10/12/revue-de-presse-xebia-129/#comments</comments> <pubDate>Mon, 12 Oct 2009 16:41:35 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Adobe]]></category> <category><![CDATA[AIR]]></category> <category><![CDATA[DHTMLX]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[jdk-6]]></category> <category><![CDATA[jdk-7]]></category> <category><![CDATA[Jetty]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[Servlet 3.0]]></category> <category><![CDATA[Sonar]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2984</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII La fondation Eclipse se prépare à Servlet 3.0 avec Jetty 7.0 Sonar 1.11 RIA Air &#8216;Athena&#8217; DHTMLX 2.5 Tips and Tricks Maven 2 Le coin de la technique Sécurité : 5 choses de plus que les agresseurs d&#8217;applications web ne [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/10/12/revue-de-presse-xebia-129/#LafondationEclipseseprpareServ">La fondation Eclipse se prépare à Servlet 3.0 avec Jetty 7.0</a></li><li><a
href="http://blog.xebia.fr/2009/10/12/revue-de-presse-xebia-129/#Sonar">Sonar 1.11</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/10/12/revue-de-presse-xebia-129/#AirAthena">Air &#8216;Athena&#8217;</a></li><li><a
href="http://blog.xebia.fr/2009/10/12/revue-de-presse-xebia-129/#DHTMLX">DHTMLX 2.5</a></li><li><a
href="http://blog.xebia.fr/2009/10/12/revue-de-presse-xebia-129/#TipsandTricksMaven">Tips and Tricks Maven 2</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/10/12/revue-de-presse-xebia-129/#Scuritchosesdeplusquelesagress">Sécurité : 5 choses de plus que les agresseurs d&#8217;applications web ne vous diront pas</a></li><li><a
href="http://blog.xebia.fr/2009/10/12/revue-de-presse-xebia-129/#LesoptimisationsduJDKuactivesp">Les optimisations du JDK 6u14 activées par défaut sur le JDK 7</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="LafondationEclipseseprpareServ"></a>La fondation Eclipse se prépare à Servlet 3.0 avec Jetty 7.0</h4><p>La fondation Eclipse nous livre une nouvelle version de Jetty estampillée 7.0. Côté nouveauté, pas grand chose à vrai dire. Il y a évidemment l&#8217;habituelle série de corrections de bugs et d&#8217;améliorations de performance. Cette nouvelle version marque surtout le début de la route vers l&#8217;implémentation des servlets 3.0 prévue pour Jetty 8.0. C&#8217;est aussi l&#8217;occasion pour Eclipse d&#8217;assimiler un peu plus le projet en changeant principalement le <em>package</em> ancêtre de <code>org.mortbay</code> vers <code>org.eclipse</code>, gare au <em>refactoring</em> donc. A noter tout de même, Jetty est maintenant livré sous une forme modulaire pleinement compatible OSGI. Webtide en profite pour livrer la même version de Jetty, en y intégrant des modules additionnels:</p><ul><li>JSP de glassfish</li><li>JTA d&#8217;atomikos</li><li>plugin maven</li><li>integration d&#8217;ant</li><li>configuration Spring</li></ul><p>Jetty 6 sera encore maintenu pendant quelques temps (aucune précision de la part d&#8217;Eclipse), tous les nouveaux développements seront faits sur Jetty 7, et la branche 8 sera en pré-release dans les prochains mois et supportera l&#8217;API Servlet 3.0.</p><ul><li><a
href="http://dev.eclipse.org/mhonarc/lists/jetty-dev/msg00294.html" title="Lannonce sur la ML" >L&#8217;annonce sur la ML</a></li><li><a
href="http://www.infoq.com/news/2009/10/jetty-7-0-released" title="La news dInfoQ" >La news d&#8217;InfoQ</a></li><li><a
href="http://www.eclipse.org/jetty/" title="La page Jetty chez Eclipse" >La page Jetty chez Eclipse</a></li><li><a
href="http://jetty.mortbay.org/jetty/index.html" title="La page Jetty chez Codehaus" >La page Jetty chez Codehaus</a></li></ul><h4><a
name="Sonar"></a>Sonar 1.11</h4><p>SonarSource nous gratifie d&#8217;une version 1.11 du désormais célèbre outil de suivi de qualité Sonar. Comme souvent, de nombreux de <em>bugs</em> ont été corrigés. Parmi les améliorations, on peut noter les passages à Hibernate 3.3 et GWT 1.7. Au chapitre des nouvelles fonctionnalités, la possibilité de réutiliser les fichiers de configuration PMD et CheckStyle définis dans le <em>pom</em> permettra de plus aisément éviter les doublons.</p><p>SonarSource tente de faciliter la vie des développeurs de <em>plugins</em> avec l&#8217;apparition d&#8217;un archétype Maven pour créer des <em>plugins</em> Sonar. D&#8217;autres nouveautés d&#8217;API, comme le filtrage de widgets suivant différents critères (comme le rôle utilisateur ou la langue choisie), ajoutent de la flexibilité.</p><ul><li><a
href="http://sonar.codehaus.org/sonar-111-in-screenshots/" title="Lannonce sur le blog Sonar" >L&#8217;annonce sur le blog Sonar</a> avec plein de jolies images.</li><li><a
href="http://sonar.codehaus.org/downloads/" title="La release note" >La release note</a>.</li></ul><h3><a
name="RIA"></a>RIA</h3><h4><a
name="AirAthena"></a>Air &#8216;Athena&#8217;</h4><p>Non, ce n&#8217;est pas une nouvelle marque de baskets, mais, comme les flexeurs le savent depuis le Flash Camp de mai, le nom de code de la future version de Adobe Air, la version 2.0. Comme on s&#8217;y attendait, celle-ci fonctionnera avec Flash 10 et Flex 4. Même si aucune date officielle n&#8217;a été avancée, Adobe dévoile peu à peu les principales évolutions de sa plate-forme, <a
href="http://www.insideria.com/2009/10/air-2-enhancements-complete-ov.html" title="nouveauts rpertories par Elad Elrom sur InsideRIA" >nouveautés répertoriées par Elad Elrom sur InsideRIA</a>.<br
/> Commençons par celle qui nous semble vitale dans l&#8217;adoption de AIR / Flex à grande échelle, à savoir une amélioration drastique des performances. Les équipes d&#8217;Adobe ont mis l&#8217;accent sur la réduction des ressources (CPU et mémoire) consommées par le runtime AIR. Les tests effectués sur une mini application montrent en effet une diminution des ressources utilisées (en regard de la version 1.5). Reste à tester ces optimisations sur une application gourmande&#8230; Toujours au chapitre performance, Adobe promet une optimisation de Webkit (le browser open source embarqué par AIR) et une installation Linux native.<br
/> Au menu des nouveautés, nous avons :</p><ul><li>Une meilleure connaissance de la plate-forme matérielle, avec la gestion des devices multi-touch et la gestion des périphériques de stockage USB ou réseau &#8216;à chaud&#8217;.</li><li>Un enrichissement des fonctionnalités des APIs existantes : points de sauvegarde dans les transactions, support IPv6, augmentation de la taille maximale de la fenêtre AIR, manipulation des données de l&#8217;API Microphone, time-out d&#8217;inactivité&#8230;</li><li>De nouvelles fonctionnalités via de nouvelles API, dont la plus étonnante est l&#8217;API File promises. Celle-ci permet de télécharger en local, depuis une application AIR, un ensemble de fichiers par simple Drag &#038; Drop. D&#8217;autres API font également leur apparition, en particulier au niveau du support réseau et de l&#8217;adhérence de AIR à l&#8217;OS (les fichiers peuvent maintenant être ouverts par des processus natifs de l&#8217;OS, par exemple Notepad pour un .txt sous Windows).</li></ul><p>Une évolution assez naturelle donc (correction des gros points de blocage des versions précédentes), mais quelques promesses de fonctionnalités intéressantes, en particulier via <em>l&#8217;adhérence</em> à l&#8217;OS.</p><h4><a
name="DHTMLX"></a>DHTMLX 2.5</h4><p>Des nouvelles de <a
href=" http://dhtmlx.com/" title="DTHMLX" >DTHMLX</a> (la 11ème librairie de notre <a
href="http://blog.xebia.fr/2009/01/26/revue-de-presse-xebia-93/#belleslibrairiesWebUI" title="revue de presse de fin janvier dernier" >revue de presse de fin janvier dernier</a>) qui est sorti il y a quelques semaines en <a
href="http://dhtmlx.com/docs/news/index.shtml?show=44" title="version 25" >version 2.5</a>.</p><p>Cette release apporte plusieurs corrections et améliorations sur tous les composants de la suite. On retiendra plus particulièrement :</p><ul><li>Une API orientée objet (l&#8217;API fonctionnelle est toujours disponible) ,</li><li>Nouvelle skin par défaut avec d&#8217;ici peu (mais non présent dans cette release) un <em>Skin Customizer</em> qui permettra de modifier facilement les couleurs principales du thème standard,</li><li>Nouveau moteur de rendu qui améliore la performance d&#8217;affichage des composants <code>Layout</code>, <code>Windows</code>, <code>Accordion</code> et <code>Tabbar</code>,</li><li>Une API de conteneurs unifiée (toujours pour les <code>Layout</code>, <code>Windows</code>, <code>Accordion</code> et <code>Tabbar</code>),</li><li>Améliorations générales pour les composants <code>Grid</code>, <code>Tree</code> et <code>TreeGrid</code>,</li><li>Révision complète du <a
href="http://www.dhtmlx.com/docs/products/docsExplorer/" title="DocsExplorer" >DocsExplorer</a>.</li></ul><p>Puisque nous sommes sur DHTMLX, notons aussi le composant <a
href="http://www.dhtmlx.com/docs//products/dhtmlxScheduler/index.shtml" title="Scheduler v20" >Scheduler v.2.0</a>, sorti en juillet dernier, qui n&#8217;est pas inclus dans la suite mais qui vaut tout de même le détour si vous avez besoin d&#8217;un composant calendrier haut niveau.</p><p>Les téléchargements se passent par <a
href="http://www.dhtmlx.com/docs/download.shtml" title="ici" >ici</a> et comme d&#8217;habitude vous aurez le choix entre le téléchargement composant par composant ou le téléchargement de la suite complète.<br
/> Chaque composant existe en édition standard ou professionnelle. Pour résumer la version standard contient moins de fonctionnalités et est sous licence GPL alors que la professionnelle contient toutes les fonctionnalités, un support prioritaire en cas de bugs/questions sur le forum et plusieurs centaines d&#8217;exemples de fonctionnalités avancées.<br
/> Pour le détail des licences et des différents prix proposés pour les composants et pour la suite complète, cela se passe sur cette <a
href="http://www.dhtmlx.com/docs/products/licenses.shtml" title="page" >page</a>.</p><h4><a
name="TipsandTricksMaven"></a>Tips and Tricks Maven 2</h4><p>Sonatype nous présente <a
href="http://www.sonatype.com/people/2009/10/maven-tips-and-tricks-advanced-reactor-options/" title="ici" >ici</a> quelques nouveautés intéressantes de maven disponibles depuis la version 2.1 concernant les projets multi-modules. Cela se traduit par de nouvelles commandes disponibles telles que:</p><ul><li><code>-rf</code>, <code>-resume-from</code>: permet de spécifier au maven reactor le projet à partir duquel on veut reprendre le build</li><li><code>-pl</code>, <code>-projects</code>: permet de sélectionner une liste de modules d&#8217;un projet multi-modules</li><li><code>-am</code>, <code>-also-make</code>: combinée avec l&#8217;option <code>-pl</code>, elle permet de construire tous les modules dépendants du module passé à l&#8217;option <code>pl</code></li><li><code>-amd</code>, <code>-also-make-dependents</code>: combinée avec l&#8217;option <code>-pl</code>, elle permet de construire tous les modules qui ont une dépendance vers le module passé à l&#8217;option <code>pl</code></li></ul><p>Très bonne nouvelle donc pour les développeurs dont le build prenait beaucoup de temps à cause de la reconstruction de modules non modifiés (et non impactés) par leurs nouveaux développements.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="Scuritchosesdeplusquelesagress"></a>Sécurité : 5 choses de plus que les agresseurs d&#8217;applications web ne vous diront pas</h4><p>Le Denim Group continue sa série <a
href="http://denimgroup.typepad.com/denim_group/2009/09/13-things-a-web-application-attacker-wont-tell-you.html" title="13 Things a Web Applications Attacker Won't Tell You" >13 Things a Web Applications Attacker Won&#8217;t Tell You</a> que nous avions <a
href="http://blog.xebia.fr/2009/10/05/revue-de-presse-xebia-128/#Scuritchosesquelesagresseursda" title="traitée la semaine dernière" >traitée la semaine dernière</a> avec <a
href="http://denimgroup.typepad.com/denim_group/2009/10/5-more-things-a-web-application-attacker-wont-tell-you.html" title="5 nouvelles failles de scurit" >5 nouvelles failles de sécurité</a> de nos applications web :</p><ul><li>Ce n&#8217;est pas parce que vous utilisez un framework de sécurité que votre application est sécurisée.</li><li>Je n&#8217;utilise pas un browser pour attaquer votre application web.</li><li>J&#8217;adore quand votre site me permet d&#8217;<em>uploader</em> des fichiers dans l&#8217;arborescence des répertoires servis par l&#8217;application web.</li><li>Je peux intercepter et voler toutes les informations qui passent sur HTTP si elles ne sont pas protégées par SSL ou un mécanisme équivalent.</li><li>Une sécurité obscurantiste n&#8217;en est pas une (ne pas savoir faire ou se dire que ca n&#8217;arrivera pas ne protège pas).</li></ul><p>Si le dernier point est un débat éternel chez les experts de la sécurité les premiers sont en revanche communément admis.</p><h4><a
name="LesoptimisationsduJDKuactivesp"></a>Les optimisations du JDK 6u14 activées par défaut sur le JDK 7</h4><p>Rémi Forax, un contributeur sur <a
href="http://openjdk.java.net/" title="OpenJDK" >OpenJDK</a> et sur la <a
href="http://jcp.org/en/jsr/detail?id=292" title="JSR-292" >JSR-292</a>, <a
href="http://weblogs.java.net/blog/forax/archive/2009/10/06/jdk7-do-escape-analysis-default" title="a fait part de son étonnement" >a fait part de son étonnement</a> en constatant un gain significatif de performance entre deux <em>builds</em> successifs de l&#8217;OpenJDK 7 actuellement en cours de développement. C&#8217;est ainsi qu&#8217;il a pu se rendre compte que deux optimisations majeures du compilateur JIT de la JVM étaient activées par défaut <a
href="http://download.java.net/jdk7/changes/jdk7-b72.html" title="depuis le build 72" >depuis le <em>build</em> 72</a> du projet : l&#8217;<em>escape analysis</em> et la compression de pointeurs. Celles-ci étaient apparues dans le JDK 6u14 mais n&#8217;y étaient pas activées par défaut.</p><p>Pour rappel l&#8217;<em>escape analysis</em> consiste en l&#8217;analyse du bytecode d&#8217;une méthode pour découvrir les références vers les objets qui ne &laquo;&nbsp;s&#8217;échappent&nbsp;&raquo; pas du contexte de la méthode. Grâce à cette analyse, la JVM peut alors décider d&#8217;allouer ces objets directement sur la <em>stack</em> plutôt qu&#8217;en <em>heap</em> comme c&#8217;est normalement le cas. Il en résulte un gain de performance évident puisque le coût d&#8217;allocation et de libération de mémoire est alors supprimé pour ces objets.</p><p>La <a
href="http://wikis.sun.com/display/HotSpotInternals/CompressedOops" title="compression de pointeurs" >compression de pointeurs</a>, quant à elle, concerne uniquement les JVM 64 bits. En effet le passage d&#8217;un adressage de 32 à 64 bits entraîne une consommation plus élevée de la mémoire du fait de l&#8217;augmentation de la taille des pointeurs, induisant elle-même des temps de chargement plus longs et une surconsommation du cache du processeur. Pour palier ce problème, la compression de pointeurs se base sur le fait que la JVM aligne l&#8217;adresse des objets sur 64 bits (ceci afin de simplifier et donc d&#8217;accélérer leur accès en mémoire), pour procéder à un <em>scaling</em> des pointeurs. Ainsi, en limitant l&#8217;espace mémoire adressable à 32 Go, il est possible de contenir un pointeur dans 32 bits et donc de revenir à une consommation mémoire proche de celle d&#8217;une JVM 32 bits.</p><p>L&#8217;activation par défaut de ces deux optimisations sur le JDK 7 montre que l&#8217;équipe du projet estime désormais qu&#8217;elles ne sont plus expérimentales et qu&#8217;elles conviennent dans la majorité des cas. Ismael Juma <a
href="http://weblogs.java.net/blog/forax/archive/2009/10/06/jdk7-do-escape-analysis-default#comment-10698" title="prcise" >précise</a> par ailleurs qu&#8217;il est possible que ces activations par défaut soient reportées également au JDK 6 courant 2010.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/10/12/revue-de-presse-xebia-129/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Lumière sur JTestR</title><link>http://blog.xebia.fr/2009/10/02/lumiere-sur-jtestr/</link> <comments>http://blog.xebia.fr/2009/10/02/lumiere-sur-jtestr/#comments</comments> <pubDate>Fri, 02 Oct 2009 12:09:59 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Tests]]></category> <category><![CDATA[JRuby]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[TDD]]></category> <category><![CDATA[Tests unitaires]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2947</guid> <description><![CDATA[Parmi les tâches incontournables de la vie d&#8217;un développeur, il y a l&#8217;écriture des tests unitaires. De nombreux outils tentent de nous faciliter la vie sur ce point. Aujourd&#8217;hui, je vais vous parler de JTestR, un framework de tests unitaires qui apporte la puissance et la rapidité d&#8217;écriture du scripting Ruby pour tester des applications [...]]]></description> <content:encoded><![CDATA[<p>Parmi les tâches incontournables de la vie d&#8217;un développeur, il y a l&#8217;écriture des tests unitaires. De nombreux outils tentent de nous faciliter la vie sur ce point. Aujourd&#8217;hui, je vais vous parler de <a
href="http://jtestr.codehaus.org/">JTestR</a>, un framework de tests unitaires qui apporte la puissance et la rapidité d&#8217;écriture du scripting <a
href="http://www.ruby-lang.org/fr/">Ruby</a> pour tester des applications Java. Lancé par Ola Bini, un contributeur incontournable du projet JRuby, JTestR est directement intégrable avec Ant, <a
href="http://buildr.apache.org/" title="Buildr" >Buildr</a> et Maven 2. Ce projet n&#8217;est pas encore très répandu, mais il apporte des avantages qui méritent d&#8217;être étudiés.</p><h3><a
name="Tourdhorizon"></a>Tour d&#8217;horizon</h3><p>JTestR est un ensemble de librairies Ruby dédiées aux tests, alliées à JRuby pour permettre un démarrage rapide et sans douleur de l&#8217;écriture des tests. L&#8217;un des atouts principaux du scripting est la rapidité d&#8217;écriture, et Ruby est un langage de scripting devenu très populaire ces dernières années, notamment grâce à <a
href="http://rubyonrails.org/" title="Ruby on Rails" >Ruby on Rails</a>. Les tests unitaires et d&#8217;intégration font partie intégrante du monde Ruby et plusieurs outils ont vu le jour pour les faciliter. JTestR embarque les librairies de test Ruby suivantes :</p><ul><li><strong> <a
href="http://en.wikibooks.org/wiki/Ruby_Programming/Unit_testing" title="TestUnit" >Test/Unit</a></strong></li><li><strong> <a
href="http://rspec.info/" title="RSpec" >RSpec</a></strong></li><li><strong> <a
href="http://expectations.rubyforge.org/" title="Expectations" >Expectations</a></strong></li><li><strong> <a
href="http://dust.rubyforge.org/" title="Dust" >Dust</a></strong></li><li><strong> <a
href="http://mocha.rubyforge.org/" title="Mocha" >Mocha</a></strong></li></ul><p>En tant qu&#8217;outil Java, il permet également des interactions avec les frameworks :</p><ul><li><strong> <a
href="http://www.junit.org/" title="JUnit" >JUnit</a></strong></li><li><strong> <a
href="http://testng.org" title="TestNG" >TestNG</a></strong></li></ul><p>Dans sa dernière version, JTestR nécessite l&#8217;utilisation de Java 1.6.</p><h3><a
name="Intgration"></a>Intégration</h3><p>Livré sous la forme d&#8217;un jar avec une tâche Ant, il est facilement intégrable dans un projet existant. Une fois le jar disponible dans votre classpath, il suffit d&#8217;ajouter une balise <code>taskdef</code> à votre build.xml pour plus de confort et le tour est joué:</p><pre class="brush: xml; title: ; notranslate">
&lt;target name=&quot;test&quot; description=&quot;Runs all tests with default configuration of JTestR&quot;&gt;
  &lt;taskdef name=&quot;jtestr&quot; classname=&quot;org.jtestr.ant.JtestRAntRunner&quot; classpath=&quot;lib/jtestr.jar&quot;/&gt;
  &lt;jtestr/&gt;
&lt;/target&gt;
</pre><p>Pour les projets Maven, une modification mineure du pom.xml fera l&#8217;affaire :</p><pre class="brush: xml; title: ; notranslate">
&lt;!-- dans la section plugins --&gt;
  &lt;plugin&gt;
    &lt;groupId&gt;org.jtestr&lt;/groupId&gt;
    &lt;artifactId&gt;jtestr&lt;/artifactId&gt;
    &lt;version&gt;0.4.0&lt;/version&gt;
    &lt;configuration&gt;
      &lt;tests&gt;src/test/ruby&lt;/tests&gt;
    &lt;/configuration&gt;
    &lt;executions&gt;
      &lt;execution&gt;
        &lt;goals&gt;
          &lt;goal&gt;test&lt;/goal&gt;
        &lt;/goals&gt;
      &lt;/execution&gt;
    &lt;/executions&gt;
  &lt;/plugin&gt;
</pre><p>La directive de configuration <code>tests</code> permet de spécifier le répertoire dans lequel chercher les scripts de tests. Pour conserver l&#8217;esprit Maven, je vous conseille de créer un répertoire <code>src/test/ruby</code> et d&#8217;y placer tous les tests. La hiérarchie en sous répertoires pour représenter les packages des classes à tester ne pose pas de soucis.</p><h3><a
name="Rdactiondestests"></a>Rédaction des tests</h3><p>JTestR offre plusieurs possibilités pour la rédaction des tests. Tout d&#8217;abord, l&#8217;utilisation du framework de tests académiques de Ruby :<code>Test::Unit</code>. Cela n&#8217;apporte pas de grande nouveauté par rapport aux classiques tests JUnit. Le couteau suisse de méthode <code>assert</code> est disponible de la même façon.</p><p>Exemple de Test::Unit</p><pre class="brush: ruby; title: ; notranslate">
class HashMapTests &lt; Test::Unit::TestCase
  def setup
    @map = java.util.HashMap.new
  end
  def test_that_map_is_empty
    assert @map.isEmpty
  end
  def test_that_it_returns_a_keyset_that_returns_an_iterator_that_throws_exception
    assert_raises(java.util.NoSuchElementException) do
      @map.key_set.iterator.next
    end
  end
end
</pre><p>Mais il est également possible d&#8217;utiliser <a
href="http://rspec.info/">RSpec</a>. Ce framework de tests est orienté &laquo;&nbsp;spécification&nbsp;&raquo; et propose une notation originale qui tend à rapprocher la rédaction des tests de la spécification du comportement attendu. La notation comparée :</p><pre class="brush: ruby; title: ; notranslate">
# avec Test::Unit
assert_equals(result, 42)
# avec RSpec
result.should == 42
</pre><p>On se rapproche ainsi du langage naturel. En anglais dans le texte, certes, mais on se rapproche. La structure d&#8217;un fichier RSpec complet donne par exemple :</p><pre class="brush: ruby; title: ; notranslate">
import java.util.HashMap
describe &quot;An empty&quot;, HashMap do
  before :each do
    @hash_map = HashMap.new
  end
  it &quot;should not be empty after an entry has been added to it&quot; do
    @hash_map.put &quot;foo&quot;, &quot;bar&quot;
    @hash_map.should_not be_empty
  end
  it &quot;should be empty&quot; do
    @hash_map.should be_empty
    @hash_map.size.should == 0
  end
  it &quot;should return a keyset iterator that throws an exception on next&quot; do
    proc do
      @hash_map.key_set.iterator.next
    end.should raise_error(java.util.NoSuchElementException)
  end
end
</pre><p>Il est possible de mixer dans le même projet des tests Test::Unit et des tests RSpec. Le respect d&#8217;une norme de nommage des fichiers suffit à JTestR pour déterminer le framework ciblé.</p><p><em>Une précision importante sur un point obscur dans la documentation :</em> la commande <code>import</code> cherche dans les packages commençant par <code>java</code>, <code>javax</code>, <code>org</code> et <code>com</code>. Pour tous les autres il faut écrire :</p><pre class="brush: ruby; title: ; notranslate">
import Java::fr.votre.package.VotreClasse
</pre><h3><a
name="Limitations"></a>Limitations</h3><p>Un problème qui peut être pointé du doigt est le temps de chargement de l&#8217;environnement JRuby. L&#8217;interpréteur prend en effet parfois plus de 10 secondes à se lancer. Pour pallier ce problème, JTestR possède un mode serveur qui permet de conserver en tâche de fond un serveur avec l&#8217;environnement JRuby en attente des tests à lancer. On supprime ainsi facilement le temps de chargement.</p><p>L&#8217;apprentissage des bases du langage Ruby peut également rebuter, mais c&#8217;est un obstacle faible dans la mesure où c&#8217;est un langage entièrement objet et où l&#8217;on manipule majoritairement les classes Java du projet à tester. Le pas est généralement franchi <a
href="http://www.ruby-lang.org/fr/documentation/ruby-from-other-languages/to-ruby-from-java/" title="assez facilement" >assez facilement</a>.</p><h3><a
name="Conclusions"></a>Conclusions</h3><p>L&#8217;offre de frameworks de tests est déjà <em>conséquente</em> dans le monde Java. JTestR n&#8217;est pas très répandu à l&#8217;heure actuelle. Malgré cela, l&#8217;utilisation de RSpec pour la rédaction des tests permet de rester proche d&#8217;une formulation verbale des comportements attendus. Dans une démarche TDD, cela peut être avantageux. On aura ainsi tendance à éviter de se perdre dans des formulations techniques dès les premières phases du projet.</p><p>De plus, je prendrai sérieusement en considération JTestR si j&#8217;avais des développeurs Ruby dans mon équipe. Le framework vous offre une chance de casser la frontière entre vos équipes Ruby et Java. L&#8217;aspect très concis des tests les rend lisibles autant par les développeurs Java que Ruby et renforce l&#8217;entraide entre équipes. Cela facilite la distribution des compétences et des connaissances entre développeurs, ce qui n&#8217;est jamais une mauvaise chose.</p><p><strong>Ressources :</strong></p><ul><li><a
href="http://jtestr.codehaus.org/" title="Le site officiel JTestR" >Le site officiel JTestR</a></li><li><a
href="http://jtestr.codehaus.org/Getting+Started" title="La documentation" >La documentation</a></li><li><a
href="http://rspec.info/" title="RSpec" >RSpec</a></li><li><a
href="http://ruby-doc.org/stdlib/libdoc/test/unit/rdoc/classes/Test/Unit.html" title="TestUnit" >Test::Unit</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/10/02/lumiere-sur-jtestr/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Traduction du Maven Definitive Guide, première relecture publique</title><link>http://blog.xebia.fr/2009/09/30/traduction-du-maven-definitive-guide-premiere-relecture-publique/</link> <comments>http://blog.xebia.fr/2009/09/30/traduction-du-maven-definitive-guide-premiere-relecture-publique/#comments</comments> <pubDate>Wed, 30 Sep 2009 04:39:50 +0000</pubDate> <dc:creator>Erwan Alliaume</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[definitive]]></category> <category><![CDATA[fr]]></category> <category><![CDATA[francaise]]></category> <category><![CDATA[guide]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[officielle]]></category> <category><![CDATA[Sonatype]]></category> <category><![CDATA[tranduction]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2928</guid> <description><![CDATA[Comme certains le savent déjà, je participe à la traduction française du Maven: The definitive Guide. La version originale, qu&#8217;il est possible de consulter ou de télécharger gratuitement, est portée par Sonatype, l&#8217;entreprise dont le fondateur et CTO est Jason van Zyl, l&#8217;un des pères du projet Maven. D&#8217;autres traductions ont été effectuées ou sont [...]]]></description> <content:encoded><![CDATA[<p>Comme certains le savent déjà, je participe à la traduction française du <a
href="http://www.maven-definitive-guide.fr/" title="Maven : The definitive Guide" >Maven: The definitive Guide</a>. La version originale, qu&#8217;il est possible de <a
href="http://www.sonatype.com/books/maven-book/reference/" title="consulter ou de télécharger gratuitement" >consulter ou de télécharger gratuitement</a>, est portée par <a
href="http://www.sonatype.com/" title="Sonatype" >Sonatype</a>, l&#8217;entreprise dont le fondateur et CTO est Jason van Zyl, l&#8217;un des pères du projet Maven. D&#8217;autres traductions ont été effectuées ou sont en cours, les versions <a
href="http://www.sonatype.com/books/maven-book/reference_de/public-book.html" title="allemande" >allemande</a> et <a
href="http://www.sonatype.com/books/maven-book/reference_zh/public-book.html" title="chinoise" >chinoise</a> sont déjà disponibles. Notez qu&#8217;il s&#8217;agira de la traduction officielle, elle sera rendue disponible a minima sur le site de Sonatype en version en ligne et par PDF et nous envisageons également une version imprimée.</p><p>Dans ce cadre, comme nous venons de terminer la <strong>partie 1</strong> qui représente la première moitié du livre, nous lançons un <strong>premier appel public aux relectures</strong>. Le projet est hébergé sur <a
href="http://github.com/ehsavoie/maven-guide-fr/tree/master" title="github" >github</a>, il vous est donc tout à fait possible d&#8217;y participer à votre guise ou de venir consulter son avancement. C&#8217;est peut-être pour vous l&#8217;occasion de contribuer à un projet Open Source Maven &#8230; sans code &#8230; mais avec des développeurs dedans : l&#8217;Open Source ce n&#8217;est pas fait que de développement <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>Pour ceux qui seraient intéressés, voici quelques recommandations :</p><ul><li>Il est préférable de nous contacter avant de vous lancer dans la relecture, nous pourrons ainsi répartir uniformément les relectures et éviter les corrections parallèles.</li><li>Privilégiez les versions HTML ou PDF pour la relecture, pour ne pas être gêné par la multitude des balises XML dont le format docbook est si friand.</li><li>N&#8217;hésitez pas à vous inscrire à la ML du projet (maven-guide-fr-subscribe AT sonatype.org).</li></ul><p>Pour démarrer :</p><ul><li><a
href="http://www.maven-definitive-guide.fr/" title="Build journalier" >Build journalier</a> de la traduction ;</li><li>Sources de la traduction sur notre projet <a
href="http://wiki.github.com/ehsavoie/maven-guide-fr" title="GitHub" >GitHub</a> ;</li><li><a
href="https://github.com/signup/free" title="Créez un compte sur github" >Créez un compte sur github</a> pour pouvoir nous soumettre vos retours via l&#8217;<a
href="http://github.com/ehsavoie/maven-guide-fr/issues" title="Issue Tracker" >Issue Tracker</a> et télécharger la <a
href="http://github.com/ehsavoie/maven-guide-fr" title="version XML du docbook" >version XML du docbook</a>.</li></ul><p>N&#8217;hésitez pas à contacter l&#8217;un des <a
href="http://wiki.github.com/ehsavoie/maven-guide-fr/qui-fait-quoi" title="membres de lquipe" >membres de l&#8217;équipe</a> pour toute question (mon adresse email : erwan DOT alliaume AT gmail.com).</p><p>Bonne (re)lecture <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><div
align="center"> <a
href="http://twitter.com/ealliaume"><br
/> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/04/twitter4.png" alt="twitter erwan alliaume" title="twitter erwan alliaume" border="0" /><br
/> </a></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/09/30/traduction-du-maven-definitive-guide-premiere-relecture-publique/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>CITCON Paris 2009</title><link>http://blog.xebia.fr/2009/09/21/citcon-paris-2009/</link> <comments>http://blog.xebia.fr/2009/09/21/citcon-paris-2009/#comments</comments> <pubDate>Mon, 21 Sep 2009 11:34:26 +0000</pubDate> <dc:creator>Emmanuel Servent</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[citcon]]></category> <category><![CDATA[Déploiement]]></category> <category><![CDATA[git]]></category> <category><![CDATA[intégration continue]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[release]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2865</guid> <description><![CDATA[Le CITCON (prononcé &#171;&#160;KITCON&#160;&#187;) a eu lieu vendredi et samedi dernier à Paris, pour la session européenne 2009. Vendredi soir, après les présentations d&#8217;usage, l&#8217;open space a commencé par le remplissage du tableau des sessions par les fameux post-it. Pour rappel, les participants écrivent un thème sur un post-it et le collent n&#8217;importe où sur [...]]]></description> <content:encoded><![CDATA[<p>Le <a
href="http://citconf.com/" title="CITCON" >CITCON</a> (prononcé &laquo;&nbsp;KITCON&nbsp;&raquo;) a eu lieu vendredi et samedi dernier à Paris, pour la session européenne 2009.  Vendredi soir, après les présentations d&#8217;usage, l&#8217;open space a commencé par le remplissage du tableau des sessions par les fameux post-it. Pour rappel, les participants écrivent un thème sur un post-it et le collent n&#8217;importe où sur le tableau. C&#8217;est autour d&#8217;un verre, et entre deux discussions, qu&#8217;on vote et place les post-it dans les cases proposées pour chaque session.</p><p>Samedi matin, j&#8217;ai assisté à la session sur <strong>la gestion de source dans un environnement distribué</strong>. Après une mise au point sur la différence entre gestion de configuration et gestion de source, nous avons entamé la discussion sur l&#8217;outil très utilisé dans le développement Open Source dénommé <a
href="http://fr.wikipedia.org/wiki/Git" title="GIT" >GIT</a>.  Cet outil fonctionne en mode décentralisé : il n&#8217;y a pas un unique serveur de sources, mais chaque développeur fonctionne à la fois en mode serveur et en mode client. Le développeur peut, par exemple, versionner très souvent ses sources sur son serveur local, mais décider de ne valider ses changements qu&#8217;en une seule fois sur le serveur de référence (il peut même signer sa validation !).<br
/> Le cas d&#8217;un projet partagé entre la France et l&#8217;Australie m&#8217;a particulièrement intéressé. Le responsable avait mis en place un serveur intermédiaire GIT sur chaque site pour éviter les échanges réseau trop nombreux avec un serveur central. Une synchronisation régulière permettait aux deux sites d&#8217;être à jour. Il s&#8217;était rendu compte au bout d&#8217;un certain temps que cela était en réalité inutile, car la qualité du réseau faisait qu&#8217;on pouvait se permettre de n&#8217;avoir qu&#8217;un seul serveur. En revanche, si cela est peut-être vrai pour l&#8217;Australie, ce ne l&#8217;est pas forcément pour tous les pays.<br
/> Avec GIT, chaque copie du repository est une nouvelle branche ; un développeur en local, c&#8217;est une branche. Le fonctionnement des branches est un vrai casse-tête pour des outils comme Subversion, et cette approche propose finalement un peu de simplicité. Mais pour le moment, les serveurs d&#8217;Intégration Continue ne font pas la différence entre modes centralisé et décentralisé. Rien n&#8217;est proposé aujourd&#8217;hui pour mieux profiter d&#8217;un monde distribué&#8230;</p><p>Après un ravitaillement en café et jus d&#8217;orange, j&#8217;ai suivi Vincent Massol, de XWiki pour savoir <strong>comment améliorer notre façon de faire une release avec Maven</strong>. Arnaud Heritier faisait parti de la session et après une présentation du <a
href="http://dev.xwiki.org/xwiki/bin/view/Community/ReleaseProcess" title="processus" >processus</a> pour XWiki, ils ont démarré le codage d&#8217;une extension au <a
href="http://maven.apache.org/plugins/maven-dependency-plugin/" title="plugin dependency" >plugin dependency</a>. L&#8217;objectif était d&#8217;ajouter un goal pour récupérer les différences entre les versions des dépendances entre deux releases. Il faudra être attentif aux prochaines sorties de ce plugin, il y aura peut-être une nouvelle fonction.<br
/> Le constat, finalement, était qu&#8217;il y avait encore beaucoup d&#8217;étapes manuelles lors de la release d&#8217;une version et qu&#8217;à part développer ses propres MOJOs, Maven était assez loin du compte. Mais ça avance comme le montre le plugin <a
href="http://mojo.codehaus.org/versions-maven-plugin/" title="versions" >versions</a>, dont Arnaud Heritier nous a vanté les mérites.</p><p>L&#8217;après-midi, trois sessions nous attendaient mais je souhaite ne parler que de la dernière sur <strong>la configuration et le déploiement</strong>, les autres étant déjà traitées sur différents <a
href="http://citconf.com/wiki/index.php?title=OnTheWeb#CITCON_Europe_2009_Paris_France" title="blogs" >blogs</a>. Un problème récurrent se pose sur chaque projet, celui de la modification des valeurs selon l&#8217;environnement sur lequel on déploie. On utilise, par exemple, des fichiers de propriétés qui sont remplacés au moment du packaging. Si on s&#8217;est trompé dans les propriétés ou si la valeur n&#8217;est connue que de la personne qui déploie, il faut dézipper le fichier, changer la valeur et refaire le package. Bonjour la galère !<br
/> Deux ingénieurs de <a
href="http://opensource.thoughtworks.com" title="ThoughtWorks" >ThoughtWorks</a> nous ont présenté leur petit dernier : <a
href="http://code.google.com/p/escservesconfig" title="Escape" >Escape</a>. Sous ce nom très commun se cache une application Java dans laquelle on peut sauvegarder les valeurs des propriétés de chaque application dans un environnement donné. Ces valeurs peuvent être cryptées. Pour y accéder, une simple interface REST permet d&#8217;interroger la base et de récupérer la valeur : l&#8217;url http://mymachine:8080/environnements/dev/citcon/city, par exemple, renvoie la valeur de city pour l&#8217;environnement de dev sur l&#8217;application citcon. Je trouve ce projet simple et efficace pour améliorer la gestion des propriétés de nos applications. La mise en œuvre demandera un peu d&#8217;effort pour disposer d&#8217;un serveur central mais cela en vaut certainement la peine pour s&#8217;affranchir de cette partie de la configuration.</p><p>La conférence s&#8217;est terminée par un tour des participants sur leur &laquo;&nbsp;AA moment&nbsp;&raquo; (ie. ce qu&#8217;ils ont préférés!) et une distribution de livres sur l&#8217;intégration continue.<br
/> J&#8217;en ai gagné un, écrit par Paul M. Duvall, qui était juste à côté de moi, et me l&#8217;a dédicacé. Et c&#8217;est aussi ce qui rendait cette journée franchement sympathique et réussie; mon &laquo;&nbsp;AA moment&nbsp;&raquo; a été de mettre enfin un visage sur des auteurs de blogs ou des contributeurs open source, et surtout pouvoir converser <em>de visu</em>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/09/21/citcon-paris-2009/feed/</wfw:commentRss> <slash:comments>9</slash:comments> </item> <item><title>Maven, jetty plugin et section mappée</title><link>http://blog.xebia.fr/2009/06/10/maven-jetty-plugin-et-section-mappee/</link> <comments>http://blog.xebia.fr/2009/06/10/maven-jetty-plugin-et-section-mappee/#comments</comments> <pubDate>Wed, 10 Jun 2009 08:28:05 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[file locking]]></category> <category><![CDATA[Jetty]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[nio / io]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2179</guid> <description><![CDATA[Comme de nombreux projets web, nous utilisons pour le développement le plugin Jetty pour maven afin de lancer rapidement l&#8217;application. Tout s&#8217;est toujours bien passé jusqu&#8217;au moment où nous avons attaqué concrètement la partie cliente (avec ses feuilles de style, fichiers Javascript&#8230;). En effet, le problème survient lors de la modification à la volée de [...]]]></description> <content:encoded><![CDATA[<p>Comme de nombreux projets web, nous utilisons pour le développement le plugin Jetty pour maven afin de lancer rapidement l&#8217;application.</p><p>Tout s&#8217;est toujours bien passé jusqu&#8217;au moment où nous avons attaqué concrètement la partie cliente (avec ses feuilles de style, fichiers Javascript&#8230;). En effet, le problème survient lors de la modification <em>à la volée</em> de ces fichiers pour n&#8217;avoir qu&#8217;un rafraîchissement à effectuer dans notre navigateur (et pas un arrêt/relance du serveur).</p><p>Ainsi, à la sauvegarde, on obtient l&#8217;erreur suivante :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/06/erreur_box.png" border="0" alt="" /></div><p>Il nous est alors impossible de sauvegarder le fichier, l&#8217;erreur <em>fichier ayant une section mappée utilisateur ouverte</em> apparaît.</p><p>En effet, le <a
href="http://en.wikipedia.org/wiki/File_locking#File_locking_in_Microsoft_Windows" title="file locking" >file locking</a>, mécanisme de restriction d&#8217;accès aux fichiers par les utilisateurs / processus, pose problème sous Windows si l&#8217;on veut modifier ces fichiers.</p><p>Jetty monte en mémoire tous les fichiers statiques <em>(html, css, js, &#8230;)</em> et utilise pour cela une section mappée (<a
href="http://en.wikipedia.org/wiki/Memory-mapped_file" title="memory mapped file" >memory mapped file</a>) dans le cas d&#8217;un connecteur NIO (celui par défaut). Or, sous Windows, l&#8217;utilisation de ce segment de mémoire virtuelle provoque immédiatement un <em>lock</em> du fichier. Il devient donc impossible de modifier dynamiquement ces fichiers et nous sommes obligés de redémarrer notre Jetty pour prendre en compte toute modification.</p><p>Pour contourner ce problème, plusieurs solutions existent.</p><h3><a
name="ChangementdeconnecteurNIOversI"></a>Changement de connecteur (NIO vers IO)</h3><p>La plus simple et rapide est de modifier le connecteur par défaut (<code>SelectChannelConnector</code>) qui est de type NIO(contournement du problème mais après tout nous sommes en <em>dev</em>, pas besoin d&#8217;en faire des tonnes <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ).</p><p>Donc, dans notre <code>pom.xml</code>, nous allons modifier la configuration de notre <code>maven-jetty-plugin</code> en ajouter les quelques lignes suivantes :</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
   &lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;
   &lt;artifactId&gt;maven-jetty-plugin&lt;/artifactId&gt;
   &lt;configuration&gt;
      ...
      &lt;connectors&gt;
         &lt;connector implementation=&quot;org.mortbay.jetty.bio.SocketConnector&quot;&gt;
            ...
         &lt;/connector&gt;
      &lt;connectors&gt;
      ...
   &lt;/configuration&gt;
&lt;/plugin&gt;
</pre><p>Le contournement se situe au niveau de la balise <code>connectors</code>. Ainsi, on force Jetty à utiliser le <code>SocketConnector</code> au lieu du <code>SelectChannelConnector</code> par défaut. Ce connecteur non NIO  n&#8217;utilisera pas de section mappée pour charger les fichiers statiques et pourra dès lors les modifier à notre guise sans redémarrer Jetty.</p><h3><a
name="Webdefaultxml"></a>Webdefault.xml</h3><p>L&#8217;autre solution, que l&#8217;on pourrait qualifier de plus <em>officielle</em> (car directement sur le <a
href="http://docs.codehaus.org/display/JETTY/Files+locked+on+Windows" title="site de codehaus" >site de codehaus</a>) nous plonge dans le Jar pour modifier la configuration du fichier <code>webdefault.xml</code> (fichier chargé par Jetty avant le <code>web.xml</code>).</p><p>Ce fichier se trouve dans le Jar de Jetty (<code>%M2_REPO%/org/mortbay/jetty/jetty/6.1.x/jetty-6.1.x.jar</code>), au niveau du package <code>org.mortbay.jetty.webapp</code>. Il faut alors trouver la balise servlet où l&#8217;on peut lire</p><pre class="brush: xml; title: ; notranslate">
&lt;!—
...
useFileMappedBuffer : If set to true (the default), a  memory mappedfile buffer
will be used to serve static content when using an NIO connector.
Setting this value to false means that a direct buffer will be used instead.
If you are having trouble with Windows file locking, set this to false.
...
--&gt;
</pre><p>Cela tombe très bien, c&#8217;est exactement notre problème <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .  Nous pouvons donc passer cette valeur à false dans le fichier <code>webdefault.xml</code> pour ne pas utiliser cette fonctionnalité :</p><pre class="brush: xml; title: ; notranslate">
&lt;servlet&gt;
   ...
   &lt;init-param&gt;
      &lt;param-name&gt;useFileMappedBuffer&lt;/param-name&gt;
      &lt;param-value&gt;false&lt;/param-value&gt;
   &lt;/init-param&gt;
   ...
&lt;/servlet&gt;
</pre><p>Il ne reste plus qu&#8217;une dernière manipulation : dire au maven-jetty-plugin d&#8217;utiliser notre fichier de configuration <code>webdefault.xml</code>. Ces quelques lignes feront ce travail (avec votre fichier au niveau de <code>src/main/etc</code>) :</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
   &lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;
   &lt;artifactId&gt;maven-jetty-plugin&lt;/artifactId&gt;
   &lt;configuration&gt;
      ...
      &lt;webDefaultXml&gt;src/main/etc/webdefault.xml&lt;/webDefaultXml&gt;
      ...
   &lt;/configuration&gt;
&lt;/plugin&gt;
</pre><p>Voilà donc un gain de productivité qui ne se refuse pas !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/06/10/maven-jetty-plugin-et-section-mappee/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Maximum Maven</title><link>http://blog.xebia.fr/2009/04/30/maximum-maven/</link> <comments>http://blog.xebia.fr/2009/04/30/maximum-maven/#comments</comments> <pubDate>Thu, 30 Apr 2009 16:28:52 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Maven]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1862</guid> <description><![CDATA[Maven, le célèbre outil de management de build de projet, est souvent considéré comme difficile d&#8217;approche. Le principal point rebutant, souvent mis en lumière, est la complexité de gestion des fameux fichiers pom.xml, qui décrivent les processus de build. Pour se motiver, il est important de se souvenir que, parmi ceux qui ont pris le [...]]]></description> <content:encoded><![CDATA[<p>Maven, le célèbre outil de management de build de projet, est souvent considéré comme difficile d&#8217;approche. Le principal point rebutant, souvent mis en lumière, est la complexité de gestion des fameux fichiers pom.xml, qui décrivent les processus de build. Pour se motiver, il est important de se souvenir que, parmi ceux qui ont pris le temps de s&#8217;y intéresser, bien rares sont ceux qui font demi-tour. Comme en code, il existe des bonnes pratiques qui, si elles sont respectées, permettent de s&#8217;y retrouver facilement.</p><p><em>La route est longue mais la voie est libre.</em> Voyons donc ensemble quelques règles de bonne conduite pour conserver des pom.xml maintenables et faire durer la lune de miel avec Maven.</p><ul><li><a
href="http://blog.xebia.fr/2009/04/30/maximum-maven/#Utilisezunartifactrepository">Utilisez un artifact repository</a></li><li><a
href="http://blog.xebia.fr/2009/04/30/maximum-maven/#Dclareztoutesvosdpendancesdire">Déclarez toutes vos dépendances directes</a></li><li><a
href="http://blog.xebia.fr/2009/04/30/maximum-maven/#Utilisezdespropritspartoutocel">Utilisez des propriétés partout où cela est possible</a></li><li><a
href="http://blog.xebia.fr/2009/04/30/maximum-maven/#Utilisezlesprofils">Utilisez les profils</a></li><li><a
href="http://blog.xebia.fr/2009/04/30/maximum-maven/#Rflchissezbienaudcoupagedevosa">Réfléchissez bien au découpage de vos artefacts</a></li><li><a
href="http://blog.xebia.fr/2009/04/30/maximum-maven/#Evitezdevousappuyersurlesprfre">Evitez de vous appuyer sur les préférences locales</a></li><li><a
href="http://blog.xebia.fr/2009/04/30/maximum-maven/#Osezcriredesplugins">Osez écrire des plugins</a></li></ul><h3><a
name="Utilisezunartifactrepository"></a>Utilisez un artifact repository</h3><p>Dès que vous travaillez avec Maven sur un véritable projet, c&#8217;est la première chose à faire. Un classique est d&#8217;utiliser <a
href="http://nexus.sonatype.org/" title="Nexus" >Nexus</a>, le dépôt open source de Sonatype. Avoir un dépôt en réseau local accessible par tous les membres de l&#8217;équipe présente de multiples intérêts :</p><ul><li><strong>Accélérer le téléchargement des dépendances :</strong> grâce au proxy-cache.</li><li><strong>Maitriser les dépendances accessibles aux développeurs :</strong> on peut appliquer sur le proxy des politiques d&#8217;accès aux dépendances et ainsi les restreindre finement. Une règle serait, par exemple, d&#8217;interdire de dépendre d&#8217;un quelconque morceau de code licencié GPL, pour éviter la <em>contamination</em> de votre projet.</li><li><strong>Déployer et rendre disponibles nos propres artefacts à nos équipes :</strong> en bout de chaine d&#8217;intégration continue, en déployant les artifacts sur le repository, on peut faire reposer des projets annexes sur des versions maitrisées de nos librairies.</li><li><strong>Centraliser la gestion des repositories sur lesquels on s&#8217;appuie :</strong> dans l&#8217;administration de Nexus, on ne gère plus que la liste des repositories chez qui on récupère nos dépendances et on évite de polluer nos pom.xml avec ces considérations.</li></ul><p>Pour bien commencer, Sonatype fournit un guide très complet sur l&#8217;installation et l&#8217;usage de Nexus : <a
href="http://www.sonatype.com/books/nexus-book/reference/" title="Repository Management with Nexus" >Repository Management with Nexus</a>. Bien entendu, vous pouvez également vous tourner vers <a
href="http://archiva.apache.org/" title="Apache Archiva" >Apache Archiva</a> ou encore <a
href="http://www.jfrog.org/index.php" title="Artifactory" >Artifactory</a> pour répondre aux mêmes besoins.</p><h3><a
name="Dclareztoutesvosdpendancesdire"></a>Déclarez toutes vos dépendances directes</h3><p>Pour améliorer la maintenabilité des pom.xml, il est utile d&#8217;avoir sous les yeux les dépendances sur lesquelles vous vous appuyez. Derrière ce conseil qui parait évident se cache un risque d&#8217;erreur non négligeable.<br
/> Si vous déclarez ces dépendances :</p><pre class="brush: xml; title: ; notranslate">
&lt;dependencies&gt;
	 &lt;dependency&gt;
	 &lt;groupId&gt;ch.qos.logback&lt;/groupId&gt;
	 	 &lt;artifactId&gt;logback-classic&lt;/artifactId&gt;
	 	 &lt;version&gt;0.9.15&lt;/version&gt;
	 &lt;/dependency&gt;
	 &lt;dependency&gt;
	 	 &lt;groupId&gt;org.springframework&lt;/groupId&gt;
	 	 &lt;artifactId&gt;spring-jdbc&lt;/artifactId&gt;
	 	 &lt;version&gt;2.5.6&lt;/version&gt;
	 &lt;/dependency&gt;
&lt;/dependencies&gt;
</pre><p>le mécanisme de gestion des dépendances transitives de Maven (merci à lui) vous fournira toutes celles ci :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/04/dependencies.png" " border="0" alt="Dépendances transitives" title="Dépendances transitives" /></div><p>On pourrait s&#8217;arrêter là. Cependant, à ce stade, notre pom.xml ne permet pas de se rendre bien compte des librairies sur lesquelles nous nous appuyons réellement. Dans l&#8217;exemple ci-dessus, il est possible que du code de notre projet lance des appels directement sur <em>spring-core</em>. Cela ne pose pas de problèmes ni à la compilation, ni au build, mais, pour pouvoir gagner en lisibilité sur notre pom.xml, Maven nous a gratifié d&#8217;un plugin très utile : <a
href="http://maven.apache.org/plugins/maven-dependency-plugin/analyze-mojo.html" title="dependencyanalyze" >dependency:analyze</a>, qui va lister toutes les librairies qui sont des dépendances directes pour notre projet.</p><pre class="brush: java; title: ; notranslate">
$ mvn dependency:analyze
...
[INFO] [dependency:analyze]
[WARNING] Used undeclared dependencies found:
[WARNING]    org.slf4j:slf4j-api:jar:1.5.6:compile
[WARNING]    org.springframework:spring-core:jar:2.5.6:compile
[WARNING] Unused declared dependencies found:
[WARNING]    ch.qos.logback:logback-classic:jar:0.9.15:compile
[WARNING]    ch.qos.logback:logback-core:jar:0.9.15:compile
</pre><p>Les <em>Used undeclared dependencies</em> sont toutes les dépendances que nous pouvons ajouter à notre pom.xml pour en améliorer sa lecture et donc sa maintenabilité. Faites attention cependant, car ces dépendances sont des dépendances à la compilation. Les librairies listées dans les <em>Unused declared dependencies</em> peuvent très bien être des dépendances au runtime, auquel cas elles doivent rester en place.</p><h3><a
name="Utilisezdespropritspartoutocel"></a>Utilisez des propriétés partout où cela est possible</h3><p>Je vous recommande d&#8217;utiliser autant de propriétés que possible dans le pom.xml. Par exemple, n&#8217;hésitez pas une seconde entre ce pom:</p><pre class="brush: xml; title: ; notranslate">
&lt;dependencies&gt;
  &lt;dependency&gt;
    &lt;groupId&gt;ch.qos.logback&lt;/groupId&gt;
    &lt;artifactId&gt;logback-classic&lt;/artifactId&gt;
    &lt;version&gt;0.9.15&lt;/version&gt;
  &lt;/dependency&gt;
  &lt;dependency&gt;
    &lt;groupId&gt;org.springframework&lt;/groupId&gt;
    &lt;artifactId&gt;spring-jdbc&lt;/artifactId&gt;
    &lt;version&gt;2.5.6&lt;/version&gt;
  &lt;/dependency&gt;
  &lt;dependency&gt;
    &lt;groupId&gt;org.springframework&lt;/groupId&gt;
    &lt;artifactId&gt;spring-core&lt;/artifactId&gt;
    &lt;version&gt;2.5.6&lt;/version&gt;
  &lt;/dependency&gt;
&lt;/dependencies&gt;
</pre><p>et celui là:</p><pre class="brush: xml; title: ; notranslate">
&lt;properties&gt;
  &lt;logback.version&gt;0.9.15&lt;/logback.version&gt;
  &lt;spring.version&gt;2.5.6&lt;/spring.version&gt;
&lt;/properties&gt;
&lt;!-- ... --&gt;
&lt;dependencies&gt;
  &lt;dependency&gt;
    &lt;groupId&gt;ch.qos.logback&lt;/groupId&gt;
    &lt;artifactId&gt;logback-classic&lt;/artifactId&gt;
    &lt;version&gt;${logback.version}&lt;/version&gt;
  &lt;/dependency&gt;
  &lt;dependency&gt;
    &lt;groupId&gt;org.springframework&lt;/groupId&gt;
    &lt;artifactId&gt;spring-jdbc&lt;/artifactId&gt;
    &lt;version&gt;${spring.version}&lt;/version&gt;
  &lt;/dependency&gt;
  &lt;dependency&gt;
    &lt;groupId&gt;org.springframework&lt;/groupId&gt;
    &lt;artifactId&gt;spring-core&lt;/artifactId&gt;
    &lt;version&gt;${spring.version}&lt;/version&gt;
  &lt;/dependency&gt;
&lt;/dependencies&gt;
</pre><p>La deuxième version vous permettra de placer toutes vos propriétés en évidence en haut de votre fichier pom.xml et ainsi d&#8217;avoir en un rien de temps, sous les yeux, toutes les versions de vos dépendances. Encore une fois, l&#8217;objectif est ici de gagner du temps dans la manipulation de vos fichiers. Comme en code Java, il est toujours préférable de gérer une variable et d&#8217;en changer la valeur, que d&#8217;aller modifier tous les paramètres constants qui traîneraient dans le code.</p><h3><a
name="Utilisezlesprofils"></a>Utilisez les profils</h3><p>Il est courant d&#8217;avoir des opérations différentes à faire selon la machine sur laquelle on souhaite construire ou installer un projet. En effet, des informations telles que :</p><ul><li>l&#8217;adresse d&#8217;un serveur de base de données</li><li>le niveau de log a utiliser</li><li>le reporting à générer lors du build</li></ul><p>diffèrent selon l&#8217;environnement (machine de dev, serveur de qualification, de pré-prod, etc.). Pour répondre à ce besoin, Maven propose d&#8217;utiliser le mécanisme de <a
href="http://www.sonatype.com/books/maven-book/reference/profiles.html" title="profil de build" ><em>profil</em> de build</a>. Ne vous en privez pas.</p><p>A l&#8217;intérieur d&#8217;un profil, vous pouvez surcharger les propriétés que vous injectez dans les fichiers properties, les plugins associés aux phases de build, les rapports à générer&#8230; Bref, pratiquement tout ce que vous pouvez inscrire dans un pom.xml est surchargeable dans un profil.</p><p>On peut activer les profils souhaités en utilisant l&#8217;option <strong>-P</strong> du binaire <strong>mvn</strong> :</p><pre class="brush: java; title: ; notranslate">
mvn clean package -P monProfileTest,monProfilDev,monProfilReportingVerbeux
</pre><p>En complément, les profils Maven peuvent être configurés pour une <a
href="http://www.sonatype.com/books/maven-book/reference/profiles-sect-activation.html" title="activation automatique" >activation automatique</a> en fonction d&#8217;un ou de plusieurs paramètres tels que :</p><ul><li>la version du JDK détectée</li><li>la présence ou l&#8217;absence d&#8217;un fichier dans l&#8217;arborescence du projet</li><li>le type et/ou la version du système</li><li>l&#8217;architecture du processeur</li><li>la valeur d&#8217;une propriété présente dans le pom.xml</li></ul><p>Si vous utilisez ce genre d&#8217;activation automatique, il est toujours utile de se souvenir de l&#8217;existence de certains plugins fournis :</p><ul><li><a
href="http://maven.apache.org/plugins/maven-help-plugin/active-profiles-mojo.html" title="helpactiveprofiles" >help:active-profiles</a> : vous donne la liste des profils actifs pour votre configuration.</li><li><a
href="http://maven.apache.org/plugins/maven-help-plugin/effective-pom-mojo.html" title="helpeffectivepom" >help:effective-pom</a> : effectue la consolidation de la hiérarchie des pom.xml dans le cas d&#8217;héritage ou de modules, et vous affiche le pom.xml résultant. C&#8217;est ce pom.xml consolidé qui est utilisé par le binaire mvn lorsqu&#8217;on lance un build.</li></ul><h3><a
name="Rflchissezbienaudcoupagedevosa"></a>Réfléchissez bien au découpage de vos artefacts</h3><p>Vaut-il mieux faire un projet avec des modules ou faire des projets séparés interdépendants ? Cette question est certainement une des plus génératrice de débat. Il n&#8217;existe pas de règle à proprement parler, cela dépend surtout de l&#8217;utilisation que vous comptez avoir de vos morceaux de code. Il est tout à fait possible d&#8217;appliquer une séparation de responsabilité stricte du genre :</p><ul><li>un projet GUI, par exemple application web</li><li>&#8230; qui dépend d&#8217;un projet <em>couche business</em></li><li>&#8230; qui dépend d&#8217;un projet <em>couche dao</em></li><li>&#8230; qui dépend d&#8217;un projet <em>model</em></li></ul><p>Si on souhaite avoir de multiples implémentations de nos couches <em>business</em> et <em>dao</em>, on peut pousser encore le découpage en créant des projets contenant uniquement les interfaces et spécifier dans nos pom.xml l&#8217;implémentation qui nous intéresse. Cela nous donnerait quelque chose du genre :</p><ul><li>un projet application web</li><li>&#8230; qui dépend d&#8217;un projet <em>couche business impl</em>, lui-même dépendant d&#8217;un projet <em>couche business api</em></li><li>&#8230; qui dépend d&#8217;un projet <em>couche dao impl</em>, etc.</li></ul><p>A moins que nous n&#8217;ayons que peu de réutilisation dans d&#8217;autres équipes et qu&#8217;il faille juste ranger un peu notre code pour avoir des tests unitaires jouables sur chaque couche. On pourrait alors se contenter d&#8217;un projet avec un sous-module par couche.</p><p>La philosophie du <a
href="http://fr.wikipedia.org/wiki/Principe_KISS" title="KISS" >KISS</a> devrait vous éviter de verser dans des extrêmes inconfortables. Le point à retenir ici est de toujours prendre un temps de réflexion pour ce découpage, il est très structurant. En changer en cours de projet prend du temps pour éviter les régressions et les pertes de code.</p><h3><a
name="Evitezdevousappuyersurlesprfre"></a>Evitez de vous appuyer sur les préférences locales</h3><p>Vous trouverez sans aucun doute sur le net beaucoup de conseils tournant autour du fichier <em>settings.xml</em> ou du fameux <a
href="http://maven.apache.org/pom.html#The_Super_POM" title="SuperPOM" >Super-POM</a>. Ces fichiers font partie de l&#8217;installation de Maven sur votre poste local. Je trouve qu&#8217;il est dangereux de s&#8217;appuyer dessus, dans la mesure où ces fichiers ne sont, par définition, pas intégrés à votre gestionnaire de sources. Par conséquent rien ne garanti leur versionnage d&#8217;une machine développeur à une autre, et cela peut entraîner des comportement inattendus.</p><p>De plus, tout ce qu&#8217;on pourrait y mettre peut être glissé dans le fichier pom.xml de votre projet. Mon conseil donc : évitez-les.</p><p>Si par hasard vous étiez obligé de vous en servir, lors de l&#8217;écriture de vos pom.xml, souvenez vous bien qu&#8217;aucun héritage ne permet d&#8217;écraser la valeur d&#8217;une propriété définie dans le fichier settings.xml. S&#8217;il est présent et contient des directives, il aura raison.</p><h3><a
name="Osezcriredesplugins"></a>Osez écrire des plugins</h3><p>Il faut se souvenir que Maven est, avant tout, une machine à lancer des plugins. Il fournit certes un cadre d&#8217;exécution axé sur les builds de projet mais nous pouvons y ajouter les plugins qui nous plaisent sur n&#8217;importe quelle phase de build. Le développement de plugin est <a
href="http://www.sonatype.com/books/maven-book/reference/writing-plugins.html" title="relativement bien document" >relativement bien documenté</a> et nous permet d&#8217;ajouter des fonctionnalités à l&#8217;infini.</p><p>Si, en plus, vous avez suivi le premier conseil de cet article, vous pourrez déployer vos plugins sur le repository de votre réseau local et ainsi étendre facilement l&#8217;utilisation de vos plugins à travers vos équipes et vos projets.</p><h3><a
name="Pourconclure"></a>Pour conclure</h3><p>Nous n&#8217;avons vu ici que l&#8217;essentiel des pratiques permettant de mieux vivre son expérience Maven. Il existe beaucoup de bonnes pratiques et il est rarement possible de toutes les appliquer en même temps tellement cet outil est flexible. La meilleur méthode est sûrement de bien réfléchir à votre environnement, vos besoins, et à votre utilisation des projets que vous gérez. Une fois ceci fait, vous pourrez édicter <em>vos propres</em> bonnes pratiques, et les faire connaître et appliquer à vos équipes de développement sur le long terme.</p><p>Pour approfondir :</p><ul><li><a
href="http://www.sonatype.com/books/maven-book/" title="Maven  The definitive guide" >Maven : The definitive guide</a></li><li><a
href="http://www.maestrodev.com/better-build-maven" title="Better builds with Maven" >Better builds with Maven</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/04/30/maximum-maven/feed/</wfw:commentRss> <slash:comments>7</slash:comments> </item> </channel> </rss>
