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

<channel>
	<title>romain.getBlog( ); &#187; javascript</title>
	<atom:link href="http://linsolas.free.fr/wordpress/index.php/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://linsolas.free.fr/wordpress</link>
	<description></description>
	<lastBuildDate>Wed, 23 Jan 2013 21:29:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Chouchoutez votre JavaScript dans un projet web</title>
		<link>http://linsolas.free.fr/wordpress/index.php/2012/05/chouchoutez-votre-javascript-dans-un-projet-web/</link>
		<comments>http://linsolas.free.fr/wordpress/index.php/2012/05/chouchoutez-votre-javascript-dans-un-projet-web/#comments</comments>
		<pubDate>Thu, 03 May 2012 22:06:30 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[sonar]]></category>
		<category><![CDATA[tests]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://linsolas.free.fr/wordpress/?p=277</guid>
		<description><![CDATA[Voilà, c&#8217;est fait ! Vous êtes venus à Devoxx France, vous avez assisté à ma présentation (ou alors vous avez juste lu mon post sur le sujet), et donc vous voulez désormais chouchouter votre code JavaScript. Pour démarrer sur le sujet, vous avez suivi les étapes écrites sur mon post, comme je l&#8217;ai fait lors [...]]]></description>
			<content:encoded><![CDATA[<p>Voilà, c&#8217;est fait ! Vous êtes venus à Devoxx France, vous avez assisté à ma présentation (ou alors vous avez juste lu mon <a href="http://linsolas.free.fr/wordpress/index.php/2012/04/chouchoutez-votre-code-javascript">post sur le sujet</a>), et donc vous voulez désormais <strong>chouchouter votre code JavaScript</strong>.</p>
<p>Pour démarrer sur le sujet, vous avez suivi les étapes écrites sur mon post, comme je l&#8217;ai fait lors de ma présentation. C&#8217;est bien joli tout ça, mais dans la vraie vie réelle, vous n&#8217;avez pas un module Maven dédié au code JavaScript. Votre code JavaScript est (bêtement) dans votre application web ! Du coup, vous vous posez des questions sur la façon de procéder, en particulier concernant les analyses Sonar&#8230;</p>
<p>Allez zou, suivez le guide !</p>
<p><span id="more-277"></span></p>
<h2>Zou, créons un projet</h2>
<p>Lors de ma présentation, j&#8217;ai utilisé l&#8217;archetype Maven <code>de.akquinet.javascript.archetypes:javascript-quickstart</code>, qui crée un squelette d&#8217;application contenant juste du JavaScript.<br />
Cette fois-ci, on va partir d&#8217;un projet web classique dans lequel on incluera notre code JavaScript. Donc quelque chose de plus proche que ce que vous avez sur votre projet !</p>
<p>Je pars donc avec l&#8217;archetype <code>org.codehaus.mojo.archetypes:webapp-javaee6</code> pour avoir un squelette d&#8217;application web. Il s&#8217;agit là de votre propre projet web&#8230; De mon côté, j&#8217;y ajoute une petite classe Java, ainsi qu&#8217;une class de test JUnit pour le fun.</p>
<p>Désormais, on peut lancer une première analyse Sonar, avec la commande <code>mvn clean install sonar:sonar</code>.</p>
<div id="attachment_272" class="wp-caption center" style="width: 750px"><a href="http://linsolas.free.fr/wordpress/wp-content/uploads/chouchoutage-1.png"><img src="http://linsolas.free.fr/wordpress/wp-content/uploads/chouchoutage-1.png" alt="" title="chouchoutage-1" width="740" height="455" class="size-full wp-image-272" /></a><p class="wp-caption-text">Jusqu'ici, tout va bien !</p></div>
<p>Maintenant, je rajoute mon code JavaScript (les fichiers <code>underscore.js</code> et <code>undescore-test.js</code>). Je les positionne respectivement dans les répertoires <code>src/main/javascript</code> et <code>src/test/javascript</code>. Il est possible d&#8217;adapter ces répertoires, bien entendu !<br />
On ajoute le fichier de configuration de <code>jsTestDriver.conf</code> qui va nous permettre de lancer nos tests JavaScript de Jasmine. On ajoute aussi dans un coin (le répertoire <code>lib/</code> disons) :</p>
<ul>
<li>le fichier <code>jasmine.js</code> ;</li>
<li>le fichier <code>jasmineAdapter.js</code> (pour lancer les tests JavaScript écrits en Jasmine avec js-test-driver) ;</li>
<li>la librairie <code>coverage-1.3.4.b.jar</code>, qui est le plugin de calcul de couverture du code JavaScript pour js-test-driver.</li>
</ul>
<p>Au final, la structure de mon projet a la tête suivante :</p>
<pre class="brush: plain;">
chouchoutage (oui, c'est le nom pourri de mon projet)
  + pom.xml
  ` src
      + lib
      |   ` coverage-1.3.4.b.jar
      |   ` jasmine.js
      |   ` jasmineAdapter.js
      + main
      |   + java
      |   |   ` ze-code-java
      |   ` javascript
      |       ` underscore.js
      + test
      |   + java
      |   |   ` test-unitaires
      |   ` javascript
      |       ` underscore-test.js
      ` webapp
          ` toute-la-partie-web
</pre>
<p>Si vous souhaitez plus d&#8217;informations sur cette étape (comme le contenu du fichier <code>jsTestDriver.conf</code> par exemple), allez jeter un oeil sur <a href="http://linsolas.free.fr/wordpress/index.php/2012/04/chouchoutez-votre-code-javascript">mon post décrivant ma session Devoxx</a>.</p>
<p>Voilà, on arrive à quelque chose qui ressemble en gros à votre projet. Maintenant, on va voir comment on va pouvoir exécuter nos codes JavaScript, et en faire l&#8217;analyse Sonar.</p>
<h2>Ne tombons pas dans les poms !</h2>
<p>Attaquons nous au problème principal : la modification du pom. Nous allons d&#8217;abord l&#8217;adapter pour exécuter nos tests JavaScript. Nous verrons ensuite pour l&#8217;analyse Sonar&#8230;</p>
<p>Ajoutons d&#8217;abord la dépendance suivante :</p>
<pre class="brush: xml;">
    &lt;dependency&gt;
        &lt;groupId&gt;com.googlecode.jstd-maven-plugin&lt;/groupId&gt;
        &lt;artifactId&gt;jstd-maven-plugin&lt;/artifactId&gt;
        &lt;version&gt;1.3.2.5&lt;/version&gt;
        &lt;scope&gt;test&lt;/scope&gt;
    &lt;/dependency&gt;
</pre>
<p>On ajoute ensuite le plugin de <code>jstd-maven-plugin</code> :</p>
<pre class="brush: xml;">
    &lt;plugin&gt;
        &lt;groupId&gt;com.googlecode.jstd-maven-plugin&lt;/groupId&gt;
        &lt;artifactId&gt;jstd-maven-plugin&lt;/artifactId&gt;
        &lt;version&gt;1.3.2.5&lt;/version&gt;
        &lt;configuration&gt;
            &lt;port&gt;9876&lt;/port&gt;
            &lt;!-- A adapter ! --&gt;
            &lt;browser&gt;/Applications/Firefox.app/Contents/MacOS/firefox-bin&lt;/browser&gt;
            &lt;tests&gt;all&lt;/tests&gt;
            &lt;config&gt;jsTestDriver.conf&lt;/config&gt;
            &lt;testOutput&gt;target/jstestdriver&lt;/testOutput&gt;
        &lt;/configuration&gt;
        &lt;executions&gt;
            &lt;execution&gt;
                &lt;id&gt;run-tests&lt;/id&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>Dernier point, nous ajoutons le repository contenant les plugins sus-cités :</p>
<pre class="brush: xml;">
    &lt;repositories&gt;
          &lt;repository&gt;
              &lt;id&gt;jstd-maven-plugin google code repo&lt;/id&gt;
              &lt;url&gt;http://jstd-maven-plugin.googlecode.com/svn/maven2&lt;/url&gt;
          &lt;/repository&gt;
    &lt;/repositories&gt;
    &lt;pluginRepositories&gt;
          &lt;pluginRepository&gt;
              &lt;id&gt;jstd-maven-plugin google code repo&lt;/id&gt;
              &lt;url&gt;http://jstd-maven-plugin.googlecode.com/svn/maven2&lt;/url&gt;
          &lt;/pluginRepository&gt;
    &lt;/pluginRepositories&gt;
</pre>
<p>Voilà, nous pouvons vérifier si cela fonctionne. La commande <code>mvn clean install</code> va nous le dire :</p>
<pre class="brush: plain;">
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running fr.linsolas.WorldTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.053 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO]
[INFO] --- jstd-maven-plugin:1.3.2.5:test (run-tests) @ chouchoutage ---

-------------------------------------------
 J S  T E S T  D R I V E R
-------------------------------------------

Firefox: Runner reset.
................
Total 16 tests (Passed: 16; Fails: 0; Errors: 0) (10,00 ms)
  Firefox 9.0.1 Mac OS: Run 16 tests (Passed: 16; Fails: 0; Errors 0) (10,00 ms)
</pre>
<p>C&#8217;est plutôt une bonne nouvelle ça ! Surefire a lancé mon test JUnit (<code>fr.linsolas.WorldTest</code>), puis, dans un second temps, a exécuté les tests de js-test-driver.</p>
<h2>Plongeons dans l&#8217;analyse Sonar</h2>
<p>Et bien voilà, il ne nous reste plus qu&#8217;à exécuter une analyse Sonar et le tour est joué&#8230; Mais ce n&#8217;est pas si simple en fait !<br />
Sonar permet bien d&#8217;analyser un projet Java, il permet d&#8217;analyser également un projet JavaScript, mais hélas pas en même temps !<br />
Nous allons devoir donc lancer <strong>deux analyses Sonar</strong> pour arriver à nos fins.</p>
<p>Etant donné que nous ne voulons pouvoir lancer avec le même pom.xml l&#8217;analyse Sonar pour le code Java et l&#8217;analyse Sonar pour le code JavaScript, nous allons créer un profil Maven qui sera dédié à l&#8217;analyse JavaScript :</p>
<pre class="brush: xml;">
    &lt;profiles&gt;
        &lt;profile&gt;
            &lt;id&gt;js&lt;/id&gt;
            &lt;properties&gt;
                &lt;sonar.language&gt;js&lt;/sonar.language&gt;
                &lt;sonar.dynamicAnalysis&gt;reuseReports&lt;/sonar.dynamicAnalysis&gt;
            &lt;/properties&gt;
        &lt;/profile&gt;
    &lt;/profiles&gt;
</pre>
<p>Voyons voir si cela fonctionne. Lançons une première analyse avec <code>mvn clean install sonar:sonar</code>. En exécutant cette commande, l&#8217;analyse Sonar ne montre aucune différence avec celle réalisée plus tôt. Normal, me direz-vous, on reste sur l&#8217;analyse Java.<br />
Lançant maintenant la même commande, mais en activant le profile <strong>js</strong> : <code>mvn -Pjs clean install sonar:sonar</code>. Le résultat n&#8217;est pas celui attendu :</p>
<div id="attachment_273" class="wp-caption center" style="width: 766px"><a href="http://linsolas.free.fr/wordpress/wp-content/uploads/chouchoutage-2.png"><img src="http://linsolas.free.fr/wordpress/wp-content/uploads/chouchoutage-2.png" alt="" title="chouchoutage-2" width="756" height="233" class="size-full wp-image-273" /></a><p class="wp-caption-text">Ooooups</p></div>
<p>Houlà, mais on a tout cassé ! On n&#8217;obtient plus aucun chiffre, ni rien <img src='http://linsolas.free.fr/wordpress/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Le problème vient simplement du fait que le plugin JavaScript pour Sonar va chercher les sources dans le répertoire <code>src/main/java</code> au lieu de <code>src/main/javascript</code>.<br />
Il faut donc lui spécifier ce nouveau répertoire. On va donc spécifier un <code>sourceDirectory</code> dans notre profile <strong>js</strong>. Du moins on aimerait bien, car hélas Maven n&#8217;autorise pas que l&#8217;on redéfinisse ce répertoire dans un profil ! C&#8217;est étrange, mais c&#8217;est comme ça. Enfin pas tant que ça, car Maven &#8211; par défaut &#8211; n&#8217;accepte qu&#8217;un seul chemin de sources. Comme plusieurs profiles peuvent être actifs en même temps, on pourrait bidouiller les profiles pour avoir ainsi plusieurs répertoires de sources. On s&#8217;égare un peu là&#8230;<br />
Nous pourrions passer par le plugin <a href="http://mojo.codehaus.org/build-helper-maven-plugin/" onclick="pageTracker._trackPageview('/outgoing/mojo.codehaus.org/build-helper-maven-plugin/?referer=');">build-helper</a> qui permet de spécifier plusieurs répertoires de sources. Je n&#8217;en ferais rien, je vais &laquo;&nbsp;simplement&nbsp;&raquo; fourvoyer Maven en jouant avec les propriétés :</p>
<pre class="brush: xml;">
    &lt;properties&gt;
        &lt;source.dir&gt;src/main/java&lt;/source.dir&gt;
        &lt;test.source.dir&gt;src/test/java&lt;/test.source.dir&gt;
    &lt;/properties&gt;

    &lt;build&gt;
        &lt;sourceDirectory&gt;${source.dir}&lt;/sourceDirectory&gt;
        &lt;testSourceDirectory&gt;${test.source.dir}&lt;/testSourceDirectory&gt;
        ...
    &lt;/build&gt;

    &lt;profiles&gt;
        &lt;profile&gt;
            &lt;id&gt;js&lt;/id&gt;
            &lt;properties&gt;
                &lt;source.dir&gt;src/main/javascript&lt;/source.dir&gt;
                &lt;test.source.dir&gt;src/test/javascript&lt;/test.source.dir&gt;
                ...
</pre>
<p>Voilà, Maven n&#8217;y voit que du feu, et moi j&#8217;ai réussi à me débrouiller (à bidouiller disons plutôt).</p>
<p>Alors, que donne l&#8217;analyse Sonar maintenant ?</p>
<div id="attachment_274" class="wp-caption center" style="width: 753px"><a href="http://linsolas.free.fr/wordpress/wp-content/uploads/chouchoutage-3.png"><img src="http://linsolas.free.fr/wordpress/wp-content/uploads/chouchoutage-3.png" alt="" title="chouchoutage-3" width="743" height="454" class="size-full wp-image-274" /></a><p class="wp-caption-text">Voilà qui est mieux !</p></div>
<p>OUI ! Enfin, nous réussissons à obtenir notre belle analyse du code JavaScript par Sonar !</p>
<p>Et voilà, c&#8217;est fini.<br />
Vraiment ? Non !<br />
Un dernier souci se pose : si je lance l&#8217;analyse Java, j&#8217;ai un beau rapport Sonar. Mais dès que je lance l&#8217;analyse JavaScript, mon rapport JavaScript efface celui de Java !<br />
Il faut donc trouver un moyen de faire cohabiter les deux. Je propose simplement de profiter de l&#8217;option <code>sonar.branch</code> pour différencier les deux projets. On ajoute donc dans le profil <strong>js</strong> :</p>
<pre class="brush: xml;">
    &lt;profiles&gt;
        &lt;profile&gt;
            &lt;id&gt;js&lt;/id&gt;
            &lt;properties&gt;
                &lt;sonar.branch&gt;javascript&lt;/sonar.branch&gt;
                ...
</pre>
<p>Cette fois-ci, on relance les deux analyses : <code>mvn clean install sonar:sonar</code> puis <code>mvn -Pjs clean install sonar:sonar</code>.<br />
Une fois les deux commandes terminées, nous nous retrouvons avec non plus un mais deux projets Sonar :</p>
<div id="attachment_275" class="wp-caption center" style="width: 627px"><a href="http://linsolas.free.fr/wordpress/wp-content/uploads/chouchoutage-4.png"><img src="http://linsolas.free.fr/wordpress/wp-content/uploads/chouchoutage-4.png" alt="" title="chouchoutage-4" width="617" height="78" class="size-full wp-image-275" /></a><p class="wp-caption-text">Les deux font la paire</p></div>
<p>Chacun de ces projets est adapté à son langage, le premier pour Java, le second pour JavaScript.</p>
<p>Et voilà, c&#8217;est fini.<br />
Vraiment ? Cette fois, oui <img src='http://linsolas.free.fr/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>N&#8217;hésitez pas à faire part, dans les commentaires, de vos propres expériences, ou propositions d&#8217;améliorations !</p>
<a href="javascript:toggleStartStop();PicLensLite.start({feedUrl:'http://linsolas.free.fr/wordpress/wp-content/plugins/wp-piclens/mrss.php?id=277'});">Start Slide Show with PicLens Lite <img src="http://linsolas.free.fr/wordpress/wp-content/plugins/wp-piclens/PicLensButton.png" alt="PicLens" width="16" height="12" border="0" align="top"></a>]]></content:encoded>
			<wfw:commentRss>http://linsolas.free.fr/wordpress/index.php/2012/05/chouchoutez-votre-javascript-dans-un-projet-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
