<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-8951507323253822513</atom:id><lastBuildDate>Tue, 20 Mar 2012 16:06:16 +0000</lastBuildDate><category>linux</category><category>Tomcat</category><category>POO</category><category>Java EE</category><category>Maven</category><category>Trucs et astuces</category><category>culture</category><category>jboss</category><category>JSF</category><category>Outils</category><category>code</category><category>Java</category><category>Bases de données</category><title>Le blog de Mohamed Abdennebi</title><description></description><link>http://blog.abdennebi.com/</link><managingEditor>noreply@blogger.com (Mohamed A)</managingEditor><generator>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-2584270686756573042</guid><pubDate>Mon, 19 Apr 2010 07:05:00 +0000</pubDate><atom:updated>2010-04-18T15:07:30.115-07:00</atom:updated><title>Comment obtenir un accès root en exploitant une faille XSS, le cas Apache</title><description>&lt;p style="margin-left: 40px;"&gt;&lt;i&gt;Contexte : L'infrastructure technique de la fondation Apache a été victime d'une attaque &lt;a href="http://fr.wikipedia.org/wiki/Cross-site_scripting" target="_blank"&gt;XSS&lt;/a&gt; suivie d'une intrusion dans les systèmes. Les administrateurs ont reporté cet incident en détail et avec transparence&lt;/i&gt;&lt;i&gt;.&lt;a href="https://blogs.apache.org/infra/entry/apache_org_04_09_2010" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p style="margin-left: 40px;"&gt;&lt;i&gt;&lt;a href="https://blogs.apache.org/infra/entry/apache_org_04_09_2010" target="_blank"&gt;Ils ont fait état des erreurs &lt;/a&gt;qu’ils ont commises et ont établi des recommandations afin d'améliorer la sécurisation des infrastructures. Ce billet tente d'expliquer la partie XSS de l'attaque et d'offrir une analyse du point de vue du développeur, il livre enfin des recommandations pour vous aider à renforcer la sécurité de vos applications Web.&lt;/i&gt;&lt;br /&gt;&lt;/p&gt;Tout a commencé par une simple déclaration d'anomalie (issue INFRA-2591) dans le JIRA de la fondation Apache, un message aussi bref qu'énigmatique contenant un lien masqué par Tinyurl :&lt;br /&gt;&lt;p style="margin-bottom: 12pt; margin-left: 40px;"&gt; &lt;i&gt;«ive got this error while browsing some projects in jira http://tinyurl.com/XXXXXXXXX»&lt;/i&gt; (le Tinyurl a  été brouillé intentionnellement).&lt;br /&gt;&lt;/p&gt;Le lien recelait des intentions peu amicales : l'URL d'une page contenant une faille XSS complétée par un code JavaScript hostile. Le code JavaScript sous forme de paramètres HTTP fait deux choses : &lt;a href="http://www.owasp.org/index.php/Session_hijacking_attack" target="_blank"&gt;voler le cookie de session &lt;/a&gt;des administrateurs en l'envoyant à un serveur externe, puis, pour ne pas éveiller les soupçons, affiche une une &lt;i&gt;stack trace&lt;/i&gt; Java dans &lt;code&gt;pastie.org&lt;/code&gt; (site communautaire d'échange et de partage de texte) faisant croire qu'il y a eu vraiment un problème.&lt;br /&gt;&lt;br /&gt;Ce lien a été créé sur mesure pour une JSP contenant une faille XSS. Cette JSP quelconque ne contient pas de code spécialement sensible, elle affiche seulement une boite de dialogue pour choisir des couleurs (colorPicker.jsp) :&lt;br /&gt;&lt;div style="display: block; text-align: left; margin-left: 40px;"&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_1oEI6d664Wc/S8ttX8PvfjI/AAAAAAAAC20/gxgkp0mf1oE/url.jpg" border="0" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Dans cette page, on récupère deux paramètres : &lt;code&gt;element&lt;/code&gt; et &lt;code&gt;defaultColor&lt;/code&gt;, ces deux paramètres sont directement recopiés dans la page sans aucun contrôle d'assainissement !&lt;br /&gt;&lt;div style="display: block; text-align: left; margin-left: 40px;"&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_1oEI6d664Wc/S8ttgJLDU9I/AAAAAAAAC28/k9v6jyhNEXk/Colorpicker.jpg" border="0" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p style="margin-bottom: 12pt;"&gt;Pour exploiter cette faille, des valeurs pour &lt;code&gt;element&lt;/code&gt; et &lt;code&gt;defaultColor&lt;/code&gt; ont été judicieusement choisies, de façon à ce que le code ait un comportement spéciale. Si l'on observe bien les valeurs dans l'URL, elles sont presque inintelligibles, mais dès qu'on les injecte dans le code, celui-là change bizarrement de structure, on se rend compte rapidement de la supercherie : à la ligne 26 lorsque le moteur JavaScript exécute &lt;code&gt;opener.document.jiraform.name&lt;/code&gt;, cela génère une erreur, le flux d'exécution entre dans le bloc &lt;code&gt;catch&lt;/code&gt; dans lequel le navigateur envoie innocemment le cookie de l'utilisateur à un serveur, outrepassant carrément le&lt;br /&gt;principe du &lt;a href="https://developer.mozilla.org/En/Same_origin_policy_for_JavaScript" target="_blank"&gt;&lt;i&gt;Same Origin policy (SOP)&lt;/i&gt;&lt;/a&gt;&lt;b&gt;.&lt;/b&gt;&lt;/p&gt;Le serveur en question n'est qu'un site Web hébergé gratuitement sur une banale plateforme d'hébergement : PHP, Mysql, etc. Aucun risque pour le pirate.&lt;br /&gt;&lt;br /&gt;&lt;div style="display: block; text-align: left; margin-left: 40px;"&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_1oEI6d664Wc/S8ttnB9FRhI/AAAAAAAAC3E/1p1H0VGD8ZA/Colorpicker2.jpg" border="0" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;L'attaque ne s'arrête pas là, puisque le pirate a attaqué la mire de connexion par « recherche exhaustive » (brute force attack). Cette attaque n'a pas été détectée faute de présence d'outil adéquat (sa présence aurait aidé à détecter rapidement l'attaque).&lt;br /&gt;&lt;/p&gt;Une fois introduit dans le système, le pirate a remplacé l’écran d’authentification par un autre lui permettant de collecter des mots de passe grâce à une archive JAR injectée, cela m’a tout de suite rappelé l'excellente étude de &lt;i&gt;Philippe PRADOS&lt;/i&gt; qui démontre avec force détails la façon avec laquelle il est possible de compromettre une application Web en posant juste un fichier JAR. Les techniques sont nombreuses : injection d'une valve Tomcat, utilisation de l'AOP, de filtres J2EE, corruption de la configuration Spring ou la surcharge des parseurs XML du JDK (Un projet Google code consacré à cette étude &lt;a href="http://code.google.com/p/macaron/"&gt;http://code.google.com/p/macaron/&lt;/a&gt; a été mis en place, on y trouve notamment un PDF d'une soixantaine de pages, rédigé en français : surprenant, didactique et très riche en informations).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Comment prévenir ce genre d'attaques ?&lt;/h3&gt;&lt;h4&gt;En tant que développeurs&lt;br /&gt;&lt;/h4&gt;Heureusement, il est possible de se prémunir contre ce genre d'attaque et de manière efficace. Il suffit d'observer quelques règles de programmation simples à mettre en œuvre :&lt;br /&gt;&lt;p style="margin-left: 40px;"&gt;&lt;br /&gt;&lt;b&gt;Utilisez un filtre J2EE contre le XSS&lt;/b&gt; : il s'agit d'un filtre, qui se base sur des expressions rationnelles,  et qui va analyser la requête afin d'y déceler des combinaisons de caractères non autorisées dans le corps de la requête (par exemple &lt;code&gt;?clientId=&amp;lt;script&amp;gt;...&lt;/code&gt;) et de prendre les mesures adéquates : traçage de la requête, envoi d'un mail à l'administrateur, assainissement des valeurs (déspécialisation des caractères spéciaux, etc.).&lt;br /&gt;&lt;br /&gt;Validez votre filtre, en écrivant des tests unitaires basés sur les &lt;a href="http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet" target="_blank"&gt;préventions XSS&lt;/a&gt; et sur les &lt;i&gt;patterns XSS&lt;/i&gt; qu'il est facile de trouver sur la Toile.&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 40px;"&gt;&lt;b&gt;Utilisez le flag httpOnly&lt;/b&gt; : &lt;code&gt;httpOnly &lt;/code&gt;est un flag qui indique qu'un cookie ne peut être utilisé que pour les échanges HTTP. Aucun script ne pourra y accéder, même en présence de faille XSS, il sera impossible de subtiliser le cookie. Le flag &lt;code&gt;httpOnly &lt;/code&gt;fonctionne sur tous les navigateurs récents (y compris la famille IE puisqu'il a été inventé en 2002 par &lt;a href="http://msdn.microsoft.com/en-us/library/ms533046.aspx" target="_blank"&gt;Microsoft&lt;/a&gt;).&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 40px;"&gt;Le flag est concaténé à l'entête HTTP Set-Cookie de la façon suivante :&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 40px;"&gt;&lt;code&gt;Set-Cookie: SESSIONID=XXXXX; path=/;&lt;span style="color: rgb(255, 0, 0);"&gt;HttpOnly&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 40px;"&gt;Pour activer ce flag dans Tomcat, il suffit d'ajouter &lt;code&gt;&lt;span style="font-size:10pt;"&gt;useHttpOnly=True&lt;/span&gt;&lt;/code&gt; dans l'élément &lt;code&gt;&lt;span style="font-size:10pt;"&gt;&amp;lt;Context&amp;gt;&lt;/span&gt;&lt;/code&gt; du fichier &lt;code&gt;context.xml&lt;/code&gt; de l'application Web.&lt;br /&gt;&lt;/p&gt;&lt;pre style="margin-left: 59.76pt;"&gt;&lt;code&gt;&amp;lt;Context useHttpOnly="true" docBase="..."&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;...&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;/Context&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p style="margin-bottom: 12pt; margin-left: 40px;"&gt;&lt;b&gt;Utilisez un Firewall applicatif ou WAF (Web Application Firewall) &lt;/b&gt;: bien que cela intéresse surtout les opérateurs de production. Il est important de connaitre cette famille d'outils.&lt;br /&gt;Un WAF intervient au niveau Application du modèle OSI (différemment des firewalls qui analysent quant à eux le niveau réseau), il connait les protocoles et est capable de détecter des attaques en analysant le contenu des échanges (injection SQL, XSS, etc). Il se présente sous forme d'alliance ou sous forme de programme tel que &lt;a href="http://www.modsecurity.org/" target="_blank"&gt;mod_security &lt;/a&gt;(s'installe comme plugin dans le serveur Web Apache).&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 12pt; margin-left: 40px;"&gt;&lt;br /&gt;&lt;b&gt;Utilisez un outil d'analyseur statique de code :&lt;/b&gt; un outil tel que &lt;a href="http://fr.wikipedia.org/wiki/FindBugs" target="_blank"&gt;Findbugs&lt;/a&gt;, permet de détecter des faiblesses dans le code (par exemple, récrire directement un paramètre de la requête HTTP dans la réponse, ou inclure directement ce paramètre dans un statement SQL).&lt;/p&gt;&lt;div style="display: block; text-align: left; margin-left: 40px;"&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_1oEI6d664Wc/S8tt-JREIzI/AAAAAAAAC3M/Ol-MTYUY0zU/s576/findbugs.jpg" border="0" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h4&gt;En tant qu’utilisateurs&lt;/h4&gt;&lt;p style="margin-left: 40px;"&gt;&lt;b&gt;Ne cliquez jamais sur un lien rétréci&lt;/b&gt; (tinyurl, bitly, etc). Si vous utilisez Twitter, l'utilisation de réducteur d'URL est inévitable. Il existe, toutefois, des plugins pour les navigateurs qui décodent à la volée les liens raccourcis (http://longurl.org/tools ou http://www.longurlplease.com/ par&lt;br /&gt;exemple).&lt;/p&gt;&lt;div style="display: block; text-align: left; margin-left: 40px;"&gt; &lt;img src="http://lh5.ggpht.com/_1oEI6d664Wc/S8tuHqQ3kfI/AAAAAAAAC3U/3Fu6h_LDNnA/LoonURL.jpg" border="0" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p style="margin-bottom: 12pt; margin-left: 40px;"&gt;&lt;b&gt;Ne cliquez jamais sur un lien &lt;/b&gt;envoyé par une personne inconnue (en plus du risque de XSS, s'ajoute le risque d'attaque &lt;a href="http://fr.wikipedia.org/wiki/Cross-site_request_forgery" target="_blank"&gt;XSRF&lt;/a&gt;), même si vous connaissez la personne, il se peut que son identité soit usurpée.&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 12pt; margin-left: 40px;"&gt;&lt;br /&gt;&lt;b&gt;Armez-vous d'un plugin de sécurité&lt;/b&gt; dans votre navigateur. Depuis que j'utilise &lt;b&gt;NoScript&lt;/b&gt;, je ne peux plus m'en passer. À l'occasion de cet article, j'ai éprouvé l'efficacité de ce plugin sur la page piégée, le résultat ne m'a pas déçu (voir capture d'écran suivante).&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;div style="display: block; text-align: left; margin-left: 40px;"&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_1oEI6d664Wc/S8tuSJbsyKI/AAAAAAAAC3c/hB5yJy6baro/ybnf8xt.jpg" border="0" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p style="margin-bottom: 12pt; margin-left: 40px;"&gt; &lt;b&gt;Limitez la durée de vie de vos cookies&lt;/b&gt; : ne pas cocher «Se souvenir de moi» lorsque vous connectez.&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;Conclusion&lt;/h4&gt;&lt;p style="margin-left: 40px;"&gt;Cette affaire nous a montré qu'il suffit d'une faille, d'un relâchement de la vigilance des utilisateurs pour que la sécurité d'un système informatique s'effondre comme un château de cartes. Les espaces collaboratifs d'entreprise se multipliant (l'explosion des offres SaaS et l'émergence des réseaux sociaux pour entreprises en témoignent), la compromission d'un seul compte utilisateur peut potentiellement affecter la sécurité du système d'informations : vol de documents confidentiels, accès aux dossiers clients (CRM), dégradation, etc.. Cela est lié à la sophistication grandissante des technologies qui peut déstabiliser les utilisateurs et fléchir leur attention. Il est donc primordial, de les sensibiliser ainsi que  les développeurs aux problèmes de sécurité et de former ces derniers aux parades aux techniques d'attaque Web 2.0. Enfin, rendre les audits de sécurité systématiques et ne plus les sacrifier sur l’autel des « deadlines » nos assurera des livrables plus fiables et qui, à long terme, rentabiliseront largement l'investissement dans la sécurité.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-2584270686756573042?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2010/04/comment-obtenir-un-acces-root-en.html</link><author>noreply@blogger.com (Mohamed A)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_1oEI6d664Wc/S8ttX8PvfjI/AAAAAAAAC20/gxgkp0mf1oE/s72-c/url.jpg' height='72' width='72'/><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-3701009008116736477</guid><pubDate>Wed, 11 Mar 2009 21:32:00 +0000</pubDate><atom:updated>2009-03-12T05:23:15.843-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Outils</category><category domain='http://www.blogger.com/atom/ns#'>Maven</category><title>JBoss TattleTale, un outil de vérification de dépendances</title><description>&lt;div style="text-align: justify;"&gt;Actuellement, j'effectue la migration vers Maven de quelques applications historiques. La difficulté de cette tâche réside dans le dépouillement et l'inventaire des fichiers JAR desquels dépend une application. En effet, on se retrouve face à un amas de fichiers JAR parmi lesquels se trouvent des fichiers JAR doublons (avec un nom différent ou une version différente), des fichiers JAR appartenant au serveur d'applications (par exemple, servlet.jar ou connector.jar), d'autres qui ne sont pas ou plus utilisés par l'application et parfois même des fichiers JAR de bibliothèques de tests unitaires (par exemple junit.jar). Le travail consiste alors à ne garder que les JAR qui sont réellement utilisés et d'éliminer (avec la plus grande précaution) tous les autres. Il va sans dire que s’attaquer à un tel problème à « mains nues »  n'est pas une mince affaire.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;C'est en cherchant un outil de vérification de dépendances que je suis tombé sur l'utilitaire « JBoss Tattletale », qui à ma grande chance vient de sortir (en version bêta) des laboratoires de JBoss (voir l'annonce sur le &lt;a href="http://in.relation.to/Bloggers/IntroducingJBossTattletale10BETA1" target="_blank"&gt;Blog&lt;/a&gt; de JBoss).&lt;br /&gt;Cet outil permet de vérifier les dépendances entre les fichiers JAR présents dans un même répertoire (considéré comme un classpath). Ses fonctionnalités les plus re&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_1oEI6d664Wc/Sbg_JHHLplI/AAAAAAAABbg/C7VuAwGXwBk/s1600-h/TattleTale2.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 311px;" src="http://2.bp.blogspot.com/_1oEI6d664Wc/Sbg_JHHLplI/AAAAAAAABbg/C7VuAwGXwBk/s320/TattleTale2.jpg" alt="" id="BLOGGER_PHOTO_ID_5312065186244044370" border="0" /&gt;&lt;/a&gt;marquables sont :&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Identifier les dépendances entre les fichiers JAR (par exemple, hibernate-3.1.3.jar dépendant de antlr-2.7.6rc1.jar)&lt;/li&gt;&lt;li&gt;Lister les classes dont dépend un fichier JAR et  lister celles qu'il expose.&lt;/li&gt;&lt;li&gt;Lister les classes dont dépend un JAR, mais qui sont absentes du classpath.&lt;/li&gt;&lt;li&gt;Lister les classes présentes dans le classepath et les fichiers JAR dans lesquels elles se trouvent&lt;/li&gt;&lt;li&gt;Alerter si une classe est présente dans plusieurs fichiers JAR.&lt;/li&gt;&lt;/ul&gt;&lt;p style="text-align: justify;"&gt;L'outil s'utilise en ligne de commande et sa prise en main est rapide. Il génère un rapport au format HTML dans lequel on peut naviguer aisément (voir la capture d'écran ci-contre).&lt;/p&gt;&lt;div style="text-align: justify;"&gt;Cet outil m'a vraiment aidé à effectuer la vérification des dépendances lors de la phase préliminaire de migration vers Maven. Malheureusement, il ne dispose pas (pour l'instant?) de plugin Maven permettant l'automatisation de cette tâche (de son coté, ANT dispose déjà d'une tâche tattletale).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Enfin, si vous vous demandez ce que veut dire «tattletale» sa définition se trouve &lt;a href="http://en.wiktionary.org/wiki/tattletale"&gt;ici&lt;/a&gt;. En résumé, «tattletale» est une personne commère qui révèle les secrets. On voit bien que e nom n'a pas été choisi par hasard !&lt;/div&gt;&lt;div style="text-align: justify;"&gt;L'outil, qui me semble très prometteur, en est tout juste à ces débuts. Souhaitons-lui un bel avenir!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Liens utiles :&lt;/span&gt;&lt;br /&gt;&lt;p style="text-align: left;"&gt;Téléchargement : &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=22866&amp;amp;package_id=311046&amp;amp;release_id=665534"&gt;http://sourceforge.net/project/showfiles.php?group_id=22866&amp;amp;package_id=311046&amp;amp;release_id=665534&lt;/a&gt; (800ko environ)&lt;/p&gt; &lt;p align="left"&gt;JIRA : &lt;a class="linkification-ext" href="https://jira.jboss.org/jira/browse/TTALE" title="Linkification: https://jira.jboss.org/jira/browse/TTALE"&gt;https://jira.jboss.org/jira/browse/TTALE&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-3701009008116736477?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2009/03/jboss-tattletale-un-outil-de.html</link><author>noreply@blogger.com (Mohamed A)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_1oEI6d664Wc/Sbg_JHHLplI/AAAAAAAABbg/C7VuAwGXwBk/s72-c/TattleTale2.jpg' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-1177784791773329980</guid><pubDate>Fri, 06 Mar 2009 23:00:00 +0000</pubDate><atom:updated>2009-03-07T12:16:26.505-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Java</category><category domain='http://www.blogger.com/atom/ns#'>Trucs et astuces</category><title>Comment lire la version d'un JAR à partir du fichier « Manifest » ?</title><description>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Toute application doit avoir un numéro de version. Il permet d'identifier aisément, entre autres, la branche du code source à l'origine de sa création (pour corriger des bogues, effectuer des évolutions, etc.). La technique la plus répandue c'est d'écrire le numéro de version dans un fichier de propriétés (properties) dont le contenu pourrait ressembler à ce qui suit :&lt;/div&gt;&lt;br /&gt;&lt;span class="code"&gt;application.version=1.0b&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Il est alors possible à l'application d'extraire le numéro de version pour l'afficher dans la barre de titre, par exemple, ou l'utiliser dans la trace applicative. Ce procédé vous oblige à maintenir le fichier et à veiller à incrémenter correctement le numéro de version.&lt;br /&gt;&lt;br /&gt;Bonne nouvelle si vous utilisez Maven : vous n’aurez plus à effectuer cette tache ! En effet, Maven inscrit systématiquement le numéro de version dans le Manifest (MANIFEST.MF) des JAR qu'il produit (le numéro de version est exactement le même que celui qui figure dans le POM du projet Maven).&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Comment extraire le numéro de version ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Commençons par un code simple. Cela se fait en deux étapes : charger le fichier &lt;span class="code"&gt;MANIFEST.MF&lt;/span&gt;, puis lire son contenu grâce à la classe &lt;span class="code"&gt;java.util.jar.Manifest&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;La classe suivante est « packagée » dans un jar nommé &lt;span class="code"&gt;version.jar&lt;/span&gt;.&lt;br /&gt;&lt;pre name="code" class="java"&gt;public class VersionUtil {&lt;br /&gt;&lt;br /&gt;public static void main(String[] args) throws IOException {&lt;br /&gt;    System.out.println(readVersion());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static String readVersion() throws IOException {&lt;br /&gt;&lt;br /&gt;    InputStream in = VersionUtil.class.getResourceAsStream("/META-INF/MANIFEST.MF");&lt;br /&gt;&lt;br /&gt;    Manifest manifest = new Manifest(in);&lt;br /&gt;&lt;br /&gt;    // Lire la propriété "Implementation-Version" du Manifest&lt;br /&gt;&lt;br /&gt;    String version = manifest.getMainAttributes().getValue(Attributes.Name.IMPLEMENTATION_VERSION);&lt;br /&gt;&lt;br /&gt;    return version;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Le code ci-dessus fonctionne sans erreur, mais affiche quand même un résultat erroné : &lt;span class="code"&gt;1.5.0_10&lt;/span&gt;. Il correspond en réalité au numéro de version du JDK. Le ficher &lt;span class="code"&gt;MANIFEST.MF&lt;/span&gt; chargé n'était «manifestement» pas celui du JAR en question, mais celui de &lt;span class="code"&gt;rt.jar&lt;/span&gt; (le jar qui contient les classes de base de Java). L'explication est la suivante : la méthode &lt;span class="code"&gt;getResourceAsStream(..)&lt;/span&gt; délègue la lecture de &lt;span class="code"&gt;MANIFEST.MF&lt;/span&gt; au &lt;span style="font-style: italic;"&gt;chargeur de classe&lt;/span&gt; (classloader) de la classe &lt;span class="code"&gt;VersionUtil.class&lt;/span&gt;, or ce chargeur de classe se trouve dans &lt;span class="code"&gt;rt.jar&lt;/span&gt; et non dans &lt;span class="code"&gt;version.jar&lt;/span&gt;. Pour qu'une classe puisse charger le fichier &lt;span class="code"&gt;MANIFEST.MF&lt;/span&gt; du JAR dans lequel elle se trouve, elle recourt à une méthode utilitaire qui calcule le chemin dudit JAR. Elle déduit ensuite l'emplacement du Manifest.&lt;br /&gt;&lt;br /&gt;L'extrait de code Java montre comment le chemin vers le &lt;span class="code"&gt;MANIFEST.MF&lt;/span&gt; est trouvé. J'avoue que le code est un peu alambiqué, mais heureusement il est commenté. La méthode présente l'avantage de fonctionner, et pour une classe se trouvant dans un jar, et pour une classe se trouvant dans un répertoire. Pour une meilleure compréhension, j'ai mis en commentaires le contenu des variables à chaque étape, et ce, pour les deux cas précités.&lt;br /&gt;&lt;/div&gt;&lt;pre name="code" class="java"&gt;private static String getPathToManifest(){&lt;br /&gt;&lt;br /&gt;// 1 - Lire le nom de la classe&lt;br /&gt;String classSimpleName = VersionUtil.class.getSimpleName() + ".class";&lt;br /&gt;// classSimpleName = VersionUtil.class&lt;br /&gt;&lt;br /&gt;// 2 - Récupérer le chemin physique de la classe&lt;br /&gt;String pathToClass = VersionUtil.class.getResource(classSimpleName).toString();&lt;br /&gt;&lt;br /&gt;// pathToClass = file:/C:/workspace/VersionUtil/bin/com/abdennebi/version/VersionUtil.class&lt;br /&gt;// pathToClass = jar:file:/C:/version.jar!/com/abdennebi/version/VersionUtil.class&lt;br /&gt;&lt;br /&gt;// 3 - Récupérer le chemin de la classe à partir de la racine du classpath&lt;br /&gt;String classFullName = VersionUtil.class.getName().replace('.', '/') + ".class";&lt;br /&gt;// classFullName = com/abdennebi/version/VersionUtil.class&lt;br /&gt;&lt;br /&gt;// 4 - Récupérer le chemin complet vers MANIFEST.MF&lt;br /&gt;String pathToManifest = pathToClass.substring( 0, pathToClass.length() - (classFullName.length())) + "META-INF/MANIFEST.MF";&lt;br /&gt;// pathToManifest = file:/C:/workspace/VersionUtil/bin/META-INF/MANIFEST.MF&lt;br /&gt;// pathToManifest = jar:file:/C:/version.jar!/META-INF/MANIFEST.MF&lt;br /&gt;&lt;br /&gt;return pathToManifest;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;L'exemple complet se trouve à cet endroit &lt;a href="http://code.google.com/p/abdennebi/source/browse/trunk/VersionUtil/src/com/abdennebi/version/VersionUtil.java"&gt;VersionUtil.java&lt;/a&gt;. Une modification pour Java 1.4 se trouve ici : &lt;a href="http://code.google.com/p/abdennebi/source/browse/trunk/VersionUtil14/src/com/abdennebi/version/VersionUtil14.java"&gt;VersionUtil14.java&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-1177784791773329980?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2009/03/comment-lire-la-version-dun-jar-partir.html</link><author>noreply@blogger.com (Mohamed A)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-7506127345286513974</guid><pubDate>Fri, 16 Jan 2009 11:31:00 +0000</pubDate><atom:updated>2009-01-18T10:55:29.150-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Trucs et astuces</category><category domain='http://www.blogger.com/atom/ns#'>Maven</category><title>Maven, considérer le répertoire source comme un répertoire de ressources</title><description>&lt;div style="text-align: justify;"&gt;Par défaut, Maven sépare les sources java des autres ressources, telles que les fichiers &lt;span style="font-style: italic;"&gt;properties&lt;/span&gt; ou les fichiers XML. Ceci, constitue en général, une bonne pratique. Cependant, si vous migrez une application et que vous ne désirez pas séparer les ressources des sources Java, il est impératif d'en informer Maven, sinon vous risquerez d'avoir des surprises (un WAR sans le moindre fichier &lt;span style="font-style: italic;"&gt;properties&lt;/span&gt;).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Pour ce faire, ajoutez ce bout de code XML au fichier POM de votre projet :&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&lt;build&gt;&lt;br /&gt;...&lt;br /&gt;&lt;resources&gt;&lt;br /&gt;    &lt;resource&gt;&lt;br /&gt;        &lt;directory&gt;src/main/java&lt;/directory&gt;&lt;br /&gt;        &lt;excludes&gt;&lt;br /&gt;            &lt;exclude&gt;**/*.java&lt;/exclude&gt;&lt;br /&gt;        &lt;/excludes&gt;&lt;br /&gt;    &lt;/resource&gt;&lt;br /&gt;&lt;/resources&gt;&lt;br /&gt;...&lt;br /&gt;&lt;/build&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Cette déclaration informe Maven que le répertoire &lt;span class="code"&gt;src/main/java&lt;/span&gt; contient des ressources et qu'il ne faut pas prendre en compte les fichiers Java (sinon ils risquent d'être inclus dans l'artéfact généré par Maven).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-7506127345286513974?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2009/01/maven-considrer-le-rpertoire-source.html</link><author>noreply@blogger.com (Mohamed A)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-4889122122214960022</guid><pubDate>Fri, 09 Jan 2009 09:53:00 +0000</pubDate><atom:updated>2009-01-09T02:01:31.313-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Trucs et astuces</category><category domain='http://www.blogger.com/atom/ns#'>Maven</category><title>Ajoutez un deuxième répertoire source à votre projet Maven</title><description>&lt;div style="text-align: justify;"&gt;Actuellement, je m'occupe de la migration du code d'une application historique vers Maven. Cette application contient deux répertoires sources Java, l'un contient du code généré (des proxies PacBase), et l'autre contient le code écrit par le programmeur. Pour ce faire, il faut indiquer à Maven d'utiliser un répertoire supplémentaire à savoir &lt;span style="font-family:courier new;"&gt;src/main/javaproxie&lt;/span&gt; (en plus du classique &lt;span style="font-family:courier new;"&gt;src/main/java&lt;/span&gt;).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Maven permet de définir un répertoire source différent du répertoire source conventionnel grâce à la déclaration suivante (en prenant comme exemple &lt;span style="font-family:courier new;"&gt;src/main/javaproxies&lt;/span&gt;):&lt;br /&gt;&lt;/div&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&lt;build&gt;&lt;br /&gt; &lt;sourcedirectory&gt;src/main/javaproxies&lt;/sourcedirectory&gt;&lt;br /&gt;&lt;/build&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Le problème est qu'il n'est pas possible d'ajouter (nativement) un nouveau répertoire source. C'est plutôt le rôle du plugin &lt;a href="http://mojo.codehaus.org/build-helper-maven-plugin/index.html"&gt;build-helper&lt;/a&gt; et son &lt;span style="font-style: italic;"&gt;goal &lt;/span&gt;&lt;a href="http://mojo.codehaus.org/build-helper-maven-plugin/usage.html"&gt;add-source&lt;/a&gt;, il permet, en effet, de définir plusieurs répertoires sources de la manière suivante :&lt;br /&gt;&lt;/div&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&lt;build&gt;&lt;br /&gt; &lt;plugins&gt;&lt;br /&gt;  &lt;plugin&gt;&lt;br /&gt;     &lt;groupid&gt;org.codehaus.mojo&lt;/groupid&gt;&lt;br /&gt;     &lt;artifactid&gt;build-helper-maven-plugin&lt;/artifactid&gt;&lt;br /&gt;     &lt;executions&gt;&lt;br /&gt;       &lt;execution&gt;&lt;br /&gt;         &lt;id&gt;add-source&lt;/id&gt;&lt;br /&gt;         &lt;phase&gt;generate-sources&lt;/phase&gt;&lt;br /&gt;         &lt;goals&gt;&lt;br /&gt;           &lt;goal&gt;add-source&lt;/goal&gt;&lt;br /&gt;         &lt;/goals&gt;&lt;br /&gt;         &lt;configuration&gt;&lt;br /&gt;           &lt;sources&gt;&lt;br /&gt;               &lt;source&gt;src/main/javaproxies&lt;/source&gt;&lt;br /&gt;           &lt;/sources&gt;&lt;br /&gt;         &lt;/configuration&gt;&lt;br /&gt;       &lt;/execution&gt;&lt;br /&gt;     &lt;/executions&gt;&lt;br /&gt; &lt;/plugin&gt;&lt;br /&gt;&lt;/plugins&gt;&lt;br /&gt;&lt;/build&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;En résumé, dans des situations où il est nécessaire d'utiliser un répertoire source supplémentaire, par exemple du code généré par xDoclet, des stubs et proxies Corba ou Web Services, ce plugin vous sauvera la vie !&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-4889122122214960022?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2009/01/ajoutez-un-deuxime-rpertoire-source.html</link><author>noreply@blogger.com (Mohamed A)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-1241837318826497230</guid><pubDate>Wed, 17 Dec 2008 12:21:00 +0000</pubDate><atom:updated>2008-12-17T16:16:42.083-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Bases de données</category><category domain='http://www.blogger.com/atom/ns#'>Java</category><category domain='http://www.blogger.com/atom/ns#'>Trucs et astuces</category><category domain='http://www.blogger.com/atom/ns#'>code</category><title>Connaitre la version d'un driver JDBC</title><description>&lt;div style="text-align: justify;"&gt;Un des soucis majeurs d'un développeur Maven est de tomber sur un JAR propriétaire et par-dessus le marché sans aucune indication de version. Tel était mon cas. Actuellement, je migre une ancienne application vers Maven, elle utilise un driver DB2 dont le JAR ne contient pas le numéro de version qu'on trouve habituellement dans &lt;span class="code"&gt;META-INF/MANIFEST.MF&lt;/span&gt;. Heureusement, JDBC prévoit la possibilité de récupérer le numéro de version d'un driver et ce, à l'aide de la classe &lt;a href="http://java.sun.com/javase/6/docs/api/java/sql/DatabaseMetaData.html"&gt;DatabaseMetaData&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Le code suivant charge le driver JDBC, puis se connecte à la base de données (l'inconvénient est l'obligation de se connecter à une base de données, je n'ai pas trouvé mieux !), il fait ensuite appel à la méthode &lt;span class="code"&gt;getDriverVersion()&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;import java.sql.Connection;&lt;br /&gt;import java.sql.DatabaseMetaData;&lt;br /&gt;import java.sql.DriverManager;&lt;br /&gt;import java.sql.SQLException;&lt;br /&gt;&lt;br /&gt;public class Version {&lt;br /&gt;&lt;br /&gt; public static void main(String args[]) throws InstantiationException,&lt;br /&gt;   IllegalAccessException, ClassNotFoundException, SQLException {&lt;br /&gt;     Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance();&lt;br /&gt;     Connection con = DriverManager.&lt;br /&gt;     getConnection("jdbc:db2://&amp;lt;nom de la base&amp;gt;", "&amp;lt;utilisateur&amp;gt;", "&amp;lt;mot de passe&amp;gt;");&lt;br /&gt;     DatabaseMetaData dmd = con.getMetaData();&lt;br /&gt;     System.out.println("La version du driver est : " + dmd.getDriverVersion());&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-1241837318826497230?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2008/12/connaitre-la-version-dun-driver-jdbc.html</link><author>noreply@blogger.com (Mohamed A)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-4197772260185323933</guid><pubDate>Mon, 24 Dec 2007 22:26:00 +0000</pubDate><atom:updated>2008-12-17T02:56:31.974-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Java</category><title>Quelle est la différence entre ClassNotFoundException et NoClassDefFoundError</title><description>En tant que développeurs Java, nous avons tous rencontré ces deux exceptions. Ceci dit, elles sont souvent confondues, car elles signalent toutes les deux qu'une classe n'a pu être chargée.&lt;br /&gt;Premièrement, &lt;span class="code"&gt;ClassNotFoundException&lt;/span&gt; est une &lt;strong&gt;&lt;em&gt;&lt;span class="code"&gt;Exception&lt;/span&gt; &lt;/em&gt;&lt;/strong&gt;alors que &lt;span class="code"&gt;NoClassDefFoundError&lt;/span&gt; est de type &lt;strong&gt;&lt;em&gt;&lt;span class="code"&gt;Error&lt;/span&gt;.&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;D'après la javadoc &lt;span class="code"&gt;ClassNotFoundException&lt;/span&gt; est renvoyée lorsqu'une application essaye de charger dynamiquement une classe à travers son nom, en utilisant entre autre la méthode &lt;strong&gt;Class.forName()&lt;/strong&gt;, mais la classe n'est pas trouvée dans le CLASSPATH.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Exemple&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Soit la classe suivante :&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class A {&lt;br /&gt; public static void main(String[] args) throws ClassNotFoundException {&lt;br /&gt;  Class.forName("ClasseQuiNexistePas");&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Son exécution prévoquera l'exception suivante :&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;Exception in thread "main" &lt;strong&gt;java.lang.ClassNotFoundException&lt;/strong&gt;: ClasseQuiNexistePas&lt;br /&gt;at java.net.URLClassLoader$1.run(Unknown Source)&lt;br /&gt;at java.security.AccessController.doPrivileged(Native Method)&lt;br /&gt;at java.net.URLClassLoader.findClass(Unknown Source)&lt;br /&gt;at java.lang.ClassLoader.loadClass(Unknown Source)&lt;br /&gt;at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)&lt;br /&gt;at java.lang.ClassLoader.loadClass(Unknown Source)&lt;br /&gt;at java.lang.ClassLoader.loadClassInternal(Unknown Source)&lt;br /&gt;at java.lang.Class.forName0(Native Method)&lt;br /&gt;at java.lang.Class.forName(Unknown Source)&lt;br /&gt;at A.main(A.java:6)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="code"&gt;NoClassDefFoundError&lt;/span&gt; est renvoyée lorsque une Classe &lt;span class="code"&gt;A&lt;/span&gt; ne trouve pas une autre classe &lt;span class="code"&gt;B&lt;/span&gt; delaquelle elle dépend, alors qu'au moment de la compilation la classe &lt;span class="code"&gt;B&lt;/span&gt; est présente.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Exemple&lt;/strong&gt;&lt;br /&gt;Soit les deux classes &lt;span class="code"&gt;A&lt;/span&gt; et &lt;span class="code"&gt;B&lt;/span&gt; :&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;class A {&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  B b = new B();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class B {  }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Compilez les deux classes, ensuite supprimer le fichier &lt;span class="code"&gt;B.class&lt;/span&gt; et lancer la classe &lt;span class="code"&gt;A&lt;/span&gt; (&lt;span class="code"&gt;java A&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;Résultat&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;Exception in thread "main" &lt;strong&gt;java.lang.NoClassDefFoundError&lt;/strong&gt;: B&lt;br /&gt;at test2.A.main(A.java:6)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-4197772260185323933?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2007/12/quelle-est-la-diffrence-entre.html</link><author>noreply@blogger.com (Mohamed A)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-3054281363846348266</guid><pubDate>Thu, 05 Jul 2007 21:25:00 +0000</pubDate><atom:updated>2008-12-17T02:57:25.977-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Java EE</category><title>Transactions Distribuées en dehors d’un container Java EE</title><description>Il est possible d'utiliser les transactions distribuées en dehors d'un serveur d'application Java EE, par exemple dans Tomcat ou dans une application Java autonome, et ce, grâce à des implémentations &lt;a title="Java Transaction API" href="http://java.sun.com/products/jta/"&gt;JTA &lt;/a&gt;telles que &lt;a href="http://labs.jboss.com/jbosstm/"&gt;JBossTS&lt;/a&gt;, &lt;a href="http://www.atomikos.com/home.html"&gt;Atomikos  &lt;/a&gt;ou &lt;a href="http://www.bitronix.be/Btm/Overview"&gt;Bitronix Transaction Manager&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-3054281363846348266?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2007/07/transactions-distribues-en-dehors-d.html</link><author>noreply@blogger.com (Mohamed A)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-1140820630501458502</guid><pubDate>Mon, 21 May 2007 21:23:00 +0000</pubDate><atom:updated>2008-12-17T16:04:40.992-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Bases de données</category><category domain='http://www.blogger.com/atom/ns#'>Trucs et astuces</category><title>Trouver l’explication d’une erreur Oracle</title><description>&lt;div style="text-align: justify;"&gt;Si vous êtes en face d'un code erreur de la base de données Oracle (de type ora-XXXXX), tapez le nom d'erreur en tant qu'un sous domaine du site ora-code.com et vous aurez le texte expliquant la cause de l'erreur.&lt;br /&gt;&lt;br /&gt;Par exemple, pour le code erreur &lt;strong&gt;&lt;code&gt;ora-00906&lt;/code&gt;&lt;/strong&gt; le lien  est &lt;a target="_blank" title="http://ora-00906.ora-code.com" href="http://ora-00906.ora-code.com/"&gt;http://ora-00906.ora-code.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Il y a même une rubrique qui indique l'action a entreprendre pour régler le problème. ça peut servir ....&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-1140820630501458502?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2007/05/si-vous-tes-en-face-dun-code-erreur-de.html</link><author>noreply@blogger.com (Mohamed A)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-6139929716248348281</guid><pubDate>Wed, 21 Mar 2007 21:22:00 +0000</pubDate><atom:updated>2008-12-17T02:58:39.971-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>JSF</category><title>Ericsson sort son “Mobile JSF Kit”</title><description>&lt;div class="entryContent"&gt;Ericsson vient d'annoncer la disponibilité de son &lt;a href="http://www.ericsson.com/mobilityworld/sub/open/technologies/open_development_tips/tools/mobile_jsf_kit"&gt;"Mobile JSF Kit"&lt;/a&gt;. C'est un kit de développement constitué d'une nouvelle bibliothèque JSF,nommée &lt;strong&gt;MobileFaces&lt;/strong&gt;, de la documentation et d'exemples d'utilisation.&lt;img src="http://www.ericsson.com/mobilityworld/developerszoneimages/img/open/open_development_tips/markup.gif" /&gt;&lt;br /&gt;&lt;br /&gt;D'après &lt;a href="http://www.ericsson.com/mobilityworld/developerszonedown/downloads/open_development_tips/Mobile_JSF.pdf"&gt;la présentation&lt;/a&gt; accompagnant ce Kit, MobileFaces est une surcouche de JSF compatible avec n'importe quelle implémentation de JSF. Le framework détecte le type de client(mobile ou pc) et fait le rendu en conséquence (cf. schéma, source Ericsson). Il également noté que MobilesFaces est open source mais je n'ai pas vu de licence qui le confirme.&lt;br /&gt;&lt;br /&gt;JSF s'étend désormais aux mobiles et tien donc ses promesses! Reste à vérifier à tester la qualité de cette bibilothèque.&lt;br /&gt;&lt;br /&gt;Vous pouvez télécharger le Mobile JSF Kit &lt;a href="http://www.ericsson.com/mobilityworld/sub/open/technologies/open_development_tips/tools/mobile_jsf_kit"&gt;ici&lt;/a&gt;&lt;br /&gt;, mais il faut s'enregistrer au préalable.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-6139929716248348281?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2007/03/ericsson-sort-son-jsf-kit.html</link><author>noreply@blogger.com (Mohamed A)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-6187345785635522671</guid><pubDate>Sat, 17 Mar 2007 21:21:00 +0000</pubDate><atom:updated>2008-12-17T16:13:09.681-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>POO</category><title>Le Value Object</title><description>&lt;div class="entryContent"&gt;L'une des utilité des designs patterns est d'avoir un langage commun entre les développeurs,&lt;br /&gt;&lt;div class="abstract"&gt;ce n'est malheureusement pas le cas pour le pattern &lt;strong&gt;Value Object&lt;/strong&gt; qui est souvent utilisé dans des contextes différents,&lt;br /&gt;le rendant ainsi sujet à diverses interprétations.Dans un contexte J2EE, Value Object est synonyme de &lt;strong&gt;Data Transfert Object&lt;/strong&gt;,&lt;br /&gt;alors que dans un contexte Programmation Orienté Objet, il a une tout autre signification.Le but de cet article est de faire la lumière sur les Value Objects en donnant une définition claire et non ambiguë et en expliquant l'origine de la confusion.&lt;/div&gt;Dans un &lt;em&gt;modèle de domaine&lt;/em&gt; reposant sur les Pojos, on retrouve les entités métiers qui sont caractérisées par leur identité, lorsque l'entité est persistée à l'aide d'un ORM tel que Hibernate ou JDO, son identité correspond généralement à la clé primaire. D'un autre coté, on retrouve aussi des objets, simples, qui sont cette fois-ci, caractérisés par leur valeur et non par leur identité : ce sont les Value Objects.&lt;br /&gt;&lt;h4&gt;Quel est le rôle des Values Object dans le modèle objet ?&lt;/h4&gt;Comme je l'ai précisé plus haut, un value object est un objet qui est définit par la valeur de ces attributs, &lt;strong&gt;cela veut dire que deux instances qui ont les même valeurs sont égales et interchangeables&lt;/strong&gt;.&lt;br /&gt;Le rôle principal d'un value object est d'encapsuler des données plutôt que de fournir un comportement.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Exemples&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Prenons l'exemple d'une tâche désigné par l'objet &lt;span class="SourceText"&gt;Tache&lt;/span&gt;, dont l'intervalle d'exécution est représenté par  l'objet &lt;span class="SourceText"&gt;Intervalle&lt;/span&gt;. L'objet &lt;span class="SourceText"&gt;Intervalle&lt;/span&gt; a deux attributs &lt;span class="SourceText"&gt;dateDebut&lt;/span&gt; et &lt;span class="SourceText"&gt;dateFin&lt;/span&gt;, et il est possible de retarder une tâche d'un certain nombre de jours grâce à la méthode &lt;span class="SourceText"&gt;retarder(int nbrJours)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.jroller.com/resources/m/Medo/vo.png" /&gt;&lt;br /&gt;&lt;br /&gt;L'objet &lt;span class="SourceText"&gt;Intervalle&lt;/span&gt; est un value object, car il est centré sur les données (dates de début et de fin de l'exécution de la tâche) et il n'a pas un vrai comportement.&lt;br /&gt;Si je veux, par exemple, savoir si deux tâches ont le même intervalle d'exécution, j'écrirai de façon intuitive le code suivant :&lt;br /&gt;&lt;pre name="code" class="java"&gt;if (tache1.getIntervalle().equals(tache2.getIntervalle())) {&lt;br /&gt;&lt;br /&gt;faireQuelqueChose();&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Il y a des exemples connus de values object. On retrouve, hormis l'intervallede temps, un salaire, une Somme d'argent, une adresse, etc. Dans l'API standard de Java, les objets &lt;span class="SourceText"&gt;String&lt;/span&gt;, &lt;span class="SourceText"&gt;Integer&lt;/span&gt; et tous les objets représentant les types primitifs sont considérés comme des values objets.&lt;br /&gt;&lt;h4&gt;Propriétés des values objects&lt;/h4&gt;&lt;h5&gt;1 Un value object doit surcharger les méthodes equals() et de hashcode()&lt;/h5&gt;Les méthodes &lt;span class="SourceText"&gt;equals()&lt;/span&gt; et &lt;span class="SourceText"&gt;hashcode()&lt;/span&gt; permettent de dire si deux instances sont égales. Par défaut, elles sont calculées sur la base de l'adresse mémoire de l'objet.&lt;br /&gt;&lt;br /&gt;Pour les values objects ces deux méthodes sont basées sur les valeurs de attributs de l'objet.&lt;br /&gt;En parallèle, les méthodes &lt;span class="SourceText"&gt;equals()&lt;/span&gt; et &lt;span class="SourceText"&gt;hashcode()&lt;/span&gt; des entités métier persistantes sont basées sur les valeurs des attributs constituant la clé primaire.&lt;br /&gt;&lt;h5&gt;2 Un value object doit être immuable&lt;/h5&gt;Un object value doit être immuable et ce pour éviter le phénomène de « l'aliasing ». Un aliasing se produit dans le cas suivant :&lt;br /&gt;&lt;span class="SourceText"&gt;A&lt;/span&gt; et &lt;span class="SourceText"&gt;B&lt;/span&gt; partagent une propriété &lt;span class="SourceText"&gt;x&lt;/span&gt;, si &lt;span class="SourceText"&gt;B&lt;/span&gt; modifie &lt;span class="SourceText"&gt;x&lt;/span&gt; alors cette modification se répercute sur l'objet &lt;span class="SourceText"&gt;A&lt;/span&gt;, ce qui provoque des effets indésirables. Voici un exemple concret repris de [&lt;a href="http://www.blogger.com/post-edit.g?blogID=8951507323253822513&amp;amp;postID=6187345785635522671#vo1"&gt;1&lt;/a&gt;] :&lt;br /&gt;&lt;br /&gt;La méthode &lt;span class="SourceText"&gt;retarder()&lt;/span&gt; permet de retarder une tâche un certain nombre de jours :&lt;br /&gt;&lt;pre name="code" class="java"&gt;void retarder(int nbrJours) {&lt;br /&gt;this.intervalle.setDateDebut(this.intervalle.getDateDebut() + nbrJours);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Quel est le problème dans le code suivant ?&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;Tache tache1 = new Tache();&lt;br /&gt;&lt;br /&gt;Tache tache2 = new Tache();&lt;br /&gt;&lt;br /&gt;tache1.setIntervalle(new Intervalle("4 mars 2007", "29 mars 2007");&lt;br /&gt;&lt;br /&gt;tache2.setIntervalle(tache1.getIntervalle());&lt;br /&gt;&lt;br /&gt;tache2.retarder(5);&lt;/pre&gt;&lt;br /&gt;En observant le code attentivement, on remarque que la tache1 a également été retardée de cinq jours, et ce de manière totalement inaperçue et involontaire!&lt;br /&gt;&lt;br /&gt;Pour corriger l'exemple précédent, on interdit la modification des attributs de l'objet, et on créé à la place un nouvel objet avec les nouvelles valeurs. La méthode &lt;span class="SourceText"&gt;retarder()&lt;/span&gt; deviendrait :&lt;br /&gt;&lt;pre name="code" class="java"&gt;void retarder(int nbrJours) {&lt;br /&gt;this.intervalle = new Intervalle(this.intervalle.getDateDebut() + nbrJours);&lt;br /&gt;}&lt;/pre&gt;Sachez enfin, que rendre un objet immuable a des propriétés intéressantes, notamment  le partage du même objet entre plusieurs threads sans recourir à la synchronisation. Elles rendent le design robuste et améliorent les performances [&lt;a href="http://www.blogger.com/post-edit.g?blogID=8951507323253822513&amp;amp;postID=6187345785635522671#vo2"&gt;2&lt;/a&gt;][&lt;a href="http://www.blogger.com/post-edit.g?blogID=8951507323253822513&amp;amp;postID=6187345785635522671#vo3"&gt;3&lt;/a&gt;].&lt;br /&gt;&lt;br /&gt;On comprend maintenant pourquoi, par exemple, la classe &lt;span class="SourceText"&gt;java.lang.String&lt;/span&gt;  est immuable. En effet, une fois l'objet créé il n'est plus modifiable, il peut être partagée sans aliasing et sans aucun problème de multi-threading car les méthodes telles que &lt;span class="SourceText"&gt;substring()&lt;/span&gt; ou &lt;span class="SourceText"&gt;concat()&lt;/span&gt; retournent toujours un nouvel objet.&lt;br /&gt;&lt;h5&gt;3 Un value object peut être persisté sous certaines conditions&lt;/h5&gt;Bien entendu, un value object peut être persisté. Cependant, il ne doit pas correspondre à une ligne entière dans une table  [&lt;a href="http://www.blogger.com/post-edit.g?blogID=8951507323253822513&amp;amp;postID=6187345785635522671#vo4"&gt;4&lt;/a&gt;]. Les colonnes qui correspondent à ses attributs, s'ajoutent aux colonnes d'une entité persistante. Hibernate offre cette possibilité via le mécanisme de component  [&lt;a href="http://www.blogger.com/post-edit.g?blogID=8951507323253822513&amp;amp;postID=6187345785635522671#vo5"&gt;5&lt;/a&gt;].&lt;br /&gt;&lt;h4&gt;Pourquoi la confusion entre un value object et un DTO&lt;/h4&gt;Pour rappel, un &lt;a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObject.html"&gt;Data Transfert Object&lt;/a&gt; est utilisé dans les architectures distribuées, pour transporter les données entre la couche cliente et la couche métier (représentée par des EJB). Le but est de recevoir et d'envoyer un paquet de données (DTO) en un seul appel plutôt que des faire de multiples appels distants très coûteux en performance. Le seul point commun entre un value object et un DTO c'est qu'ils sont tous les deux centrés sur les données.&lt;br /&gt;L'origine de la confusion vient, en réalité, des premières versions des J2EE Core patterns de sun. En effet, en &lt;a href="http://web.archive.org/web/20011030061937/http://java.sun.com/j2ee/blueprints/design_patterns/value_object/"&gt;2001&lt;/a&gt; le DTO était appelé Value Object. Il ne l'est plus maintenant fort heuresement!&lt;br /&gt;&lt;h4&gt;Références&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;[&lt;a id="vo1"&gt;1&lt;/a&gt;] &lt;a href="http://c2.com/cgi/wiki?ValueObjectsShouldBeImmutable"&gt;Value Objects Should Be Immutable&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;[&lt;a id="vo2"&gt;2&lt;/a&gt;] &lt;a href="http://en.wikipedia.org/wiki/Immutable_object"&gt;http://en.wikipedia.org/wiki/Immutable_object&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;[&lt;a id="vo3"&gt;3&lt;/a&gt;] &lt;a href="http://www.javapractices.com/Topic29.cjp"&gt;http://www.javapractices.com/Topic29.cjp&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;[&lt;a id="vo4"&gt;4&lt;/a&gt;] &lt;a href="http://www.martinfowler.com/eaaCatalog/embeddedValue.html"&gt;Embedded Value&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;[&lt;a id="vo5"&gt;5&lt;/a&gt;] &lt;a href="http://www.hibernate.org/hib_docs/reference/fr/html/components.html"&gt;Documentation de référence de Hibernate : Mappings des composants&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-6187345785635522671?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2007/03/le-value-object.html</link><author>noreply@blogger.com (Mohamed A)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-2785558206242873952</guid><pubDate>Mon, 26 Feb 2007 22:20:00 +0000</pubDate><atom:updated>2008-12-17T02:59:39.452-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Tomcat</category><title>Lambda Probe, une console d’administration pour Tomcat</title><description>&lt;div class="entryContent"&gt;J'ai récemment découvert un outil de monitoring et de gestion pour le serveur d'application Apache Tomcat, il se nomme &lt;a href="http://lambdaprobe.org/"&gt;Lambda Probe&lt;/a&gt;.&lt;a href="http://lambdaprobe.org/"&gt;&lt;img src="http://www.jroller.com/resources/m/Medo/the-probe-logo.gif" /&gt;&lt;/a&gt;L'outil est riche en &lt;a href="http://www.lambdaprobe.org/d/overview.shtml"&gt;fonctionnalités&lt;/a&gt; mais il se distingue aussi par son interface &lt;a href="http://www.lambdaprobe.org/d/screenshots.shtml"&gt;agréable&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Enfin, si vous voulez vous forger une opinion, vous pouvez essayer la démo sur le site &lt;a href="http://lambdaprobe.org/"&gt;http://lambdaprobe.org/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Bonne nouvelle! J'ai testé Lambda Probe sur JBoss 4.0.2, ça marche et ça nous change de la JMX-Console!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-2785558206242873952?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2007/02/lambda-probe-une-console-d-pour-tomcat.html</link><author>noreply@blogger.com (Mohamed A)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-6495551487627672685</guid><pubDate>Sat, 17 Feb 2007 22:17:00 +0000</pubDate><atom:updated>2008-12-17T02:59:55.962-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>JSF</category><title>Woodstock : Un nouvel arrivant dans la famille des Composants JSF</title><description>&lt;div class="entryContent"&gt;D'après &lt;a href="http://blogs.sun.com/deepspace/entry/project_woodstock_open_sourced"&gt;ici&lt;/a&gt; et &lt;a href="http://blogs.sun.com/theaquarium/entry/woodstock_opensource_enteprise_quality_jsf"&gt;là&lt;/a&gt; &lt;a href="http://java.sun.com/"&gt;Sun&lt;/a&gt; rend publique et Open Source un projet de Composants JSF/Ajax nommé &lt;strong&gt;Woodstock&lt;/strong&gt;. La version actuelle est la 4.0.1, elle repose sur &lt;a href="http://java.sun.com/javaee/javaserverfaces/download.html"&gt;JSF 1.2&lt;/a&gt;Apparament cette bibliothèque est utilisée dans la console d'administration de GlassFish v2 M4&lt;br /&gt;&lt;br /&gt;&lt;img src="http://blogs.sun.com/theaquarium/resource/WoodstockPoster-99_140px.jpg" /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;Le lien du projet : &lt;a href="https://woodstock.dev.java.net/"&gt;https://woodstock.dev.java.net/&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Demo live des composants :&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="https://woodstock.dev.java.net/Preview.htm"&gt;https://woodstock.dev.java.net/Preview.htm&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://webdev1.sun.com/example/faces/index.jsp"&gt;http://webdev1.sun.com/example/faces/index.jsp&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-6495551487627672685?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2007/02/woodstock-un-nouvel-arrivant-dans-la.html</link><author>noreply@blogger.com (Mohamed A)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-8911096384445900594</guid><pubDate>Mon, 30 Jan 2006 22:13:00 +0000</pubDate><atom:updated>2008-12-17T03:00:23.048-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>JSF</category><title>A-t-on besoin d’un éditeur graphique pour faire des pages JSF ?</title><description>&lt;div class="entryContent"&gt;Beaucoup pensent que pour faire une application avec le framework JSF, il faudrait utiliser un outil visuel. En réalité, c'est faux, car pour créer une page JSP constituée de composants JSF, il suffit d'ajouter le tag correspondant au composant, de la même façon qu'on ajouterait un tag JSP classique.&lt;br /&gt;&lt;br /&gt;Cependant, l'utilisation d'un éditeur visuel est souvent profitable pour le développeur mais dans des cas bien précis.&lt;br /&gt;&lt;br /&gt;Pour vous permettre de vous forger une idée sur la nécessité d'un éditeur visuel, je présente ici les avantages et inconvénients de l'utilisation d'un tel outil.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Les avantages d'un développement manuel&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;Si on n'utilise pas d'éditeur visuel, on ajoute ses composants JSF à la page JSP d'une manière manuelle. Au fur et à mesure, le développeur maîtrisera les composants ainsi que leurs propriétés, il y aura donc un effort d'apprentissage supplémentaire mais le développeur appréhendera rapidement cette technologie.&lt;br /&gt;&lt;br /&gt;Voici par exemple une page de login simple, elle est suivit du code source qui a permit de donner un tel rendu :&lt;br /&gt;&lt;br /&gt;&lt;img src="http://jroller.com/resources/m/Medo/jsf-result.JPG" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="xml_tag"&gt;&amp;lt;%@&lt;/span&gt; &lt;span class="xml_tag"&gt;taglib&lt;/span&gt; &lt;span class="xml_att"&gt;uri&lt;/span&gt;&lt;span class="xml_tag"&gt;=&lt;/span&gt;&lt;span class="xml_value"&gt;"&lt;a title="Linkification: http://java.sun.com/jsf/html" class="linkification-ext" href="http://java.sun.com/jsf/html"&gt;http://java.sun.com/jsf/html&lt;/a&gt;"&lt;/span&gt; &lt;span class="xml_att"&gt;prefix&lt;/span&gt;&lt;span class="xml_tag"&gt;=&lt;/span&gt;&lt;span class="xml_value"&gt;"h"&lt;/span&gt;&lt;span class="xml_tag"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;%@&lt;/span&gt; &lt;span class="xml_tag"&gt;taglib&lt;/span&gt; &lt;span class="xml_att"&gt;uri&lt;/span&gt;&lt;span class="xml_tag"&gt;=&lt;/span&gt;&lt;span class="xml_value"&gt;"&lt;a title="Linkification: http://java.sun.com/jsf/core" class="linkification-ext" href="http://java.sun.com/jsf/core"&gt;http://java.sun.com/jsf/core&lt;/a&gt;"&lt;/span&gt; &lt;span class="xml_att"&gt;prefix&lt;/span&gt;&lt;span class="xml_tag"&gt;=&lt;/span&gt;&lt;span class="xml_value"&gt;"f"&lt;/span&gt;&lt;span class="xml_tag"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml_tag"&gt;f:view&lt;/span&gt;&lt;span class="xml_tag"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml_tag"&gt;html&lt;/span&gt;&lt;span class="xml_tag"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml_tag"&gt;head&lt;/span&gt;&lt;span class="xml_tag"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml_tag"&gt;meta&lt;/span&gt; &lt;span class="xml_att"&gt;http-equiv&lt;/span&gt;&lt;span class="xml_tag"&gt;=&lt;/span&gt;&lt;span class="xml_value"&gt;"Content-Type"&lt;/span&gt; &lt;span class="xml_att"&gt;content&lt;/span&gt;&lt;span class="xml_tag"&gt;=&lt;/span&gt;&lt;span class="xml_value"&gt;"text/html; charset=UTF-8"&lt;/span&gt;&lt;span class="xml_tag"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml_tag"&gt;title&lt;/span&gt;&lt;span class="xml_tag"&gt;&amp;gt;&lt;/span&gt;login&lt;span class="xml_tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml_tag"&gt;title&lt;/span&gt;&lt;span class="xml_tag"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml_tag"&gt;link&lt;/span&gt; &lt;span class="xml_att"&gt;type&lt;/span&gt;&lt;span class="xml_tag"&gt;=&lt;/span&gt;&lt;span class="xml_value"&gt;"text/css"&lt;/span&gt; &lt;span class="xml_att"&gt;rel&lt;/span&gt;&lt;span class="xml_tag"&gt;=&lt;/span&gt;&lt;span class="xml_value"&gt;"stylesheet"&lt;/span&gt; &lt;span class="xml_att"&gt;href&lt;/span&gt;&lt;span class="xml_tag"&gt;=&lt;/span&gt;&lt;span class="xml_value"&gt;"resources/main.css"&lt;/span&gt;&lt;span class="xml_tag"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml_tag"&gt;head&lt;/span&gt;&lt;span class="xml_tag"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml_tag"&gt;body&lt;/span&gt;&lt;span class="xml_tag"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml_tag"&gt;h1&lt;/span&gt;&lt;span class="xml_tag"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="xml_tag"&gt;h:outputText&lt;/span&gt; &lt;span class="xml_att"&gt;value&lt;/span&gt;&lt;span class="xml_tag"&gt;=&lt;/span&gt;&lt;span class="xml_value"&gt;"Please log-in"&lt;/span&gt;&lt;span class="xml_tag"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml_tag"&gt;h1&lt;/span&gt;&lt;span class="xml_tag"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml_tag"&gt;h:form&lt;/span&gt;&lt;span class="xml_tag"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml_tag"&gt;h:panelGrid&lt;/span&gt; &lt;span class="xml_att"&gt;columns&lt;/span&gt;&lt;span class="xml_tag"&gt;=&lt;/span&gt;&lt;span class="xml_value"&gt;"2"&lt;/span&gt;&lt;span class="xml_tag"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml_tag"&gt;h:outputLabel&lt;/span&gt; &lt;span class="xml_att"&gt;value&lt;/span&gt;&lt;span class="xml_tag"&gt;=&lt;/span&gt;&lt;span class="xml_value"&gt;"Login"&lt;/span&gt;&lt;span class="xml_tag"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml_tag"&gt;h:inputText&lt;/span&gt;&lt;span class="xml_tag"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml_tag"&gt;h:outputLabel&lt;/span&gt; &lt;span class="xml_att"&gt;value&lt;/span&gt;&lt;span class="xml_tag"&gt;=&lt;/span&gt;&lt;span class="xml_value"&gt;"Password"&lt;/span&gt;&lt;span class="xml_tag"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml_tag"&gt;h:inputSecret&lt;/span&gt;&lt;span class="xml_tag"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml_tag"&gt;h:commandButton&lt;/span&gt; &lt;span class="xml_att"&gt;value&lt;/span&gt;&lt;span class="xml_tag"&gt;=&lt;/span&gt;&lt;span class="xml_value"&gt;"Login"&lt;/span&gt; &lt;span class="xml_att"&gt;type&lt;/span&gt;&lt;span class="xml_tag"&gt;=&lt;/span&gt;&lt;span class="xml_value"&gt;"submit"&lt;/span&gt; &lt;span class="xml_att"&gt;action&lt;/span&gt;&lt;span class="xml_tag"&gt;=&lt;/span&gt;&lt;span class="xml_value"&gt;"#{loginBean.login}"&lt;/span&gt;&lt;span class="xml_tag"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml_tag"&gt;h:panelGrid&lt;/span&gt;&lt;span class="xml_tag"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml_tag"&gt;h:form&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml_tag"&gt;body&lt;/span&gt;&lt;span class="xml_tag"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml_tag"&gt;html&lt;/span&gt;&lt;span class="xml_tag"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml_tag"&gt;f:view&lt;/span&gt;&lt;span class="xml_tag"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;On remarquera dans le source que le code est accessible, et il ressemble fortement au langage HTML, il est doc tout à fait possible de l'écrire à la main.&lt;br /&gt;&lt;br /&gt;En résumé, ne pas utiliser un éditeur graphique, ne constitue en aucun cas un handicap, au contraire  le développeur aura un contrôle total sur le contenu de sa page, une page JSP garantit sans fioritures (apportées généralement par un éditeur visuelle).&lt;br /&gt;&lt;br /&gt;Le seul inconvénient que je connaisse est que il faut déployer l'application Web pour voir le résultat de la page.&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Les avantages d'utiliser un éditeur visuel&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;L'avantage est évident, on utilise la souris et on dépose ses composants sur la page, une parti du code est  écrite automatiquement, on aura même un rendu de la page de façon instantanée.&lt;br /&gt;&lt;br /&gt;Les éditeurs visuelles permettent aussi de visualiser le flux de navigation de votre application, il permettent d'avoir une vue globale sur l'application.&lt;br /&gt;&lt;br /&gt;&lt;img title="editeur visuel de la navigation dans une application JSF" src="http://jroller.com/resources/m/Medo/jsf-navigation.JPG" /&gt;&lt;br /&gt;&lt;br /&gt;L'inconvénient est que parfois l'utilisateur passe beaucoup de temps à cliquer de la souris pour des actions qui ne requièrent pas autant d'effort lorsque cela se fait à la main, l'éditeur visuel utilisé d'une manière mal à propos devient alors contre productif.&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;En résumé&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;Si vous voulez apprendre rapidement JSF, évitez un outil WYSIWYG, préférer plutôt la façon manuelle.&lt;br /&gt;&lt;br /&gt;Une fois que vous aviez appréhendé la technologie, vous pourriez dès lors utiliser d'une manières conjointe les deux méthodes. Vous auriez généralement à :&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Créer la page d'une manière visuelle.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Revoir le source, éventuellement le nettoyer.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Et enfin raffiner à la main le source des propriétés manquantes.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h2&gt;Quid des outils JSF ?&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;Le nombre d'outils JSF n'est pas très élevé vu la jeunesse de la technologie, dans les gratuits on peut citer Sun Java Creator 2, on trouve aussi des produits commerciaux tels que Exadel Studio et BEA Workshop, le monde libre s'est doté aussi d'un plugin Eclipse prometteur dénommé Amateras Faces IDE.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-8911096384445900594?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2006/01/t-on-besoin-d-diteur-graphique-pour.html</link><author>noreply@blogger.com (Mohamed A)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-5096362777640418794</guid><pubDate>Mon, 19 Dec 2005 22:11:00 +0000</pubDate><atom:updated>2008-12-16T14:12:27.590-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>JSF</category><title>Oracle ADF bientôt dans le giron de Apache</title><description>&lt;div class="entryContent"&gt;Lors de la conférence &lt;a href="http://www.javapolis.com/confluence/display/JP05/Home"&gt;JavaPolis 2005&lt;/a&gt; (qui s'est déroulée récemment en Belgique),&lt;br /&gt;Oracle a annoncé la donation de ADF Faces&lt;a href="#1"&gt;[1]&lt;/a&gt; à la fondation Apache. ADF Faces va rejoindre de ce fait &lt;a href="http://myfaces.apache.org"&gt;Apache MyFaces&lt;/a&gt;, l'excellente implémentation open source de JSF.D'après le &lt;a href="http://wiki.javapolis.com/confluence/display/JP05/Apache+MyFaces"&gt;wiki de JavaPolis&lt;/a&gt;, ADF + JSF constituera une librairie de 150 composants, tels que les calendriers, agendas, menus, mais aussi des composants AJAX.&lt;br /&gt;&lt;br /&gt;Excellente nouvelle pour le monde Java!&lt;br /&gt;&lt;br /&gt;Quelques liens :&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://myfaces.apache.org/tomahawk/overview.html"&gt;Les Composants fournis avec MyFaces&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://www.oracle.com/technology/products/jdev/htdocs/partners/addins/exchange/jsf/doc/tagdoc/core/imageIndex.html"&gt;&lt;br /&gt;Les composants Oracle ADF&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p style="font-size: 80%"&gt;[1]L'implémentation Oracle de JSF ainsi que des composants JSF&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-5096362777640418794?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2005/12/oracle-adf-bientt-dans-le-giron-de.html</link><author>noreply@blogger.com (Mohamed A)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-4697082703773657846</guid><pubDate>Mon, 21 Nov 2005 22:09:00 +0000</pubDate><atom:updated>2008-12-17T03:02:16.995-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>linux</category><title>Comment régler le problème de Swing avec Fedora Core 4</title><description>&lt;div class="entryContent"&gt;En utilisant &lt;strong&gt;Linux Fedora Core 4&lt;/strong&gt;, je ne pouvait lancer aucune application &lt;strong&gt;swing&lt;/strong&gt; ou &lt;strong&gt;awt&lt;/strong&gt;, à chaque exécution l'application se plantait et me lançait l'exception suivante :&lt;br /&gt;&lt;pre&gt;Exception in thread "main" java.lang.UnsatisfiedLinkError: /opt/java/jre/lib/i386/libawt.so: &lt;strong&gt;libXp.so.6&lt;/strong&gt;:&lt;br /&gt;cannot open shared object file: No such file or directory&lt;br /&gt;at java.lang.ClassLoader$NativeLibrary.load(Native Method)&lt;br /&gt;at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1586)&lt;br /&gt;at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1503)&lt;br /&gt;at java.lang.Runtime.loadLibrary0(Runtime.java:788)&lt;br /&gt;at java.lang.System.loadLibrary(System.java:834)&lt;br /&gt;at sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:50)&lt;br /&gt;at java.security.AccessController.doPrivileged(Native Method)&lt;br /&gt;at sun.awt.NativeLibLoader.loadLibraries(NativeLibLoader.java:38)&lt;br /&gt;at sun.awt.DebugHelper.(DebugHelper.java:29)&lt;br /&gt;at java.awt.Component.(Component.java:506)&lt;/pre&gt;&lt;br /&gt;La raison est que Fedora n'utilise pas &lt;strong&gt;Xfree86&lt;/strong&gt; mais plutôt &lt;strong&gt;X.org&lt;/strong&gt;, et il semblerait que les librairies de la JVM ont été compilés avec la &lt;code&gt;libXp.so.6&lt;/code&gt; utilisée par Xfree86, et qui a été déprécié avec X.org.&lt;br /&gt;&lt;br /&gt;Néanmoins il est possible d'installer cette librairie. Pour ce faire il faut disposer de son CD Fedora et d'installer le rpm de ladite librairie.&lt;br /&gt;&lt;br /&gt;&lt;span class="SourceText"&gt;rpm -ivh xorg-x11-deprecated-libs-6.8.2-31.i386.rpm&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Et le tour est joué !&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-4697082703773657846?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2008/11/comment-rgler-le-problme-de-swing-avec.html</link><author>noreply@blogger.com (Mohamed A)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-1656114760533352345</guid><pubDate>Sun, 20 Nov 2005 22:08:00 +0000</pubDate><atom:updated>2008-12-16T14:08:57.414-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>jboss</category><title>JBoss : Comment nommer le contexte de votre application Web</title><description>&lt;div class="entryContent"&gt;Par défaut Si vous déployez votre application Web le contexte prendra le nom de l'archive WAR.Exemple :&lt;br /&gt;&lt;br /&gt;Si le fichier WAR s'appelle : &lt;span class="highlight"&gt;myapp&lt;/span&gt;.war vous accéderez à votre application avec cette URL : &lt;span class="SourceText"&gt;&lt;a title="Linkification: http://127.0.0.1:8080/" class="linkification-ext" href="http://127.0.0.1:8080/"&gt;http://127.0.0.1:8080/&lt;/a&gt;&lt;/span&gt;&lt;span class="highlight"&gt;myapp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mais si vous voulez la nommer explicitement, il faut ajouter le fichier &lt;span class="SourceText"&gt;jboss-web.xml&lt;/span&gt; (qui se situra au même niveau que web.xml c-à-d dans WEB-INF) dans lequel vous écrierez les lignes suivantes :&lt;br /&gt;&lt;div id="SourceCodeDiv"&gt;&lt;span class="xml_comment"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_comment"&gt;&amp;lt;!DOCTYPE jboss-web PUBLIC&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_comment"&gt;"-//JBoss//DTD Web Application 2.4//EN"&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_comment"&gt;"&lt;a title="Linkification: http://www.jboss.org/j2ee/dtd/jboss-web_4_0.dtd" class="linkification-ext" href="http://www.jboss.org/j2ee/dtd/jboss-web_4_0.dtd"&gt;http://www.jboss.org/j2ee/dtd/jboss-web_4_0.dtd&lt;/a&gt;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;jboss-web&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;context-root&amp;gt;&lt;/span&gt;&lt;span class="SourceText"&gt;/mycontext&lt;/span&gt;&amp;lt;/&lt;span class="xml_tag"&gt;context-root&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml_tag"&gt;&amp;lt;/jboss-web&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Dans cet exemple même si le WAR s'appelle &lt;span class="highlight"&gt;myapp&lt;/span&gt;.war vous accéderez, cette fois-ci, à votre application via l'URL suivante : &lt;span class="SourceText"&gt;&lt;a title="Linkification: http://127.0.0.1:8080/" class="linkification-ext" href="http://127.0.0.1:8080/"&gt;http://127.0.0.1:8080/&lt;/a&gt;&lt;/span&gt;&lt;span class="highlight"&gt;mycontext&lt;/span&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-1656114760533352345?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2005/11/jboss-comment-nommer-le-contexte-de.html</link><author>noreply@blogger.com (Mohamed A)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-5101387952091998947</guid><pubDate>Tue, 06 Sep 2005 21:06:00 +0000</pubDate><atom:updated>2008-12-16T14:06:56.233-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>culture</category><title>Le premier manuel de Unix a 34 ans</title><description>&lt;div class="entryContent"&gt;Dans la série curiosités du web, voilà le page personnelle de &lt;a href="http://fr.wikipedia.org/wiki/Dennis_M._Ritchie"&gt;Dennis Ritchie&lt;/a&gt; l'un des créateurs de &lt;a href="http://fr.wikipedia.org/wiki/Unix"&gt;Unix&lt;/a&gt;. Il y présente sa biographie ainsi que toutes ses publications, parmi lesquelles se trouve le premier manuel de Unix datant de 1971 (34 ans !).Bonne lecture pour les collectionneurs.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-5101387952091998947?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2005/09/dans-la-srie-curiosits-du-web-voil-le.html</link><author>noreply@blogger.com (Mohamed A)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-4966072497203403612</guid><pubDate>Mon, 29 Aug 2005 21:03:00 +0000</pubDate><atom:updated>2008-12-17T03:01:45.580-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>jboss</category><title>Testez vos connaissances sur JBoss</title><description>&lt;div class="entryContent"&gt;Voilà un bon site qui vous permet de tester vos connaissances sur JBoss (3.2 et 4.0) mais aussi sur J2EE.C'est un QCM, qui vous permet de connaître rapidement vos lacunes et de les combler aussitôt, car si vous ne connaissez pas la réponse, elle vous sera donnée accompagnée de quelques explications.&lt;br /&gt;&lt;br /&gt;Si les premières questions paraissent triviales, celles du niveau avancé sont d'un bon niveau technique.&lt;br /&gt;&lt;br /&gt;Voilà un aperçu de la première question :&lt;br /&gt;&lt;pre&gt;What is JBoss?  A) JBoss is a Java Application server for high availability and high load transactional systems  B) JBoss is a Java Application server for real time, high availability and high load transactional systems&lt;/pre&gt;&lt;br /&gt;Et 76 autres vous attendent, alors &lt;a href="http://learno.com/jboss/question_42.html?"&gt;à vos plumes!&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-4966072497203403612?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2005/08/voil-un-bon-site-qui-vous-permet-de.html</link><author>noreply@blogger.com (Mohamed A)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-2272784597328071693</guid><pubDate>Tue, 02 Aug 2005 19:00:00 +0000</pubDate><atom:updated>2008-12-17T03:01:22.810-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>jboss</category><title>Netbeans 4.1 supporte JBoss 4.0</title><description>&lt;div class="entryContent"&gt;&lt;a href="http://www.netbeans.org/"&gt;Netbeans 4.1&lt;/a&gt; supporte enfin &lt;a href="http://www.jboss.com/"&gt;JBoss 4.0&lt;/a&gt;. Je l'ai testé et ça fonctionne correctement.Pour pouvoir utiliser JBoss à partir de NetBeans il faut télécharger le plugin, pour cela aller dans &lt;code&gt;Tools -&gt; Server Manager&lt;/code&gt;, dans la boîte de dialogue, aller dans le &lt;code&gt;update center&lt;/code&gt; et choisir le &lt;code&gt;Netbeans Update Center &lt;strong&gt;Beta&lt;/strong&gt;&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Il reste maintenant à &lt;a href="http://www.eclipse.org/"&gt;Eclipse 3.1&lt;/a&gt; de le supporter, grâce notamment au plugin "&lt;a href="http://www.eclipse.org/webtools/index.html"&gt;Webtools 0.7&lt;/a&gt;" qui ne supporte que JBoss 3.2.3.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.jboss.com/products/jbosside"&gt;JBoss Eclipse IDE&lt;/a&gt; supporte bien JBoss 4.0 (déploiement, debug, etc.), néanmoins la seule version actuellement disponible supportant Eclipse 3.1 n'est toujours pas finis et contient quelques bugs génants.&lt;br /&gt;&lt;br /&gt;A titre informatif voici les serveurs d'applications supportés par les deux palteformes :&lt;br /&gt;&lt;table border="1"&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;Netbeans 4.1&lt;/th&gt;&lt;br /&gt;&lt;th&gt;Eclipse 3.1 + Webtools 0.7&lt;/th&gt;&lt;br /&gt;&lt;th&gt;JBoss IDE&lt;/th&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Sun Java System AS 8.1&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Apache Geronimo 1.0&lt;/td&gt;&lt;br /&gt;&lt;td&gt;JBoss à partir de 3.0&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Tomcat 5.0&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Jonas 4.x&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Tomcat 5.5&lt;/td&gt;&lt;br /&gt;&lt;td&gt;JBoss 3.2.3&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;JBoss 4.0&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Tomcat (à partir de 3.2)&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Weblogic 8.1 et 9.0&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Websphere 6.0.x&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-2272784597328071693?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2008/08/netbeans-4.html</link><author>noreply@blogger.com (Mohamed A)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8951507323253822513.post-3988599680226334567</guid><pubDate>Wed, 06 Jul 2005 19:00:00 +0000</pubDate><atom:updated>2008-12-17T03:00:58.289-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Outils</category><title>Les outils Open Source pour J2EE</title><description>&lt;div class="entryContent"&gt;Le monde open source n'a rien a envier au monde commercial en matière d'outils de développement, il offre désormais un large panel d'outils professionnels améliorant la productivité et permettant ainsi de faire des économies considérables.&lt;a href="http://abdennebi.com/blog/#amulder?"&gt;Aaron Mulder&lt;/a&gt; répertorie les outils open source et freeware les plus utilisés dans les projets J2EE recouvrant toutes les phases de développement, des captures d'écran montrent ses logiciels en action, on trouvera :&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;Bases de données&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Serveurs d'applications&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;acronym title="Integrated Development Environment"&gt;IDE&lt;/acronym&gt; et Bug Trackers&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Portails et &lt;acronym title="Content Management System"&gt;CMS&lt;/acronym&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Build et gestion de configuration&lt;/li&gt;&lt;br /&gt; &lt;li&gt;CRM&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Outils de tests et de profiling&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Outils d'installation&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Les caches Web&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Librairies et framworks&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://www.chariotsolutions.com/slides/osconf2005-tools.pdf"&gt;Le document&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8951507323253822513-3988599680226334567?l=blog.abdennebi.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.abdennebi.com/2008/12/le-monde-open-source-na-rien-envier-au.html</link><author>noreply@blogger.com (Mohamed A)</author><thr:total>0</thr:total></item></channel></rss>
