<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>cestpasdur.com</title>
	
	<link>http://www.cestpasdur.com</link>
	<description>Tutoriaux et ressources du web</description>
	<lastBuildDate>Sat, 20 Feb 2010 13:45:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/CestpasdurcomTutoriauxEtRessourcesDuWeb" /><feedburner:info uri="cestpasdurcomtutoriauxetressourcesduweb" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>CestpasdurcomTutoriauxEtRessourcesDuWeb</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Gérer la minification de vos javascript avec le maven-javascript-plugin</title>
		<link>http://feedproxy.google.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~3/AU0-lKXKNSs/</link>
		<comments>http://www.cestpasdur.com/2010/02/20/gerer-la-minification-de-vos-javascript-avec-le-maven-javascript-plugin/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 13:31:10 +0000</pubDate>
		<dc:creator>dgouyette</dc:creator>
				<category><![CDATA[maven]]></category>
		<category><![CDATA[optimisation]]></category>

		<guid isPermaLink="false">http://www.cestpasdur.com/?p=273</guid>
		<description><![CDATA[Introduction
La minification d'un fichier consiste à supprimer les espaces inutiles, les commentaires et les retour à la ligne.
A titre d'exemple, le framework jquery non minifié fait 157Ko et une fois réduit, il n'en fait plus que 23Ko , la taille est pratiquement divisée par 7.
Le principal inconvénient est de rendre les fichiers  plus difficiles [...]]]></description>
			<content:encoded><![CDATA[<h2>Introduction</h2>
<p>La minification d'un fichier consiste à supprimer les espaces inutiles, les commentaires et les retour à la ligne.<br />
A titre d'exemple, le framework jquery non minifié fait 157Ko et une fois réduit, il n'en fait plus que 23Ko , la taille est pratiquement divisée par 7.<br />
Le principal inconvénient est de rendre les fichiers  plus difficiles par un humain. Dans cet article, je vais vous présenter une façon d'activer et désactiver cette minification sur les fichiers Javascript et CSS d'un projet web java.</p>
<h2>maven-javascript-plugin</h2>
<p>Ce plugin maven est utilisé par le framework Richfaces pour compresser les différentes librairies qui le composent (proptotype, scriptaculous) ainsi que ses propres fonctions internes. Ce plugin  (parmi d'autres) est packagé avec le framework Richfaces. Ce plugin est basé sur YUI compressor.</p>
<p>Vous devez donc référencer le repository jboss http://repository.jboss.com/maven2/ pour pouvoir récupérer ce plugin. Ajouter les lignes suivantes dans votre pom :</p>
<pre class="brush: php">
&lt;plugin&gt;
	&lt;groupId&gt;org.richfaces.cdk&lt;/groupId&gt;
	&lt;artifactId&gt;maven-javascript-plugin&lt;/artifactId&gt;
	&lt;version&gt;3.3.CR1&lt;/version&gt;
&lt;/plugin&gt;
</pre>
<p>Ci dessous un exemple de projet :<br />
<a href="http://www.cestpasdur.com/wp-content/uploads/2010/02/minification.png"><img src="http://www.cestpasdur.com/wp-content/uploads/2010/02/minification.png" alt="" title="minification" width="230" height="210" class="alignnone size-full wp-image-285" /></a></p>
<p>Ce projet contient 2 fichiers javascript.<br />
Nous allons configurer le plugin maven pour qu'il regroupe en un seul les fichiers JS. </p>
<pre class="brush: php">
&lt;outputDirectory&gt;${basedir}/src/main/webapp/js/&lt;/outputDirectory&gt;
                    &lt;aggregations&gt;
                        &lt;aggregation&gt;
                            &lt;includes&gt;
                                &lt;!-- liste des fichiers a ajouter au fichier final javascript --&gt;
                                &lt;include&gt;${project.build.directory}/${project.build.finalName}/js/1-min.js&lt;/include&gt;
                                &lt;include&gt;${project.build.directory}/${project.build.finalName}/js/2-min.js&lt;/include&gt;
                            &lt;/includes&gt;
                            &lt;!-- fichier unique  --&gt;
                            &lt;output&gt;${basedir}/src/main/webapp/js/all.js&lt;/output&gt;
                        &lt;/aggregation&gt;
                    &lt;/aggregations&gt;
                    &lt;excludes&gt;
                        &lt;exclude&gt;**/all.js&lt;/exclude&gt;
                    &lt;/excludes&gt;
                &lt;/configuration&gt;
</pre>
<p>Tous les fichiers javascript se trouvant dans la webapp vont être minifiés à l'exception de ceux indiqués dans les exclusions du plugin (ici all.js car celui ci contiendra l'aggregation de nos fichiers javascripts minifiés).<br />
Ensuite on configure les aggregations, on indique alors que notre fichier all.js contiendra en fait 1-min.js et 2-min.js</p>
<p>Pour lancer la compression des fichiers javascripts il suffira ensuite de lancer le goal suivant :</p>
<pre class="brush: php">
mvn javascript:compress
</pre>
<p>Notez que vous lancer ce goal a chaque fois que vous voudrez minifier vos fichiers javascript. Vous pouvez aussi automatisez cette tache, de manière à ce que celle-ci à chaque clean install du projet</p>
<p>Pour cela il faut ajouter les lignes suivantes : </p>
<pre class="brush: php">
 &lt;executions&gt;
                    &lt;execution&gt;
                        &lt;goals&gt;
                            &lt;goal&gt;compress&lt;/goal&gt;
                        &lt;/goals&gt;
                    &lt;/execution&gt;
                &lt;/executions&gt;
</pre>
<p>Ce qui au final donnera la configuration suivante : </p>
<pre class="brush: php">
 &lt;build&gt;
&lt;plugins&gt;
...
 &lt;plugin&gt;
                &lt;groupId&gt;org.richfaces.cdk&lt;/groupId&gt;
                &lt;artifactId&gt;maven-javascript-plugin&lt;/artifactId&gt;
                &lt;version&gt;3.3.3-CR1&lt;/version&gt;
                &lt;executions&gt;
                    &lt;execution&gt;
                        &lt;goals&gt;
                            &lt;goal&gt;compress&lt;/goal&gt;
                        &lt;/goals&gt;
                    &lt;/execution&gt;
                &lt;/executions&gt;
                &lt;configuration&gt;

                    &lt;outputDirectory&gt;${basedir}/src/main/webapp/js/&lt;/outputDirectory&gt;

                    &lt;aggregations&gt;
                        &lt;aggregation&gt;
                            &lt;includes&gt;
                                &lt;!-- liste des fichiers a ajouter au fichier final javascript --&gt;
                                &lt;include&gt;${project.build.directory}/${project.build.finalName}/js/1-min.js&lt;/include&gt;
                                &lt;include&gt;${project.build.directory}/${project.build.finalName}/js/2-min.js&lt;/include&gt;
                            &lt;/includes&gt;
                            &lt;!-- fichier unique  --&gt;
                            &lt;output&gt;${basedir}/src/main/webapp/js/all.js&lt;/output&gt;
                        &lt;/aggregation&gt;
                    &lt;/aggregations&gt;

                    &lt;excludes&gt;
                        &lt;exclude&gt;**/all.js&lt;/exclude&gt;
                    &lt;/excludes&gt;
                &lt;/configuration&gt;
            &lt;/plugin&gt;
&lt;/plugins&gt;
&lt;/build&gt;
</pre>
<p>De plus, si votre projet web est un projet JSF2, vous pouvez référencer ou non les fichiers minifiés, en les liant au projectStage<br />
Developpement = fichiers non minifiés<br />
Production = fichiers minifiés</p>

<p><a href="http://feedads.g.doubleclick.net/~a/kyq3kiePrvp8suBgEmmyG2x2gtc/0/da"><img src="http://feedads.g.doubleclick.net/~a/kyq3kiePrvp8suBgEmmyG2x2gtc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/kyq3kiePrvp8suBgEmmyG2x2gtc/1/da"><img src="http://feedads.g.doubleclick.net/~a/kyq3kiePrvp8suBgEmmyG2x2gtc/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~4/AU0-lKXKNSs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cestpasdur.com/2010/02/20/gerer-la-minification-de-vos-javascript-avec-le-maven-javascript-plugin/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.cestpasdur.com/2010/02/20/gerer-la-minification-de-vos-javascript-avec-le-maven-javascript-plugin/</feedburner:origLink></item>
		<item>
		<title>Codes sources et slides de la présentation JSF2 au ParisJug</title>
		<link>http://feedproxy.google.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~3/BTNeg_9wpyE/</link>
		<comments>http://www.cestpasdur.com/2009/10/14/codes-sources-et-slides-de-la-presentation-jsf2-au-parisjug/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 05:33:58 +0000</pubDate>
		<dc:creator>dgouyette</dc:creator>
				<category><![CDATA[JAVA / JEE]]></category>

		<guid isPermaLink="false">http://www.cestpasdur.com/?p=256</guid>
		<description><![CDATA[
Hier soir, j'ai fait avec François PETITIT une présentation sur JSF2 au parisjug.
Vous pouvez récupérer le code source ici : http://www.cestpasdur.com/svn/webapp-contacts-jsf2/trunk/
Les slides sont également disponibles ici 
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.cestpasdur.com/wp-content/uploads/2009/10/parisjug2.png"><img class="alignnone size-full wp-image-262" title="parisjug" src="http://www.cestpasdur.com/wp-content/uploads/2009/10/parisjug2.png" alt="parisjug" width="236" height="127" /></a></p>
<p>Hier soir, j'ai fait avec François PETITIT une présentation sur JSF2 au parisjug.</p>
<p>Vous pouvez récupérer le code source ici : <a href="http://www.cestpasdur.com/svn/webapp-contacts-jsf2/trunk/">http://www.cestpasdur.com/svn/webapp-contacts-jsf2/trunk/</a></p>
<p><a href="http://beta.cestpasdur.com/wp-content/uploads/2009/10/presentation-JSF2.odp">Les slides sont également disponibles ici </a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/zjd8j2BU6PFqyC0_qYyHShsIeWc/0/da"><img src="http://feedads.g.doubleclick.net/~a/zjd8j2BU6PFqyC0_qYyHShsIeWc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/zjd8j2BU6PFqyC0_qYyHShsIeWc/1/da"><img src="http://feedads.g.doubleclick.net/~a/zjd8j2BU6PFqyC0_qYyHShsIeWc/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~4/BTNeg_9wpyE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cestpasdur.com/2009/10/14/codes-sources-et-slides-de-la-presentation-jsf2-au-parisjug/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.cestpasdur.com/2009/10/14/codes-sources-et-slides-de-la-presentation-jsf2-au-parisjug/</feedburner:origLink></item>
		<item>
		<title>Afficher l’arbre de composant JSF (UIViewRoot) Valorisé</title>
		<link>http://feedproxy.google.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~3/Ab6t2P_FBQM/</link>
		<comments>http://www.cestpasdur.com/2009/09/27/afficher-arbre-composant-uiviewroot-valorise/#comments</comments>
		<pubDate>Sun, 27 Sep 2009 07:18:39 +0000</pubDate>
		<dc:creator>dgouyette</dc:creator>
				<category><![CDATA[JAVA / JEE]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[facelets]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false">http://www.cestpasdur.com/?p=243</guid>
		<description><![CDATA[Introduction
JSF est basé sur une vue arborescente de composants dont l'état est maintenu côté serveur.
En fonction des événements, du scope des managedBean et des actions qui ont été effectuées, la valeur des composants présente dans cet arbre peut évoluer. Ce court article vous présente deux façons d'afficher cet arbre valorisé à un instant T

Debug mode [...]]]></description>
			<content:encoded><![CDATA[<h2>Introduction</h2>
<p>JSF est basé sur une vue arborescente de composants dont l'état est maintenu côté serveur.<br />
En fonction des événements, du scope des managedBean et des actions qui ont été effectuées, la valeur des composants présente dans cet arbre peut évoluer. Ce court article vous présente deux façons d'afficher cet arbre valorisé à un instant T<br />
<span id="more-243"></span></p>
<h2>Debug mode de facelet</h2>
<p>Facelet fourni un tag permettant d'afficher vie une combinaison de touche, l'arbre valorisé, ainsi que les variables et leur scope.</p>
<p>Il faut ajouter dans votre fichier web.xml</p>
<pre class="brush: php">
 &amp;lt;context-param&amp;gt;
        &amp;lt;param-name&amp;gt;facelets.DEVELOPMENT&amp;lt;/param-name&amp;gt;
        &amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;
    &amp;lt;/context-param&amp;gt;
</pre>
<p>Ensuite, il suffit de positionner le code suivant dans votre template de page, pour le rendre disponible dans toutes vos pages.</p>
<pre class="brush: php">
&amp;lt;ui:debug hotkey=&amp;quot;d&amp;quot; rendered=&amp;quot;#{initParam.debugMode}&amp;quot;/&amp;gt;
</pre>
<p>l'attribut rendered permettra d'afficher ce composant uniquement quand facelets.DEVELOPMENT defini dans votre fichier web.xml sera positionné à true</p>
<p>Exemple de ce que vous pourrez obtenir en appuyant sur les touches CTRL + SHIFT + D :<br />
<a href="http://www.cestpasdur.com/wp-content/uploads/2009/09/facelet-debug.png"><img src="http://www.cestpasdur.com/wp-content/uploads/2009/09/facelet-debug-150x150.png" alt="facelet-debug" title="facelet-debug" width="150" height="150" class="alignleft size-thumbnail wp-image-247" /></a></p>
<h2>DebugUtil, ou comment dumper dans la console l'arbre JSF valorise</h2>
<p>JSF fourni une classe (pas très connue) : DebugUtil, celle ci fourni des méthodes du types :</p>
<ul>
<li>public static String printTree(UIComponent root)</li>
<li>public static void printTree(UIComponent root, Logger logger, Level level)</li>
</ul>
<p>Avec cette classe vous pourrez donc sortir via votre console, ou vos logger le contenu de l'arbre JSF.<br />
Ce qui vous donnera quelque chose du type :<br />
<a href="http://www.cestpasdur.com/wp-content/uploads/2009/09/dump-UIViewRoot-output-console.png"><img src="http://www.cestpasdur.com/wp-content/uploads/2009/09/dump-UIViewRoot-output-console-150x150.png" alt="dump-UIViewRoot-output-console" title="dump-UIViewRoot-output-console" width="150" height="150" class="alignleft size-thumbnail wp-image-245" /></a></p>
<p>Cette classe peut être ajoutée dans un phaseListener pour observer, dans une phase donnée (RESTORE-VIEW et RENDER_RESPONSE par exemple) l'évolution de l'arbre JSF par exemple.</p>
<p><br/><br/></p>
<pre class="brush: php">
public class ViewRootPhaseListener implements PhaseListener {

    @Override
    public void afterPhase(PhaseEvent phaseEvent) {
        if (isDeveloppementMode()) {
            //ecrit dans la console le contenu de la vue
            DebugUtil.printTree(FacesContext.getCurrentInstance().getViewRoot(), System.out);
        }
    }

    private boolean isDeveloppementMode() {
        return &amp;quot;true&amp;quot;.equals(FacesContext.getCurrentInstance().getExternalContext().getInitParameter(FaceletViewHandler.PARAM_DEVELOPMENT));
    }

    @Override
    public void beforePhase(PhaseEvent arg0) {
    }

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }
}
</pre>
<h2>En savoir plus</h2>
<p><a href="https://facelets.dev.java.net/nonav/docs/dev/docbook.html#template-debug">docbook de facelet : debug-mode</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/Cq-T6OE0YX2IvyOBi-dE43pNixY/0/da"><img src="http://feedads.g.doubleclick.net/~a/Cq-T6OE0YX2IvyOBi-dE43pNixY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Cq-T6OE0YX2IvyOBi-dE43pNixY/1/da"><img src="http://feedads.g.doubleclick.net/~a/Cq-T6OE0YX2IvyOBi-dE43pNixY/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~4/Ab6t2P_FBQM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cestpasdur.com/2009/09/27/afficher-arbre-composant-uiviewroot-valorise/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.cestpasdur.com/2009/09/27/afficher-arbre-composant-uiviewroot-valorise/</feedburner:origLink></item>
		<item>
		<title>Soirée JSF 2.0  au ParisJug le 13 octobre 2009</title>
		<link>http://feedproxy.google.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~3/aScs9OA2vPs/</link>
		<comments>http://www.cestpasdur.com/2009/09/17/soiree-jsf-2-parisjug/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 11:59:18 +0000</pubDate>
		<dc:creator>dgouyette</dc:creator>
				<category><![CDATA[JAVA / JEE]]></category>

		<guid isPermaLink="false">http://www.cestpasdur.com/?p=231</guid>
		<description><![CDATA[Le 13 octobre 2009, le ParisJug organise une soirée JSF2.
Cette présentation sera assurée par votre serviteur et mon collègue François PETITIT
Au cours de cette présentation, nous aborderons l'historique de JSF, les concepts généraux, les nouveautés introduites par cette nouvelle version :
    * configuration facilitée,
    * ajax natif,
   [...]]]></description>
			<content:encoded><![CDATA[<p>Le 13 octobre 2009, le <a href="http://www.parisjug.org">ParisJug </a>organise une soirée <a href="https://javaserverfaces.dev.java.net/">JSF2</a>.<br />
Cette présentation sera assurée par <a href="http://www.parisjug.org/xwiki/bin/view/Speaker/GouyetteDamien">votre serviteur</a> et mon collègue François PETITIT</p>
<p>Au cours de cette présentation, nous aborderons l'historique de JSF, les concepts généraux, les nouveautés introduites par cette nouvelle version :</p>
<p>    * configuration facilitée,<br />
    * ajax natif,<br />
    * gestion des ressources,<br />
    * ...</p>
<p>Nous verrons également l'outillage existant, et mettrons le tout en pratique en initiant un projet de gestion de contact.</p>
<p>Venez nombreux. <a href="http://www.cestpasdur.com/wp-content/uploads/2009/09/mojarra.jpeg"><img src="http://www.cestpasdur.com/wp-content/uploads/2009/09/mojarra.jpeg" alt="mojarra" title="mojarra" width="133" height="75" class="alignleft size-full wp-image-238" /></a></p>
<p>Plus d'information sur la <a href="http://www.parisjug.org/xwiki/bin/view/Meeting/20091013">présentation JSF2 au Paris JUG</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/0P2bXAiI9HP_KIb56qHejSPEklc/0/da"><img src="http://feedads.g.doubleclick.net/~a/0P2bXAiI9HP_KIb56qHejSPEklc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/0P2bXAiI9HP_KIb56qHejSPEklc/1/da"><img src="http://feedads.g.doubleclick.net/~a/0P2bXAiI9HP_KIb56qHejSPEklc/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~4/aScs9OA2vPs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cestpasdur.com/2009/09/17/soiree-jsf-2-parisjug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.cestpasdur.com/2009/09/17/soiree-jsf-2-parisjug/</feedburner:origLink></item>
		<item>
		<title>versions-maven-plugin : notification des mises a jour de librairies et plugins</title>
		<link>http://feedproxy.google.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~3/qZ3XQBh35Bo/</link>
		<comments>http://www.cestpasdur.com/2009/09/05/versions-maven-plugin-notification-des-mises-a-jour-librairies-plugns/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 08:13:41 +0000</pubDate>
		<dc:creator>dgouyette</dc:creator>
				<category><![CDATA[JAVA / JEE]]></category>
		<category><![CDATA[librairies]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[version]]></category>

		<guid isPermaLink="false">http://www.cestpasdur.com/?p=212</guid>
		<description><![CDATA[
Actuellement je bosse sur des application web jsf2 et/ou java EE 6. Les librairies ne sont pas encore figées, donc de nombreux mises à jour arrivent régulièrement.
Le plugin maven version-maven-plugin peut vous informer facilement des mises à jour. de librairies, et même des plugins
Celui-ci a été releasé le 23 août dernier en version final 1.0.
Je [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.cestpasdur.com/wp-content/uploads/2009/09/shell-mac-os.png"><img src="http://www.cestpasdur.com/wp-content/uploads/2009/09/shell-mac-os-150x150.png" alt="shell-mac-os" title="shell-mac-os" width="150" height="150" class="alignleft size-thumbnail wp-image-214" /></a></p>
<p>Actuellement je bosse sur des application web jsf2 et/ou java EE 6. Les librairies ne sont pas encore figées, donc de nombreux mises à jour arrivent régulièrement.<br />
Le plugin maven version-maven-plugin peut vous informer facilement des mises à jour. de librairies, et même des plugins<br />
Celui-ci a été releasé le 23 août dernier en version final 1.0.</p>
<p>Je vous propose maintenant de mettre en place ce plugin lors de l'execution du goal install sur vos projets.<br />
<span id="more-212"></span></p>
<p>pom.xml</p>
<pre class="brush: php">
&amp;lt;build&amp;gt;
&amp;lt;plugins&amp;gt;
...
&amp;lt;plugin&amp;gt;
				&amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
				&amp;lt;artifactId&amp;gt;versions-maven-plugin&amp;lt;/artifactId&amp;gt;
				&amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;
				&amp;lt;executions&amp;gt;
					&amp;lt;execution&amp;gt;
						&amp;lt;phase&amp;gt;install&amp;lt;/phase&amp;gt;
						&amp;lt;configuration&amp;gt;
					&amp;lt;comparisonMethod&amp;gt;mercury&amp;lt;/comparisonMethod&amp;gt;
				&amp;lt;/configuration&amp;gt;
						&amp;lt;goals&amp;gt;
							&amp;lt;goal&amp;gt;display-dependency-updates&amp;lt;/goal&amp;gt;
							&amp;lt;goal&amp;gt;display-plugin-updates&amp;lt;/goal&amp;gt;
						&amp;lt;/goals&amp;gt;
					&amp;lt;/execution&amp;gt;
				&amp;lt;/executions&amp;gt;

			&amp;lt;/plugin&amp;gt;

...
&amp;lt;/plugins&amp;gt;
&amp;lt;/build&amp;gt;
</pre>
<p>Désormais lorsque vous lancerez un install vous aurez quelque chose du genre :</p>
<p>[INFO] [versions:display-dependency-updates {execution: default}]<br />
[INFO] The following dependencies in Dependencies are using the newst version:<br />
[INFO]   com.sun.faces:jsf-api ...................................... 2.0.0-b17<br />
[INFO]   com.sun.faces:jsf-impl ..................................... 2.0.0-b17<br />
[INFO]   javax.el:el-api ............................................ 2.1.2-b04<br />
[INFO]   javax.el:el-ri ................................................... 1.2<br />
[INFO]   javax.servlet.jsp:jsp-api ........................................ 2.1<br />
[INFO]<br />
[INFO] The following dependencies in Dependencies have newer versions:<br />
[INFO]   javax.servlet:servlet-api ................................. 2.4 -> 2.5<br />
[INFO]<br />
[INFO] [versions:display-plugin-updates {execution: default}]<br />
[INFO]<br />
[INFO] The following plugin updates are available:<br />
[INFO]   maven-clean-plugin ....................................... 2.2 -> 2.3<br />
[INFO]   maven-eclipse-plugin ..................................... 2.6 -> 2.7<br />
[INFO]   maven-install-plugin ..................................... 2.2 -> 2.3<br />
[INFO]   maven-resources-plugin ................................... 2.3 -> 2.4<br />
[INFO]   maven-site-plugin ............................... 2.0-beta-7 -> 2.0.1<br />
[INFO]   maven-war-plugin .......................... 2.1-alpha-2 -> 2.1-beta-1<br />
[INFO]   org.mortbay.jetty:maven-jetty-plugin ............... 6.1.11 -> 6.1.20<br />
[INFO]<br />
[WARNING] The following plugins do not have their version specified:<br />
[WARNING]   maven-clean-plugin .......................... (from super-pom) 2.3<br />
[WARNING]   maven-deploy-plugin ......................... (from super-pom) 2.4<br />
[WARNING]   maven-site-plugin ......................... (from super-pom) 2.0.1</p>
<p>Comme vous pouvez le voir nous avons désormais la liste des librairies et  plugins à mettre à jour.<br />
Nous pouvons même être notifié des plugins n'ayant pas de version spécifiée dans le super-pom ce qui peut s'avérer dangeureux, si vous ne définissez pas vous même ces versions (mode update automatique.</p>
<p>Le plugin versions-maven-plugin a d'autres possibilités. Je vous invite à consulter le site de codegaus pour en savoir +:<br />
<a href="http://mojo.codehaus.org/versions-maven-plugin/index.html">http://mojo.codehaus.org/versions-maven-plugin/index.html</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/7HSuNAH0x7lAfjNHJmJNV65fHh0/0/da"><img src="http://feedads.g.doubleclick.net/~a/7HSuNAH0x7lAfjNHJmJNV65fHh0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/7HSuNAH0x7lAfjNHJmJNV65fHh0/1/da"><img src="http://feedads.g.doubleclick.net/~a/7HSuNAH0x7lAfjNHJmJNV65fHh0/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~4/qZ3XQBh35Bo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cestpasdur.com/2009/09/05/versions-maven-plugin-notification-des-mises-a-jour-librairies-plugns/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.cestpasdur.com/2009/09/05/versions-maven-plugin-notification-des-mises-a-jour-librairies-plugns/</feedburner:origLink></item>
		<item>
		<title>Ecriture d'un plugin maven en groovy</title>
		<link>http://feedproxy.google.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~3/4G8a_7i3mJQ/</link>
		<comments>http://www.cestpasdur.com/2009/06/28/ecriture-dun-plugin-maven-en-groovy/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 09:32:05 +0000</pubDate>
		<dc:creator>dgouyette</dc:creator>
				<category><![CDATA[maven]]></category>
		<category><![CDATA[gmaven]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://www.cestpasdur.com/?p=154</guid>
		<description><![CDATA[
J'ai eu la chance d'avoir il y a peu une formation à la création de plugin maven par arnaud grand gourou maven. Cependant, je n'avais pas encore eu l'occasion de mettre vraiment la main à la pâte. Je dois bosser la semaine prochaine sur un plugin maven codé en groovy et j'ai besoin de passer [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.cestpasdur.com/wp-content/uploads/2009/06/build.jpg" alt="build avec maven" title="build avec maven" width="170" height="126" class="alignleft size-full wp-image-177" /><br />
J'ai eu la chance d'avoir il y a peu une formation à la création de plugin maven par <a href="http://blog.aheritier.net/">arnaud grand gourou maven</a>. Cependant, je n'avais pas encore eu l'occasion de mettre vraiment la main à la pâte. Je dois bosser la semaine prochaine sur un plugin maven codé en groovy et j'ai besoin de passer par la case départ pour bien comprendre comment cela fonctionne. Cet article est ma case départ...</p>
<p><span id="more-154"></span></p>
<h2>Codes et explications</h2>
<p>Je suis parti from scratch et j'ai suivi les indications sur la page suivante http://docs.codehaus.org/display/GROOVY/GMaven+-+Implementing+Maven+Plugins</p>
<p>J'ai tout d'abord créé l'arborescence suivante :</p>
<pre class="brush: text">
src/it : contiendra les tests d&#039;intégration ( convention chez maven)
src/main
src/main/groovy (contiendra le code source groovy
src/main/groovy/com
src/main/groovy/com/cestpasdur
src/main/groovy/com/cestpasdur/maven
src/main/groovy/com/cestpasdur/maven/samples/
src/main/groovy/com/cestpasdur/maven/samples/HelloworldMojo.groovy (Notre premier mojo)
src/test/groovy (les tests unitaires )
</pre>
<p>Contenu de pom.xml</p>
<pre class="brush: xml">
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
&amp;lt;project&amp;gt;
    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;

  &amp;lt;!-- Description de l&#039;artifact --&amp;gt;
    &amp;lt;groupId&amp;gt;com.cestpasdur.maven&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-helloworld-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
    &amp;lt;name&amp;gt;Exemple Groovy Mojo - maven-helloworld-plugin&amp;lt;/name&amp;gt;

  &amp;lt;!-- Les plugins maven ont leur packaging propre--&amp;gt;
    &amp;lt;packaging&amp;gt;maven-plugin&amp;lt;/packaging&amp;gt;

  &amp;lt;properties&amp;gt;
      &amp;lt;gmaven.version&amp;gt;1.0-rc-5&amp;lt;/gmaven.version&amp;gt;

  &amp;lt;/properties&amp;gt;

 &amp;lt;!-- Dépendances --&amp;gt;
    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.codehaus.groovy.maven&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;gmaven-mojo&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${gmaven.version}&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;

    &amp;lt;build&amp;gt;
        &amp;lt;plugins&amp;gt;
            &amp;lt;!-- Permet de générer les descripteurs de mojo présents dans le code source--&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;maven-plugin-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;2.5&amp;lt;/version&amp;gt;
            &amp;lt;/plugin&amp;gt;

            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;groovy-maven-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;${gmaven.version}&amp;lt;/version&amp;gt;
                &amp;lt;extensions&amp;gt;true&amp;lt;/extensions&amp;gt;
                &amp;lt;executions&amp;gt;
                    &amp;lt;execution&amp;gt;
                        &amp;lt;goals&amp;gt;
                            &amp;lt;!-- Génère les stubs java à partir de mojo groovy --&amp;gt;
                            &amp;lt;goal&amp;gt;generateStubs&amp;lt;/goal&amp;gt;

                           &amp;lt;!-- Compile le code source groovy--&amp;gt;
                            &amp;lt;goal&amp;gt;compile&amp;lt;/goal&amp;gt;

                            &amp;lt;!-- Génère les stubs java à partir de mojo groovy  pour les Tests unitaires (TU)--&amp;gt;
                            &amp;lt;goal&amp;gt;generateTestStubs&amp;lt;/goal&amp;gt;

                            &amp;lt;!-- Compile le code source des TU groovy--&amp;gt;
                            &amp;lt;goal&amp;gt;testCompile&amp;lt;/goal&amp;gt;

                        &amp;lt;/goals&amp;gt;
                    &amp;lt;/execution&amp;gt;
                &amp;lt;/executions&amp;gt;
            &amp;lt;/plugin&amp;gt;
        &amp;lt;/plugins&amp;gt;
    &amp;lt;/build&amp;gt;
&amp;lt;/project&amp;gt;
</pre>
<p>Contenu du HelloworldMojo</p>
<pre class="brush: groovy">
package com.cestpasdur.maven.samples

import org.codehaus.groovy.maven.mojo.GroovyMojo

/**
 * description
 *
 *@goal hello
 */
class HelloworldMojo extends GroovyMojo{

    /**
     * Dit bonjour à l&#039;utilisateur
     *
     */
    void execute(){
        log.info(&amp;quot;hello world&amp;quot;)
    }
}
</pre>
<p>Maintenant que le code est terminé, il serait intéressant de vérifier que ce que fait ce plugin (pas grand chose) et que cela correspond à ce l'on attend de lui.</p>
<pre class="brush: sh">
mvn clean install
</pre>
<p>Sortie console :</p>
<pre class="brush: sh">
NetBeans: Executing &#039;/developpement/apache-maven-2.1.0/bin/mvn -Dnetbeans.execution=true clean install&#039;
NetBeans:      JAVA_HOME =/System/Library/Frameworks/JavaVM.framework/Versions/1.5/Home
Scanning for projects...
------------------------------------------------------------------------
Building Exemple Groovy Mojo - maven-helloworld-plugin
   task-segment: [clean, install]
------------------------------------------------------------------------
[clean:clean]
Deleting directory /developpement/workspaces/WS-ganymede/maven/maven-helloworld-plugin/target
[groovy:generateStubs {execution: default}]
 Generated 1 Java stub
[plugin:descriptor]
[WARNING] Using platform encoding (MacRoman actually) to read mojo metadata, i.e. build is platform dependent!
Applying mojo extractor for language: java
Mojo extractor for language: java found 1 mojo descriptors.
Applying mojo extractor for language: bsh
Mojo extractor for language: bsh found 0 mojo descriptors.
[resources:resources]
[WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent!
skip non existing resourceDirectory /developpement/workspaces/WS-ganymede/maven/maven-helloworld-plugin/src/main/resources
[compiler:compile]
Compiling 1 source file to /developpement/workspaces/WS-ganymede/maven/maven-helloworld-plugin/target/classes
[groovy:compile {execution: default}]
 Compiled 1 Groovy class
[groovy:generateTestStubs {execution: default}]
 No sources found for Java stub generation
[resources:testResources]
[WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent!
skip non existing resourceDirectory /developpement/workspaces/WS-ganymede/maven/maven-helloworld-plugin/src/test/resources
[compiler:testCompile]
Nothing to compile - all classes are up to date
[groovy:testCompile {execution: default}]
 No sources found to compile
[surefire:test]
No tests to run.
[jar:jar]
Building jar: /developpement/workspaces/WS-ganymede/maven/maven-helloworld-plugin/target/maven-helloworld-plugin-1.0-SNAPSHOT.jar
[plugin:addPluginArtifactMetadata]
[install:install]
Installing /developpement/workspaces/WS-ganymede/maven/maven-helloworld-plugin/target/maven-helloworld-plugin-1.0-SNAPSHOT.jar to /Users/damiengouyette/.m2/repository/com/cestpasdur/maven/maven-helloworld-plugin/1.0-SNAPSHOT/maven-helloworld-plugin-1.0-SNAPSHOT.jar
[plugin:updateRegistry]
------------------------------------------------------------------------
BUILD SUCCESSFUL
------------------------------------------------------------------------
Total time: 8 seconds
Finished at: Sun Jun 28 09:24:25 CEST 2009
Final Memory: 21M/38M
------------------------------------------------------------------------
</pre>
<p>Comme vous pouvez le voir j'utilise <strong>Netbeans</strong> pour coder ce magnifique plugin en groovy car le support est pour le moment meilleur que dans <strong>Eclipse</strong> (espérons que le rachat de g2one par <a href="http://www.springsource.com/">springsource</a> arrange les choses de ce côté là)</p>
<p>On voit tout d'abord qu'un stub java est généré  dont voici le code ci-dessous</p>
<pre class="brush: java">
//
// Generated stub from file:/developpement/workspaces/WS-ganymede/maven/maven-helloworld-plugin/src/main/groovy/com/cestpasdur/maven/samples/HelloworldMojo.groovy
//

package com.cestpasdur.maven.samples;

import java.lang.*;
import java.io.*;
import java.net.*;
import java.util.*;
import groovy.lang.*;
import groovy.util.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import org.codehaus.groovy.maven.mojo.GroovyMojo;

/**
 * description
 *
 * @goal hello
 */
public class HelloworldMojo
    extends GroovyMojo
    implements groovy.lang.GroovyObject
{
    /**
     * Dit bonjour  l&#039;utilisateur
     */
    public void execute() {
        throw new InternalError(&amp;quot;Stubbed method&amp;quot;);
    }

    public groovy.lang.MetaClass getMetaClass() {
        throw new InternalError(&amp;quot;Stubbed method&amp;quot;);
    }

    public void setMetaClass(groovy.lang.MetaClass metaClass) {
        throw new InternalError(&amp;quot;Stubbed method&amp;quot;);
    }

    public java.lang.Object invokeMethod(java.lang.String name, java.lang.Object args) {
        throw new InternalError(&amp;quot;Stubbed method&amp;quot;);
    }

    public java.lang.Object getProperty(java.lang.String name) {
        throw new InternalError(&amp;quot;Stubbed method&amp;quot;);
    }

    public void setProperty(java.lang.String name, java.lang.Object value) {
        throw new InternalError(&amp;quot;Stubbed method&amp;quot;);
    }
}
</pre>
<p>On peut également voir un warning dans la console :</p>
<pre class="brush: text">
[WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent!
skip non existing resourceDirectory /developpement/workspaces/WS-ganymede/maven/maven-helloworld-plugin/src/test/resources
</pre>
<p>Je suis un mac user, et sur Mac nous avons la change/malchance (choisissez) d'avoir notre propre encodage par défaut. Afin de corriger çà il suffit d'ajouter dans le pom.xml :</p>
<pre class="brush: xml">
...
 &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;maven-resources-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;2.3&amp;lt;/version&amp;gt;
                &amp;lt;configuration&amp;gt;
                    &amp;lt;!-- Permet de spécifier l&#039;encoding en UTF8 lors du traitement des ressources--&amp;gt;
                    &amp;lt;encoding&amp;gt;UTF-8&amp;lt;/encoding&amp;gt;
                &amp;lt;/configuration&amp;gt;
            &amp;lt;/plugin&amp;gt;

            &amp;lt;!-- Permet de générer les descripteurs de mojo présents dans le code source--&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;maven-plugin-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;2.5&amp;lt;/version&amp;gt;
                 &amp;lt;configuration&amp;gt;
                    &amp;lt;!-- Permet de spécifier l&#039;encoding en UTF8 lors du traitement des descripteurs de mojo--&amp;gt;
                    &amp;lt;encoding&amp;gt;UTF-8&amp;lt;/encoding&amp;gt;
                &amp;lt;/configuration&amp;gt;
            &amp;lt;/plugin&amp;gt;
...
</pre>
<p>Désormais, plus de warning dans la console :</p>
<pre class="brush: sh">
...
[plugin:descriptor]
Using &#039;UTF-8&#039; encoding to read mojo metadata.
...
resources:testResources]
Using &#039;UTF-8&#039; encoding to copy filtered resources.
...
</pre>
<h2>Tester son plugin</h2>
<p>Pour tester mon plugin, je lance la commande suivante à la racine de mon projet :</p>
<pre class="brush: sh">
mvn com.cestpasdur.maven:maven-helloworld-plugin:1.0-SNAPSHOT:hello
</pre>
<p>Résultat :</p>
<pre class="brush: sh">
...
INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Internal error in the plugin manager executing goal &#039;com.cestpasdur.maven:maven-helloworld-plugin:1.0-SNAPSHOT:hello&#039;: Unable to load the mojo &#039;com.cestpasdur.maven:maven-helloworld-plugin:1.0-SNAPSHOT:hello&#039; in the plugin &#039;com.cestpasdur.maven:maven-helloworld-plugin&#039;. A required class is missing: [Lorg/codehaus/groovy/runtime/callsite/CallSite;
org.codehaus.groovy.runtime.callsite.CallSite
...
</pre>
<p>Je n'ai pas trouvé d'autre moyen que de changer la version en rc4, ce qui a corrigé le bug (j'en ai profité pour ouvrir un bug : http://jira.codehaus.org/browse/MGROOVY-206)</p>
<p>Re clean install</p>
<pre class="brush: sh">
mvn clean install
</pre>
<p>Je relance le plugin et cette fois, cela fonctionne. Mission accomplie :</p>
<pre class="brush: sh">
macbook-pro-de-damien-gouyette:maven-helloworld-plugin damiengouyette$ mvn com.cestpasdur.maven:maven-helloworld-plugin:1.0-SNAPSHOT:hello
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Exemple Groovy Mojo - maven-helloworld-plugin
[INFO]    task-segment: [com.cestpasdur.maven:maven-helloworld-plugin:1.0-SNAPSHOT:hello]
[INFO] ------------------------------------------------------------------------
[INFO] [helloworld:hello]
[INFO] hello world
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Sun Jun 28 11:04:27 CEST 2009
[INFO] Final Memory: 11M/80M
[INFO] ------------------------------------------------------------------------
</pre>
<p>...</p>
<h2>Code source</h2>
<p><a href='http://www.cestpasdur.com/wp-content/uploads/2009/06/maven-helloworld-plugin.zip'>source maven-helloworld-plugin</a></p>
<h2>En savoir +</h2>
<p><a href="http://groovy.codehaus.org/GMaven+-+Implementing+Maven+Plugins">http://groovy.codehaus.org/GMaven+-+Implementing+Maven+Plugins</a><br />
<a href="http://www.sonatype.com/books/maven-book/reference/writing-plugins-alternative-sect-writing-groovy.html">http://www.sonatype.com/books/maven-book/reference/writing-plugins-alternative-sect-writing-groovy.html</a></p>
<p>Je vous invite à télécharger le code source de gmaven ici : https://svn.codehaus.org/groovy/gmaven/trunk<br />
Le trunk contient actuellement des exemples de mojo qui existent déjà en java (cleanMojo, installMojo), mais cette fois, ils sont codés en groovy.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/jpy1ReKIoeSLej2BoAemEVHCN2w/0/da"><img src="http://feedads.g.doubleclick.net/~a/jpy1ReKIoeSLej2BoAemEVHCN2w/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/jpy1ReKIoeSLej2BoAemEVHCN2w/1/da"><img src="http://feedads.g.doubleclick.net/~a/jpy1ReKIoeSLej2BoAemEVHCN2w/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~4/4G8a_7i3mJQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cestpasdur.com/2009/06/28/ecriture-dun-plugin-maven-en-groovy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.cestpasdur.com/2009/06/28/ecriture-dun-plugin-maven-en-groovy/</feedburner:origLink></item>
		<item>
		<title>Livre Java EE 6 (in english in the text) en dédicace ce samedi à Paris</title>
		<link>http://feedproxy.google.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~3/PFgRG8zTYss/</link>
		<comments>http://www.cestpasdur.com/2009/06/20/livre-java-ee-6-in-english-in-the-text-en-dedicace-ce-samedi-a-paris/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 13:47:57 +0000</pubDate>
		<dc:creator>dgouyette</dc:creator>
				<category><![CDATA[JAVA / JEE]]></category>

		<guid isPermaLink="false">http://www.cestpasdur.com/?p=152</guid>
		<description><![CDATA[
Antonio Goncalves :
" Je vous propose de nous retrouver samedi 20 juin à la librairie Le Monde En Tique de 15h50 à 18h pour une séance de dédicace. Le principe est simple : vous venez, vous achetez un exemplaire du livre (ou plusieurs exemplaires pour offrir à votre femme et à vos parents), et je [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.cestpasdur.com/wp-content/uploads/2009/09/javaee6glassfishv3bookAntonio.gif" alt="livre JEE6" /><br />
Antonio Goncalves :<br />
<em>" Je vous propose de nous retrouver samedi 20 juin à la librairie Le Monde En Tique de 15h50 à 18h pour une séance de dédicace. Le principe est simple : vous venez, vous achetez un exemplaire du livre (ou plusieurs exemplaires pour offrir à votre femme et à vos parents), et je vous écris un petit mot doux. C’est un bon deal non ? "</em><br />
<a href="http://agoncal.wordpress.com/2009/06/13/dedicace-du-livre-java-ee-6/">En savoir +</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/Y7K8v7sub36yUsRaWfVoUryyk2I/0/da"><img src="http://feedads.g.doubleclick.net/~a/Y7K8v7sub36yUsRaWfVoUryyk2I/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Y7K8v7sub36yUsRaWfVoUryyk2I/1/da"><img src="http://feedads.g.doubleclick.net/~a/Y7K8v7sub36yUsRaWfVoUryyk2I/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~4/PFgRG8zTYss" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cestpasdur.com/2009/06/20/livre-java-ee-6-in-english-in-the-text-en-dedicace-ce-samedi-a-paris/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.cestpasdur.com/2009/06/20/livre-java-ee-6-in-english-in-the-text-en-dedicace-ce-samedi-a-paris/</feedburner:origLink></item>
		<item>
		<title>Feedburner, rediriger vos flux avec .htaccess</title>
		<link>http://feedproxy.google.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~3/ar9gffkXEps/</link>
		<comments>http://www.cestpasdur.com/2009/03/15/feedburner-rediriger-vos-flux-avec-htaccess/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 13:09:36 +0000</pubDate>
		<dc:creator>dgouyette</dc:creator>
				<category><![CDATA[LAMP]]></category>
		<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[atom]]></category>
		<category><![CDATA[feedburner]]></category>
		<category><![CDATA[flux RSS]]></category>
		<category><![CDATA[redirection]]></category>
		<category><![CDATA[référencement]]></category>

		<guid isPermaLink="false">http://beta.cestpasdur.com/?p=8</guid>
		<description><![CDATA[Si comme moi vous avez navigué entre une dizaine de CMS, et proposé à vos utilisateurs des flux RSS avec des URL diverses et variées, vous vous retrouvez alors avec des utilisateurs qui suivent votre flux RSS avec google Reader, Netvibes ou bien leur propre butineur perso.

Seulement maintenant, vous souhaitez, à la fois économiser la bande passante consommée par les X bots, tout en utilisant les statistiques assez fournies mises à disposition par l’application de google : feedburner.]]></description>
			<content:encoded><![CDATA[<h1>Feedburner, rediriger vos flux avec .htaccess</h1>
<p><img src="../wp-content/uploads/2009/03/feedburner.png" alt="feedburner" title="feedburner" width="128" height="128" class="alignleft size-full wp-image-60" /> Si comme moi vous avez navigué entre une dizaine de CMS, et proposé à vos utilisateurs des flux RSS avec des URL diverses et variées, vous vous retrouvez alors avec des utilisateurs qui suivent votre flux RSS avec google Reader, Netvibes ou bien leur propre butineur perso.</p>
<p>Seulement maintenant, vous souhaitez, à la fois économiser la bande passante consommée par les X bots, tout en utilisant les statistiques assez fournies mises à disposition par l’application de google : feedburner.<br />
<span id="more-8"></span></p>
<h2>.htaccess, c’est quoi ?</h2>
<p>Le fichier .htaccess est une solution simple pour rediriger l’utilisateur vers d’autres pages ou demander à ce que l’internaute soit authentifié.</p>
<p>La première étape est d’identifier si l’utilisateur courant est ou non feedburner.</p>
<p>Afin de lister les différents types de user agent butinant mes flux RSS, je fais via ma console préférée (celle de macos)</p>
<h2>Auditer ses logs</h2>
<pre class="brush: bash">cat access_log | grep feed</pre>
<p>Vous obtiendrez donc quelque chose du style :</p>
<pre class="brush: text">...
[15/Mar/2009:01:19:08 +0100] &quot;GET /feed.php HTTP/1.0&quot; 404 180 &quot;-&quot; &quot;Netvibes (http://www.netvibes.com/; 9 subscribers; feedId: 5309207)&quot;
...
[15/Mar/2009:11:55:44 +0100] &quot;GET /feed HTTP/1.1&quot; 301 213 &quot;-&quot; &quot;Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 20 subscribers; feed-id=5711376032720528433)&quot;
...
[15/Mar/2009:11:49:18 +0100] &quot;GET /spip.php?page=backend&amp;amp;id_rubrique=1 HTTP/1.1&quot; 200 23490 &quot;-&quot; &quot;Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 1 subscribers; feed-id=13943281175051610867)&quot;
...
[15/Mar/2009:09:00:32 +0100] &quot;GET /feed HTTP/1.1&quot; 301 213 &quot;-&quot; &quot;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20090105 Lightning/0.9 Thunderbird/2.0.0.19&quot;
...
[15/Mar/2009:07:58:50 +0100] &quot;GET /feed HTTP/1.0&quot; 301 213 &quot;-&quot; &quot;FeedBurner/1.0 (http://www.FeedBurner.com)&quot;
...
</pre>
<p>Comme vous pouvez le voir, les outils pour suivre les flux sont assez nombreux :</p>
<li>thunderbird,</li>
<li>netvibes</li>
<li>igoogle</li>
<p>Gregarius (connait pas, celui là)</p>
<h2>Règles de redirection (RewriteCond)</h2>
<p>Maintenant que nous avons identifié les personnes à rediriger, nous allons pouvoir transformer cela en règle, grâce à notre fichier .htaccess en écrivant des conditions de redirection RewriteCond</p>
<p>Rediriger les users agents différents de feedburner :</p>
<pre class="brush: text">RewriteCond %{HTTP_USER_AGENT} !FeedBurner</pre>
<h2>Règle de réécriture (RewriteRule)</h2>
<p>Cela n’est pas suffisant, car dans ce cas, toutes nos urls seront redirigées. Il faut maintenant appliquer quelques restrictions :</p>
<p>Après avoir lister les urls à rediriger, cela donne :</p>
<pre class="brush: text">...
RewriteRule ^feed.php$ http://feeds2.feedburner.com/CestpasdurcomTutoriauxEtRessourcesDuWeb [R=301]
RewriteRule ^feed$ http://feeds2.feedburner.com/CestpasdurcomTutoriauxEtRessourcesDuWeb [R=301,L]
RewriteRule ^spip.php?page=backend$ http://feeds2.feedburner.com/CestpasdurcomTutoriauxEtRessourcesDuWeb [R=301,L]
...</pre>
<h2>Tester les redirections</h2>
<p>Deux méthodes :</p>
<p>Avec firefox en utilisant le <a href="https://addons.mozilla.org/fr/firefox/addon/59" target="_blank">plugin User Agent Switcher<br />
</a><br />
Avec wget pour les utilisateurs par defaut sur les feed</p>
<pre>wget http://www.cestpasdur.com/feed</pre>
<p>Le serveur nous retourne :</p>
<pre class="brush: text">--12:46:01--  http://www.cestpasdur.com/feed
          =&amp;gt; `feed&#039;
Résolution de www.cestpasdur.com... 88.191.80.17
Connexion vers www.cestpasdur.com|88.191.80.17|:80... connecté.
requête HTTP transmise, en attente de la réponse... 301 Moved Permanently
Emplacement: http://feeds2.feedburner.com/CestpasdurcomTutoriauxEtRessourcesDuWeb [suivant]
--12:46:01--  http://feeds2.feedburner.com/CestpasdurcomTutoriauxEtRessourcesDuWeb
          =&amp;gt; `CestpasdurcomTutoriauxEtRessourcesDuWeb&#039;
Résolution de feeds2.feedburner.com... 74.125.43.118
Connexion vers feeds2.feedburner.com|74.125.43.118|:80... connecté.
requête HTTP transmise, en attente de la réponse... 200 OK
Longueur: non spécifié [text/xml]
</pre>
<p>Vérifions maintenant que feedburner, lui, ne sera pas redirigé :</p>
<pre class="brush: bash">wget --user-agent=FeedBurner wget --user-agent=FeedBurner http://www.cestpasdur.com/spip.php?page=backend</pre>
<p>Le retour :</p>
<pre class="brush: text">
--12:54:54--  http://www.cestpasdur.com/spip.php?page=backend
          =&amp;gt; `spip.php?page=backend.2&#039;
Résolution de www.cestpasdur.com... 88.191.80.17
Connexion vers www.cestpasdur.com|88.191.80.17|:80... connecté.
requête HTTP transmise, en attente de la réponse... 200 OK
Longueur: non spécifié [text/xml]
</pre>
<p>Code http de la réponse 200, c’est ok</p>
<h2>Règles au complet</h2>
<pre class="brush: text">
RewriteCond %{HTTP_USER_AGENT} !FeedBurner
RewriteRule ^feed$ http://feeds2.feedburner.com/CestpasdurcomTutoriauxEtRessourcesDuWeb [R=301,L]
RewriteCond %{HTTP_USER_AGENT} !FeedBurner
RewriteCond %{QUERY_STRING} page=backend
RewriteCond %{QUERY_STRING} !id_rubrique
RewriteRule ^spip.php$ http://feeds2.feedburner.com/CestpasdurcomTutoriauxEtRessourcesDuWeb [R=301,L]
</pre>
<h2>Conclusion</h2>
<p>Nombreux sont les CMS php vous permettant de gérer votre contenu, l’utilisation d’un fichier htaccess fonctionnera cependant avec tous. Faites attention cependant aux url qui peuvent être différentes selon le CMS utilisé. Soyez également vigilants en surveillant de prêt vos fichiers de logs après la mise en place des règles, car l’erreur est humaine.</p>
<p>Autre avantage, après le rachat de feeburner par google, il est possible de monétiser ses flux RSS, la manipulation précédente vous permet de mieux diffuser ces publicités.</p>
<p>Il vous faudra ensuite être patient car les statistiques feedburner ne seront mises à jour que le lendemain.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/8H9FXNIoo0mv2ShEGAbCkB9HnHs/0/da"><img src="http://feedads.g.doubleclick.net/~a/8H9FXNIoo0mv2ShEGAbCkB9HnHs/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/8H9FXNIoo0mv2ShEGAbCkB9HnHs/1/da"><img src="http://feedads.g.doubleclick.net/~a/8H9FXNIoo0mv2ShEGAbCkB9HnHs/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~4/ar9gffkXEps" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cestpasdur.com/2009/03/15/feedburner-rediriger-vos-flux-avec-htaccess/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.cestpasdur.com/2009/03/15/feedburner-rediriger-vos-flux-avec-htaccess/</feedburner:origLink></item>
		<item>
		<title>JSF2 (JSR 314) , les nouveautés</title>
		<link>http://feedproxy.google.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~3/vJl8fgnE8Kk/</link>
		<comments>http://www.cestpasdur.com/2009/03/01/jsf2-jsr-314-les-nouveautes/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 06:36:32 +0000</pubDate>
		<dc:creator>dgouyette</dc:creator>
				<category><![CDATA[JAVA / JEE]]></category>
		<category><![CDATA[IHM]]></category>
		<category><![CDATA[interfaces web]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[JSF2]]></category>

		<guid isPermaLink="false">http://beta.cestpasdur.com/?p=21</guid>
		<description><![CDATA[JSF ou Java server Faces est le framework java de présentation web présent dans la version actuelle de JavaEE 5, et le sera également dans la prochaine version de javaEE 6 qui devrait sortir courant juin 2009. JSF était en version 1.2 (JSR 252) pour JAVAEE 5 et la prochaine version, JSF 2 (JSR 314) [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-40" title="jsf2" src="../wp-content/uploads/2009/03/jsf21.png" alt="jsf21" width="128" height="128" />JSF ou Java server Faces est le framework java de présentation web présent dans la version actuelle de JavaEE 5, et le sera également dans la prochaine version de javaEE 6 qui devrait sortir courant juin 2009. JSF était en version 1.2 (JSR 252) pour JAVAEE 5 et la prochaine version, JSF 2 (JSR 314) fera partie de javaEE6. A cette fin, ce framework a eu droit à une nouvelle version majeure, et donc, s’est vu dôté de nouvelles fonctionnalités. Cet article a but de vous faire une présentation rapide des nouveautés de JSF2. Je reviendrais plus en détail sur les nouveautés un peu plus tard.<br />
<span id="more-21"></span><br />
JSF 2 est la plus important mise à jour depuis sa création, il propose désormais :</p>
<ul>
<li>Support ajax natif,</li>
<li>gestions des ressources,</li>
<li>Page Declaration Language et création de composants facilité (ezcomp),</li>
<li>Davantage de scopes,</li>
<li>Configuration facilitée,</li>
</ul>
<h2>Configuration facilitée</h2>
<p>L’utilisation des annotation permet avec JSF2 de considérablement simplifier sa configuration. Il n’est même plus nécessaire d’avoir un faces-config dans votre projet Web.</p>
<p>Quelques unes des annotation ajoutées :</p>
<ul>
<li>@ManagedBean,</li>
<li>@SessionScoped,</li>
<li>@RequestScoped,</li>
<li>@ViewScoped ...</li>
</ul>
<h2>Support ajax natif</h2>
<p>De nos jours, une application web se doit d’offrir une interface riche et réactive. Cette réactivité s’obtient en ne mettant à jour que de petites portions de la page. Les versions précédentes de JSF ne proposaient aucune solution native. Des librairies tierces telles que a4jsf comblaient cette lacune en apportant leur propre solution.</p>
<p>Ceci au prix d’un alourdissement du code html généré et selon l’utilisation qui en est faite, au détriment des performances. JSF 2 apporte sa propre solution native.</p>
<p>Afin d’intégrer ajax dans vos pages, il faut dans un premier temps ajouter la ressource javascript ajax.js présente dans la librairie jsf-api.jar avec la ligne suivante :</p>
<pre class="brush: html">&amp;lt;h:outputAjaxScript target=&quot;head&quot; /&amp;gt; </pre>
<p>Vous pouvez ensuite l’utiliser dans vos formulaires en ajoutant sur un commandButton les attributs suivants :</p>
<pre class="brush: html">
onclick=&quot;jsf.ajax.request(this, event, {execute:&#039;this, inputComponent1,inputComponent1,&#039;,render:&#039;tableListContact&#039;});
actionListener=&quot;#{contactBean.doCreateContact}&quot;
</pre>
<p>Les valeurs des composants inputComponent1 et inputComponent2 seront transmises côté serveur .</p>
<p>En appelant FacesContext.isAjaxRequest() le serveur peut savoir si la requête qui lui est adressée est partielle ou complète. Si c’est une requête partielle (ajax), le serveur va alors consulter la liste des composants devant être mis à jour côté serveur. Les traitements et le rendu (Différentes phases du cylce de vie) ne seront effectués que sur les composants passée en références.</p>
<p>Si les données sont valides, la liste des contacts se verra finalement enrichie d’un nouveau membre.</p>
<h2>Page Declaration Language (PDL)</h2>
<p>PDL est basé sur facelets</p>
<p>Celui-ci fourni une méthode simple pour factoriser des morceaux de pages en éléments réutilisables et configurable : les templates. La définition d’un template est très ressemblante à celle d’un composant JSF, il est d’ailleurs très facile de réaliser des composants avec facelets, le tout sans écrire la moindre ligne de code java.</p>
<p>Pour les adeptes de xsl, la création d’un template avec facelets est très proche de la façon de le faire avec XSL, de la même façon, vous pouvez passer des paramètres à ce template.</p>
<p>Une page JSP sera compilée en une servlet, alors qu’un template facelets sera directement buildé en un arbre de composant correspondants (fonctionnement natif de JSF)</p>
<h2>Gestions des ressources</h2>
<p>Une ressource telle que la concoit JSF est un élément statique qui sera transmise pour être affichée ou traitée par le navigateur du client. Cela peut être une image, un script javascript, une feuille de style CSS. Une ressource est définie par :</p>
<ul>
<li> library,</li>
<li> name,</li>
<li> version,</li>
<li> locale (Vous pouvez donc avoir des ressources localisées)</li>
</ul>
<p>Précédemment dans JSF, lorsque vous vouliez mettre à disposition une ressource, vous deviez passer par le répertoire WEB-INF, afin que le navigateur client puisse y accéder, et si vous souhaitiez la mettre à jour, il fallait remplacer le fichier. Avec JSF 2.0, c’est fini, vous fournissez vos ressources directement par le biais d’un jar. Plus besoin de passer par une servlet filter. Les jars étant versionnés, il est facile d’effectuer une montée de version afin de passer des correctifs par exemple.</p>
<p>Afin de mettre à disposition une ressource dans un jar il faut la disposer sous /resources ou /META-INF/resources</p>
<h2>Davantage de scope</h2>
<p>Un nouveau scope a été ajouté, viewScope, ce qui donne au managedBean associé une durée de vie identique à celle de la view (une view peut s’étaler sur plusieurs requêtes), mais dès que vous changez de view, les données ne seront plus maintenues.</p>
<h2>Conclusion</h2>
<p>Même si JSF2 ne changera pas beaucoup votre façon de coder des pages web en java, il vous simplifiera la vie, par l’intégration des frameworks actuels qui étendent JSF 1.X.</p>
<p>De plus, lorsque vous coderez votre première page avec JSF2, vous pourrez déjà réaliser quelques pages web avant de commencer à devoir l’aller chercher des librairies tierces.</p>
<p>Et pour finir, la facilité avec laquelle l’on peut créer des composants en JSF2 est telle que je suis sur que nous allons voir arriver beaucoup de nouvelles librairies arriver sur le marché (openSource ou non)</p>
<h2>En savoir +</h2>
<p>Si vous souhaitez en savoir +, je vous invite à surveiller la sortie du livre d’Antonio Goncalves :</p>
<p>http://www.apress.com/book/view/1430219548</p>
<h2>Références :</h2>
<ul>
<li>http://weblogs.java.net/blog/edburns/</li>
<li>http://weblogs.java.net/blog/driscoll/</li>
<li>http://in.relation.to/10463.lace</li>
<li>Liste de librairies tierces : http://www.jsfmatrix.net/</li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/rTWdoXzbNC704TQJ9jBGmBprC0A/0/da"><img src="http://feedads.g.doubleclick.net/~a/rTWdoXzbNC704TQJ9jBGmBprC0A/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/rTWdoXzbNC704TQJ9jBGmBprC0A/1/da"><img src="http://feedads.g.doubleclick.net/~a/rTWdoXzbNC704TQJ9jBGmBprC0A/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~4/vJl8fgnE8Kk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cestpasdur.com/2009/03/01/jsf2-jsr-314-les-nouveautes/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.cestpasdur.com/2009/03/01/jsf2-jsr-314-les-nouveautes/</feedburner:origLink></item>
		<item>
		<title>Hibernate, sous le capot, il fait quoi ?</title>
		<link>http://feedproxy.google.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~3/1B5FnxjHQQM/</link>
		<comments>http://www.cestpasdur.com/2009/02/23/hibernate-sous-le-capot-il-fait-quoi/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 07:02:37 +0000</pubDate>
		<dc:creator>dgouyette</dc:creator>
				<category><![CDATA[JAVA / JEE]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[transactions]]></category>

		<guid isPermaLink="false">http://beta.cestpasdur.com/?p=43</guid>
		<description><![CDATA[Hibernate est un formidable outil pour les développeurs, mais il a cependant un inconvénient, il éloigne le développeur de ce qu’il se passe réellement entre son application et sa base de données. Ce post a juste pour objectif de vous donner quelques pistes que j’utilise pour comprendre un peu mieux ce que fait hibernate derrière mon dos.]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-46" title="200447958-001" src="http://www.cestpasdur.com/wp-content/uploads/2009/03/hibernate.png" alt="200447958-001" width="113" height="170" />Hibernate est un formidable outil pour les développeurs, mais il a cependant un inconvénient, il éloigne le développeur de ce qu’il se passe réellement entre son application et sa base de données. Ce post a juste pour objectif de vous donner quelques pistes que j’utilise pour comprendre un peu mieux ce que fait hibernate derrière mon dos.<br />
<span id="more-43"></span></p>
<h2>Tracer les requêtes SQL</h2>
<p>On interagit avec une base de données via des ordres SQL. Afin de vérifier que des dizaines de requêtes ne sont pas exécutées lorsque je récupère une collection d’objet, il suffit d’activer le show_sql sur hibernate, je vais également activer le sql_comments que m’en dit encore un peu plus</p>
<p>Fichier de configuration spring :</p>
<pre class="brush: xml">
&amp;amp;amp;amp;amp;lt;bean id=&amp;amp;amp;amp;amp;quot;sessionFactory&amp;amp;amp;amp;amp;quot;
class=&amp;amp;amp;amp;amp;quot;org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;gt;
...
&amp;amp;amp;amp;amp;lt;property name=&amp;amp;amp;amp;amp;quot;hibernateProperties&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;value&amp;amp;amp;amp;amp;gt;
hibernate.show_sql=true
use_sql_comments=true
&amp;amp;amp;amp;amp;lt;/value&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;/property&amp;amp;amp;amp;amp;gt;
...
&amp;amp;amp;amp;amp;lt;/bean&amp;amp;amp;amp;amp;gt;
</pre>
<p>Avec cette configuration, vous aurez en premier lieu, un commentaire sur le traitement JPA lancé (un criteria par exemples), ensuite vous verrez la ou les requêtes SQL résulstantes.</p>
<h2>Tracer la valeur des paramètres hibernate</h2>
<p>Vos requêtes SQL sont désormais bien tracées, cependant, la valeur des paramètres est remplacée par le caractère ? Pour afficher la valeur de ce paramètre, il suffit d’ajouter dans votre fichier de configuration log4j :</p>
<pre class="brush: xml">
&amp;amp;amp;amp;amp;lt;logger name=&amp;amp;amp;amp;amp;quot;org.hibernate.type&amp;amp;amp;amp;amp;quot; additivity=&amp;amp;amp;amp;amp;quot;false&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;level value=&amp;amp;amp;amp;amp;quot;debug&amp;amp;amp;amp;amp;quot; /&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;appender-ref ref=&amp;amp;amp;amp;amp;quot;console&amp;amp;amp;amp;amp;quot; /&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;/logger&amp;amp;amp;amp;amp;gt;
</pre>
<p>Et maintenant, vous verrez dans votre console les traces suivantes :</p>
<pre class="brush: plain">
Hibernate: /* criteria query */ select this_.id as id4_0_, this_.name as name4_0_, this_.nbPersonnes as nbPerson3_4_0_ from Chambre this_
2009-02-24 21:02:48,939  DEBUG [org.hibernate.type.LongType] (btpool0-0:) returning &#039;1&#039; as column: id4_0_
2009-02-24 21:02:48,939  DEBUG [org.hibernate.type.StringType] (btpool0-0:) returning &#039;STANDARD&#039; as column: name4_0_
2009-02-24 21:02:48,939  DEBUG [org.hibernate.type.IntegerType] (btpool0-0:) returning &#039;2&#039; as column: nbPerson3_4_0_
2009-02-24 21:02:48,939  DEBUG [org.hibernate.type.LongType] (btpool0-0:) returning &#039;2&#039; as column: id4_0_
2009-02-24 21:02:48,939  DEBUG [org.hibernate.type.StringType] (btpool0-0:) returning &#039;SUPERIEURE&#039; as column: name4_0_
2009-02-24 21:02:48,940  DEBUG [org.hibernate.type.IntegerType] (btpool0-0:) returning &#039;2&#039; as column: nbPerson3_4_0_
2009-02-24 21:02:48,940  DEBUG [org.hibernate.type.LongType] (btpool0-0:) returning &#039;3&#039; as column: id4_0_
2009-02-24 21:02:48,940  DEBUG [org.hibernate.type.StringType] (btpool0-0:) returning &#039;MEZZANINE&#039; as column: name4_0_
2009-02-24 21:02:48,940  DEBUG [org.hibernate.type.IntegerType] (btpool0-0:) returning &#039;4&#039; as column: nbPerson3_4_0_
2009-02-24 21:02:48,940  DEBUG [org.hibernate.type.LongType] (btpool0-0:) returning &#039;4&#039; as column: id4_0_
2009-02-24 21:02:48,940  DEBUG [org.hibernate.type.StringType] (btpool0-0:) returning &#039;aaaaa&#039; as column: name4_0_
2009-02-24 21:02:48,940  DEBUG [org.hibernate.type.IntegerType] (btpool0-0:) returning &#039;5&#039; as column: nbPerson3_4_0_
</pre>
<h2>Tracer les transactions Hibernate :</h2>
<p>Maintenant nous allons activer les logs sur les transactions hibernate, en modifiant le fichier de configuration log4j</p>
<pre class="brush: xml">
&amp;amp;amp;amp;amp;lt;logger name=&amp;amp;amp;amp;amp;quot;org.hibernate.transaction&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;level value=&amp;amp;amp;amp;amp;quot;DEBUG&amp;amp;amp;amp;amp;quot; /&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;/logger&amp;amp;amp;amp;amp;gt;
</pre>
<p>Ce qui vous donnera les traces suivantes</p>
<pre class="brush: text">
22:08:15,518 INFO  [STDOUT] 2009-02-11 22:08:15,518  DEBUG [org.hibernate.transaction.JDBCTransaction] (http-127.0.0.1-8080-2:) begin
22:08:15,524 INFO  [STDOUT] 2009-02-11 22:08:15,524  DEBUG [org.hibernate.transaction.JDBCTransaction] (http-127.0.0.1-8080-2:) current autocommit status: true
22:08:15,524 INFO  [STDOUT] 2009-02-11 22:08:15,524  DEBUG [org.hibernate.transaction.JDBCTransaction] (http-127.0.0.1-8080-2:) disabling autocommit
22:08:15,527 INFO  [STDOUT] 2009-02-11 22:08:15,527  DEBUG [com.cestpasdur.reservation.managedbeans.back.ReservationBean] (http-127.0.0.1-8080-2:) ChambreService.create : Chambre : [id: null], [name: aaaaa]
22:08:15,537 INFO  [STDOUT] Hibernate: /* insert com.cestpasdur.reservation.domain.Chambre */ insert into Chambre (name, nbPersonnes) values (?, ?)
22:08:15,613 INFO  [STDOUT] 2009-02-11 22:08:15,613  DEBUG [org.hibernate.transaction.JDBCTransaction] (http-127.0.0.1-8080-2:) commit
22:08:15,652 INFO  [STDOUT] 2009-02-11 22:08:15,652  DEBUG [org.hibernate.transaction.JDBCTransaction] (http-127.0.0.1-8080-2:) re-enabling autocommit
22:08:15,653 INFO  [STDOUT] 2009-02-11 22:08:15,653  DEBUG [org.hibernate.transaction.JDBCTransaction] (http-127.0.0.1-8080-2:) committed JDBC Connection
</pre>
<h2>Statistiques hibernate</h2>
<p>Il est possible d’activer les statistiques sur la sessionFactory hibernate, ce qui nous permettra d’obtenir entre autre les données suivantes :</p>
<ul>
<li>EntityNames,</li>
<li>ConnectCount,</li>
<li>EntityLoadCount,</li>
<li>FlushCount,</li>
<li>SessionOpenCount ...</li>
</ul>
<p>Fichier de configuration spring</p>
<pre class="brush: xml">
&amp;amp;amp;amp;amp;lt;bean id=&amp;amp;amp;amp;amp;quot;sessionFactory&amp;amp;amp;amp;amp;quot;
class=&amp;amp;amp;amp;amp;quot;org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;gt;
...
&amp;amp;amp;amp;amp;lt;property name=&amp;amp;amp;amp;amp;quot;hibernateProperties&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;value&amp;amp;amp;amp;amp;gt;
...
hibernate.generate_statistics=true
...
&amp;amp;amp;amp;amp;lt;/value&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;/property&amp;amp;amp;amp;amp;gt;
...
&amp;amp;amp;amp;amp;lt;/bean&amp;amp;amp;amp;amp;gt;
</pre>
<p>Il faut maintenant exporter ces données via JMX</p>
<pre class="brush: xml">
&amp;amp;amp;amp;amp;lt;bean id=&amp;amp;amp;amp;amp;quot;jmxExporter&amp;amp;amp;amp;amp;quot;
class=&amp;amp;amp;amp;amp;quot;org.springframework.jmx.export.MBeanExporter&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;property name=&amp;amp;amp;amp;amp;quot;beans&amp;amp;amp;amp;amp;quot;
&amp;amp;amp;amp;amp;lt;map&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;entry key=&amp;amp;amp;amp;amp;quot;Hibernate:name=statistics&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;ref local=&amp;amp;amp;amp;amp;quot;statisticsBean&amp;amp;amp;amp;amp;quot; /
&amp;amp;amp;amp;amp;lt;/entry&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;/map&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;/property
&amp;amp;amp;amp;amp;lt;/bean&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;bean id=&amp;amp;amp;amp;amp;quot;statisticsBean&amp;amp;amp;amp;amp;quot; class=&amp;amp;amp;amp;amp;quot;org.hibernate.jmx.StatisticsService&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;property name=&amp;amp;amp;amp;amp;quot;statisticsEnabled&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;value&amp;amp;amp;amp;amp;gt;true&amp;amp;amp;amp;amp;lt;/value&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;/property&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;property name=&amp;amp;amp;amp;amp;quot;sessionFactory&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;ref local=&amp;amp;amp;amp;amp;quot;sessionFactory&amp;amp;amp;amp;amp;quot;/&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;/property&amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;lt;/bean&amp;amp;amp;amp;amp;gt;
</pre>
<p>Si vous utilisez jboss, une console jmx est directement disponible sur le serveur :</p>
<p>http://localhost:8080/jmx-console/</p>
<p><img class="aligncenter size-full wp-image-66" title="console-jmx-jboss" src="http://www.cestpasdur.com/wp-content/uploads/2009/03/console-jmx-jboss.png" alt="console-jmx-jboss" width="500" height="277" /></p>
<p>Sinon, vous pouvez utiliser des outils tels que la JConsole fournie avec le JDK.</p>
<h2>Conclusion</h2>
<p>J’espère que cet article vous donnera quelques pistes concernant les traces à activer lors de vos développements. Pensez cependant à désactiver toutes ces traces en Re7 et en prod bien sûr...</p>

<p><a href="http://feedads.g.doubleclick.net/~a/aEx2N7p4hDiSx6TuRE4y_5fA6yk/0/da"><img src="http://feedads.g.doubleclick.net/~a/aEx2N7p4hDiSx6TuRE4y_5fA6yk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/aEx2N7p4hDiSx6TuRE4y_5fA6yk/1/da"><img src="http://feedads.g.doubleclick.net/~a/aEx2N7p4hDiSx6TuRE4y_5fA6yk/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/CestpasdurcomTutoriauxEtRessourcesDuWeb/~4/1B5FnxjHQQM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.cestpasdur.com/2009/02/23/hibernate-sous-le-capot-il-fait-quoi/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.cestpasdur.com/2009/02/23/hibernate-sous-le-capot-il-fait-quoi/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 3.519 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-03-11 01:55:13 -->
