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

<channel>
	<title>Blog de Baptiste Wicht &#187; Mes projets</title>
	<atom:link href="https://blog.developpez.com/wichtounet/pcategory/perso/mes-projets/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/wichtounet</link>
	<description></description>
	<lastBuildDate>Fri, 25 Nov 2011 10:34:42 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Nouveau projet : eddic &#8211; Compilateur en C++</title>
		<link>https://blog.developpez.com/wichtounet/p10539/programmation/nouveau_projet_eddic_compilateur_en_c</link>
		<comments>https://blog.developpez.com/wichtounet/p10539/programmation/nouveau_projet_eddic_compilateur_en_c#comments</comments>
		<pubDate>Fri, 25 Nov 2011 10:34:42 +0000</pubDate>
		<dc:creator><![CDATA[Baptiste Wicht]]></dc:creator>
				<category><![CDATA[Mes projets]]></category>
		<category><![CDATA[Programmation]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Cela fait maintenant longtemmps que je n&#8217;ai pas posté ici. Je rédige toujours des articles, mais en anglais sur mon blog perso : http://www.baptiste-wicht.com Je poste juste ici pour donner quelques informations sur mon nouveau projet : eddic. eddic est un compilateur, écrit en C++, permettant de compiler un language que j&#8217;ai &#171;&#160;imaginé&#160;&#187; EDDI. Le compilateur et le langage sont encore vraiment limités. eddic génère de l&#8217;assembleur qui est ensuite assemblé avec as et linké [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Cela fait maintenant longtemmps que je n&rsquo;ai pas posté ici. Je rédige toujours des articles, mais en anglais sur mon blog perso : http://www.baptiste-wicht.com</p>
<p>Je poste juste ici pour donner quelques informations sur mon nouveau projet : <strong>eddic</strong>. </p>
<p>eddic est un compilateur, écrit en C++, permettant de compiler un language que j&rsquo;ai &laquo;&nbsp;imaginé&nbsp;&raquo; EDDI. Le compilateur et le langage sont encore vraiment limités. eddic génère de l&rsquo;assembleur qui est ensuite assemblé avec <strong>as</strong> et linké avec <strong>ld</strong>. </p>
<p>Actuellement en version 0.6.0, EDDI supporte : </p>
<ul>
<li>2 types : int et string</li>
<li>Les expressions mathématiques avec les opérateurs +-*/%</li>
<li>La concaténation de string</li>
<li>Les variables, locales et globales</li>
<li>Les branches conditionelles if, else, else if</li>
<li>Les expressions booléennes pour les branchements et les boucles</li>
<li>Les boucles for, foreach, while</li>
<li>Les tableaux, globaux ou locaux</li>
<li>L&rsquo;appel de function, mais pas de valeur de retour</li>
</ul>
<p>Je suis en train de développer la version 0.6.1 qui va inclure quelques refactorings et le support des retours de functions. </p>
<p>Le code est disponible sur Github : https://github.com/wichtounet/eddic<br />
Pour plus d&rsquo;informations, vous pouvez aussi lire mes posts à ce sujet : http://www.baptiste-wicht.com/tag/eddi/</p>
<p>N&rsquo;hésitez pas à me faire part de tous les commentaires et idées que vous pourriez avoir <img src="https://blog.developpez.com/wichtounet/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven 2 : Retour d&#8217;expérience</title>
		<link>https://blog.developpez.com/wichtounet/p8026/jtheque/maven_2_retour_d_experience</link>
		<comments>https://blog.developpez.com/wichtounet/p8026/jtheque/maven_2_retour_d_experience#comments</comments>
		<pubDate>Sun, 06 Sep 2009 02:26:28 +0000</pubDate>
		<dc:creator><![CDATA[Baptiste Wicht]]></dc:creator>
				<category><![CDATA[JTheque]]></category>
		<category><![CDATA[Mes projets]]></category>
		<category><![CDATA[Outils]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Cela fait maintenant environ un mois que j&#8217;ai commencé à regarder les possibilités de Maven 2 et à l&#8217;utiliser pour le build de mon projet JTheque. Au début, je pensais juste l&#8217;utiliser pour faire mes &#171;&#160;publications&#160;&#187; sur Sonar étant donné que je ne voulais pas passer du temps à migrer de Ant à Maven 2. Il faut également dire que je ne trouvais pas le concept très intéressant. Mais petit à petit, je me suis [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Cela fait maintenant environ un mois que j&rsquo;ai commencé à regarder les possibilités de Maven 2 et à l&rsquo;utiliser pour le build de mon projet JTheque. Au début, je pensais juste l&rsquo;utiliser pour faire mes &laquo;&nbsp;publications&nbsp;&raquo; sur Sonar étant donné que je ne voulais pas passer du temps à migrer de Ant à Maven 2. Il faut également dire que je ne trouvais pas le concept très intéressant. </p>
<p>Mais petit à petit, je me suis rendu compte que Maven 2 était beaucoup plus intéressant que je ne le pensais et offrait des possibilités beaucoup plus élevées qu&rsquo;Ant. </p>
<p>J&rsquo;ai donc gentiment intégré petit à petit les possibilités de Maven 2 tout d&rsquo;abord pour remplacer mes petits scripts Ant, ensuite dans mon système d&rsquo;intégration continue puis maintenant pour ce qui est de la génération de site et du déploiement automatique d&rsquo;artifacts. </p>
<p>Et je dois dire que je suis de plus en plus ravi par cet outil super complet. Il me permet de faire des builds beaucoup plus complets qu&rsquo;Ant, me génère automatiquement des rapports et un site et me permet de déployer le tout directement sur mon serveur FTP sans aucun problème. C&rsquo;est donc un gain de temps non négligeable. Bref que du bonheur. </p>
<p>Bien qu&rsquo;il faille un certain temps d&rsquo;adaptation et d&rsquo;études pour appréhender correctement l&rsquo;outil, une fois qu&rsquo;on en a saisi la philosophie, il est assez facile d&rsquo;avancer et d&rsquo;intégrer petit à petit les immenses possibilités de Maven 2. Je suis d&rsquo;ailleurs encore loin de toutes les connaître et les utiliser. </p>
<p>Néanmoins, il y a quand même quelques petits problèmes que j&rsquo;ai pu constater. Premièrement, la prise en main n&rsquo;est pas des plus facile. La philosophie est en effet tout à fait différente de ce que l&rsquo;on trouve dans les système de build basé sur le script. Ensuite, la documentation n&rsquo;est pas toujours des plus clairs, surtout en ce qui concerne les projets multi-modules. Et enfin, beaucoup de choses se répètent dans les POM de différents projets, mais pour ce point là, je l&rsquo;avais déjà avec Ant. </p>
<p>Pour conclure, je dirais que Maven 2 est infiniment plus puissant et agréable à utiliser qu&rsquo;Ant et bien qu&rsquo;il faille un certain temps pour le prendre en main, n&rsquo;est pas des plus difficiles à utiliser. </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Mise à jour du site de JTheque</title>
		<link>https://blog.developpez.com/wichtounet/p7699/jtheque/mise_a_jour_du_site_de_jtheque</link>
		<comments>https://blog.developpez.com/wichtounet/p7699/jtheque/mise_a_jour_du_site_de_jtheque#comments</comments>
		<pubDate>Wed, 03 Jun 2009 20:58:38 +0000</pubDate>
		<dc:creator><![CDATA[Baptiste Wicht]]></dc:creator>
				<category><![CDATA[JTheque]]></category>
		<category><![CDATA[Mes projets]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour, Je viens de mettre à jour le site de JTheque (http://jtheque.developpez.com) avec les dernières informations sur les modules, les applications, &#8230; En plus de cela, le site est maintenant devenu multilingue (Français &#8211; Anglais). N&#8217;hésitez pas à m&#8217;indiquer si vous trouvez des bugs sur le site ou si vous voulez donner votre avis sur le site. Vous pouvez réagir directement sur le forum.]]></description>
				<content:encoded><![CDATA[<p>Bonjour, </p>
<p>Je viens de mettre à jour le site de JTheque (<a href="http://jtheque.developpez.com">http://jtheque.developpez.com</a>) avec les dernières informations sur les modules, les applications, &#8230;</p>
<p>En plus de cela, le site est maintenant devenu multilingue (Français &#8211; Anglais). </p>
<p>N&rsquo;hésitez pas à m&rsquo;indiquer si vous trouvez des bugs sur le site ou si vous voulez donner votre avis sur le site. Vous pouvez réagir directement sur <a href="http://www.developpez.net/forums/d686778/applications/projets/jtheque/creation-site-jtheque">le forum</a>. </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JTheque Metrics : Génération de métriques pour Java</title>
		<link>https://blog.developpez.com/wichtounet/p7676/jtheque/jtheque_metrics_generation_de_metriques</link>
		<comments>https://blog.developpez.com/wichtounet/p7676/jtheque/jtheque_metrics_generation_de_metriques#comments</comments>
		<pubDate>Sun, 31 May 2009 20:39:31 +0000</pubDate>
		<dc:creator><![CDATA[Baptiste Wicht]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JTheque]]></category>
		<category><![CDATA[Mes projets]]></category>
		<category><![CDATA[Outils]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour, J&#8217;ai le plaisir de vous annoncer que j&#8217;ai développé une nouvelle application basé sur le core JTheque : JTheque Metrics. Cette application permet de générer des métriques sur le code d&#8217;un projet Java. Pour le moment, les métriques générées ne sont pas très nombreuses : Nombre de lignes Nombre de lignes de code Nombre de lignes de commentaires Mais cela devrait évoluer JTheque Metrics gérer les projets multi-modules. C&#8217;est-à-dire que vous pouvez enregistrer un [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour, </p>
<p>J&rsquo;ai le plaisir de vous annoncer que j&rsquo;ai développé une nouvelle application basé sur le core JTheque : <strong>JTheque Metrics</strong>. </p>
<p>Cette application permet de générer des métriques sur le code d&rsquo;un projet Java. </p>
<p>Pour le moment, les métriques générées ne sont pas très nombreuses : </p>
<ul>
<li>Nombre de lignes</li>
<li>Nombre de lignes de code</li>
<li>Nombre de lignes de commentaires</li>
</ul>
<p>Mais cela devrait évoluer <img src="https://blog.developpez.com/wichtounet/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>JTheque Metrics gérer les projets multi-modules. C&rsquo;est-à-dire que vous pouvez enregistrer un nouveau projet et lui spécifier plusieurs sous-projets (des dossiers). </p>
<p>Vous pouvez également enregistrer une configuration de projet pour ne pas avoir à le reconfigurer entièrement plusieurs fois. </p>
<p>Vous pouvez télécharger le programme <a href="http://jtheque.developpez.com/public/applications/Metrics/1.0/JTheque-Metrics-1.0.zip">ici</a>. </p>
<p>Les sources : </p>
<ul>
<li><a href="http://jtheque.developpez.com/public/modules/MetricsModule/1.0/JTheque-Metrics-Module_src.zip">Module principal</a></li>
<li><a href="http://jtheque.developpez.com/public/applications/Metrics/1.0/JTheque-Metrics_src.zip">Application</a></li>
</ul>
<p>La Javadoc : </p>
<ul>
<li><a href="http://jtheque.developpez.com/public/modules/MetricsModule/1.0/JTheque-Metrics-Module_doc.zip">Module principal</a></li>
<li><a href="http://jtheque.developpez.com/public/applications/Metrics/1.0/JTheque-Metrics_doc.zip">Application</a></li>
</ul>
<p>En espérant que ce programme vous soit utile.</p>
<p>N&rsquo;hésitez pas à me faire part de votre avis, de vos propositions d&rsquo;amélioration ou des bugs que vous auriez pu constater <a href="http://www.developpez.net/forums/d753764/applications/projets/jtheque/nouvelle-application-jtheque-metrics">sur le forum.</a> </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JTheque : Nouveautés et mises à jour</title>
		<link>https://blog.developpez.com/wichtounet/p7416/jtheque/nouveautes_et_mises_a_jour</link>
		<comments>https://blog.developpez.com/wichtounet/p7416/jtheque/nouveautes_et_mises_a_jour#comments</comments>
		<pubDate>Sat, 28 Mar 2009 15:56:35 +0000</pubDate>
		<dc:creator><![CDATA[Baptiste Wicht]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JTheque]]></category>
		<category><![CDATA[Mes projets]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour, J&#8217;ai effectué plusieurs modifications au niveau de JTheque. Tout d&#8217;abord, je viens de créer un nouveau module : JTheque Movies Module. Ce module, encore très basique, permet de gérer des vidéos. Actuellement, il ne permet que de classer ces vidéos dans une ou plusieurs catégories et permet de mettre un lien vers le fichier. De plus, j&#8217;ai introduit la notion de collection, vous pouvez donc créer des collections de vidéos (éventuellement protégée par mot [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour, </p>
<p>J&rsquo;ai effectué plusieurs modifications au niveau de JTheque. </p>
<p>Tout d&rsquo;abord, je viens de créer un nouveau module : JTheque Movies Module. </p>
<p>Ce module, encore très basique, permet de gérer des vidéos. Actuellement, il ne permet que de classer ces vidéos dans une ou plusieurs catégories et permet de mettre un lien vers le fichier. </p>
<p><span id="more-120"></span></p>
<p>De plus, j&rsquo;ai introduit la notion de collection, vous pouvez donc créer des collections de vidéos (éventuellement protégée par mot de passe). Les vidéos ne sont visibles qu&rsquo;à l&rsquo;intérieur de la collection. </p>
<p>A termes, je compte essayer d&rsquo;intégrer un lecteur vidéo dans le module pour lire directement les vidéos (vivement Java 7 <img src="https://blog.developpez.com/wichtounet/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /> ) et améliorer également les fonctionnalités du module. </p>
<p>Vous pouvez récupérer le module depuis l&rsquo;interface de gestion des modules en allant dans la vue &laquo;&nbsp;Trouver plus de modules&nbsp;&raquo;. </p>
<p>Sinon, vous pouvez aussi directement le télécharger ici : <a href="http://jtheque.developpez.com/public/modules/MoviesModule/1.0/JTheque-Movies-Module.jar">ici</a></p>
<p>Ensuite, j&rsquo;ai mis à jour le module films. Il est à présent possible de gérer des collections de films distinctes. Selon le même principe que pour le module de vidéos. </p>
<p>Vous pouvez directement le mettre à jour depuis l&rsquo;application, ou le récupérer <a href="http://jtheque.developpez.com/public/modules/FilmsModule/1.0/JTheque-Films-Module.jar">ici</a>. </p>
<p>Et enfin, un peu moins cool <img src="https://blog.developpez.com/wichtounet/wp-includes/images/smilies/icon_sad.gif" alt=":(" class="wp-smiley" /></p>
<p>Je viens de mettre à jour le core de JTheque et plusieurs modules qui profitent maintenant des améliorations du core. </p>
<p>Ce sont surtout des refactorings au niveau et surtout au niveau du couplage entre les différentes couches de l&rsquo;application. </p>
<p>Néanmoins, il est possible que certains modules ne fonctionnent plus avec cette version du Core <img src="https://blog.developpez.com/wichtounet/wp-includes/images/smilies/icon_sad.gif" alt=":(" class="wp-smiley" /></p>
<p>Si cela arrive, l&rsquo;application est disponible <a href="http://jtheque.developpez.com/public/applications/Collections/5.1.zip">ici</a> avec tous les modules à jour. </p>
<p>Pour conserver les données actuelles, il suffit de décompresser la nouvelle application et d&rsquo;y recopier tout ce que contient le dossier miniatures, le fichier config.xml et les fichier localhost.XXX et normalement, tout devrait fonctionner. </p>
<p>Voilà et désolé d&rsquo;avance pour ceux qui auront des problèmes avec ma mise à jour</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Découvrez l&#8217;Api ExtendedJFrame</title>
		<link>https://blog.developpez.com/wichtounet/p3799/jtheque/decouvrez_l_api_extendedjframe</link>
		<comments>https://blog.developpez.com/wichtounet/p3799/jtheque/decouvrez_l_api_extendedjframe#comments</comments>
		<pubDate>Tue, 19 Jun 2007 06:39:51 +0000</pubDate>
		<dc:creator><![CDATA[Baptiste Wicht]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JTheque]]></category>
		<category><![CDATA[Mes projets]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Je vous présente une petite API Java : Langage : Java 6.0 Nom : ExtendedJFrame Version : 1.0 Description : Cette api permet d&#8217;avoir plus de fonctionnalités sur des JFrame. Voir plus bas pour plus grande description. Nécessite : Java 6.0 Licence : GPL Sources : Disponibles Documentation : http://baptiste-wicht.developpez.com/projets/extendedframe Téléchargement : http://baptiste-wicht.developpez.com/projets/extendedframe Voilà ce que vous pouvez faire avec cette api : Tout d&#8217;abord, vous pouvez rendre cette ExtendedJFrame modale, c&#8217;est à dire qu&#8217;elle [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Je vous présente une petite API Java :</p>
<ul>
<li>Langage : Java 6.0</li>
<li>Nom : ExtendedJFrame</li>
<li>Version : 1.0</li>
<li>Description : Cette api permet d&rsquo;avoir plus de fonctionnalités sur des JFrame. Voir plus bas pour plus grande description. </li>
<li>Nécessite : Java 6.0</li>
<li>Licence : GPL</li>
<li>Sources : Disponibles</li>
<li>Documentation : http://baptiste-wicht.developpez.com/projets/extendedframe</li>
<li>Téléchargement : http://baptiste-wicht.developpez.com/projets/extendedframe</li>
</ul>
<p><span id="more-3"></span><br />
Voilà ce que vous pouvez faire avec cette api : Tout d&rsquo;abord, vous pouvez rendre cette ExtendedJFrame modale, c&rsquo;est à dire qu&rsquo;elle est bloquée et liée à une autre ExtendedJFrame. On ne peut rien faire sur la première fenêtre tant que la deuxième n&rsquo;a pas été fermée. C&rsquo;est le même principe que pour les Window. </p>
<p>Ensuite, vous pouvez bloquer la fenêtre et afficher une animation sur celle-ci. Deux animations sont directement disponibles dans l&rsquo;API, une simple JProgressBar infinie et une deuxième animation en 2D plus complexe basée sur l&rsquo;infiniteProgressPanel de Romain Guy. Tout ça, de manière très simple. </p>
<p>Enfin, vous pouvez réduire cette fenêtre dans le system tray (la zone de notification en général en bas à droite). C&rsquo;est à dire que via un quatrième bouton à coté de réduire, vous pouvez rendre la fenêtre invisible et faire apparaître une icone dans le systray qui vous permettra de réouvrir votre fenêter plus tard. </p>
<p>Vous avez aussi une barre d&rsquo;état directement sur votre fenêtre. De plus, j&rsquo;ai essayé de rendre l&rsquo;ExtendedJFrame le plus personnalisable possible. C&rsquo;est à dire que vous pouvez utiliser votre propre barre d&rsquo;état, votre propre barre de titre et voter propre figure d&rsquo;attente. Il vous suffit juste d&rsquo;implémenter les bonnes interfaces. </p>
<p>Normalement, tout ce qu&rsquo;il est possible de faire avec une JFrame est possible avec ExtendedJFrame. </p>
<p>Pour vous faire une idée de comment ça marche, vous pouvez employer la classe Test, elle fournit 4 méthodes qui permettent de visualiser un peu tout ce qu&rsquo;il est possible de faire avec ExtendedJFrame. Il vous suffit de choisir la méthode à lancer dans la méthode main. </p>
<p>Vous pouvez la télécharger sur la <a href="http://baptiste-wicht.developpez.com/projets/extendedframe/">page de documentation</a>. </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Concevoir une application modulaire &#8211; Bases</title>
		<link>https://blog.developpez.com/wichtounet/p6448/perso/concevoir_une_application_modulaire_base</link>
		<comments>https://blog.developpez.com/wichtounet/p6448/perso/concevoir_une_application_modulaire_base#comments</comments>
		<pubDate>Thu, 25 Sep 2008 16:01:00 +0000</pubDate>
		<dc:creator><![CDATA[Baptiste Wicht]]></dc:creator>
				<category><![CDATA[Conception]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JTheque]]></category>
		<category><![CDATA[Mes projets]]></category>
		<category><![CDATA[Perso]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour, Je suis actuellement en train de développer une application modulaire. Au vu des problèmes que j&#8217;ai rencontré pour développer la partie modules et le peu d&#8217;informations que j&#8217;ai pu trouver sur le net, j&#8217;ai pensé que faire une série de billets sur le sujet ne pourrait qu&#8217;être profitable à tout le monde. Dans ce billet, je vais commencer par parler des bases de la conception d&#8217;une application modulaire, c&#8217;est-à-dire pour commencer, ce qu&#8217;est une [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour, </p>
<p>Je suis actuellement en train de développer une <strong>application modulaire</strong>. Au vu des problèmes que j&rsquo;ai rencontré pour développer la partie modules et le peu d&rsquo;informations que j&rsquo;ai pu trouver sur le net, j&rsquo;ai pensé que faire une série de billets sur le sujet ne pourrait qu&rsquo;être profitable à tout le monde. </p>
<p>Dans ce billet, je vais commencer par parler des bases de la conception d&rsquo;une application modulaire, c&rsquo;est-à-dire pour commencer, ce qu&rsquo;est une application modulaire, ce qu&rsquo;est un module et bien entendu ce que ça apporte. Dans les prochains billets, je vais essayer de décrire les différentes problématiques inhérentes au sujet et leurs résolutions. Si ces billets nécessitent du code, ces exemples de code seront en Java, car c&rsquo;est le langage que j&rsquo;ai choisi pour développer mon application, mais les concepts peuvent s&rsquo;appliquer à tous les langages. </p>
<p>Bien entendu, je ne me considère pas comme un pro dans les applications modulaires et les différentes informations que je vais donner au fil des billets n&rsquo;est que ma façon de voir, il y en a certainement d&rsquo;autres et des meilleures, donc si vous n&rsquo;êtes pas d&rsquo;accord avec moi ou si vous pensez qu&rsquo;on peut faire mieux, n&rsquo;hésitez pas à réagir en commentant ces billets </p>
<p><span id="more-112"></span></p>
<p>Pour commencer, qu&rsquo;est-ce qu&rsquo;une application modulaire ? Une application modulaire est constituée de 2 parties bien distinctes : </p>
<ul>
<li>Le <strong>coeur </strong>: Comme son nom l&rsquo;indique, il s&rsquo;agit de la partie centrale de l&rsquo;application. Cette partie doit être complètement indépendante des modules. </li>
<li>Les <strong>modules </strong>: Il s&rsquo;agit cette fois des parties qu&rsquo;on va ajouter dynamiquement à l&rsquo;application pour lui rajouter des fonctionnalités. On leur donne d&rsquo;autres noms : briques, plugins, addons, &#8230;, mais le concept est toujours le même. </li>
</ul>
<p>Il y a à mon avis 2 sortes d&rsquo;applications modulaires. Le premier type est une application somme toute normale qui propose une série de fonctionnalités et qui propose en plus de rajouter des fonctionnalités par le biais de modules. Le second type est une application qui propose un coeur complètement dénué de fonctionnalités. Toutes les fonctionnalités sont proposées par les modules, c&rsquo;est donc une application dans laquelle &laquo;&nbsp;tout est module&nbsp;&raquo;. </p>
<p>La différence principale est que la première peut être utilisée tout à fait normalement sans aucun module, alors que la deuxième ne propose pas (ou presque pas) de fonctionnalités sans module. </p>
<p>Au contraire d&rsquo;une application normale, il faut donc prévoir des points d&rsquo;extensions que les modules pourront utiliser pour ajouter des fonctionnalités à l&rsquo;application ou pour modifier l&rsquo;existant. </p>
<p>C&rsquo;est sur ce deuxième type d&rsquo;application modulaire que je suis parti pour réaliser mon logiciel. Cela permet d&rsquo;avoir un socle solide qu&rsquo;on peut éventuellement réutiliser pour d&rsquo;autres applications sous réserve de quelques modifications. </p>
<p>Comme application modulaire connue, on peut citer <a href="http://www.eclipse.org/">Eclipse</a> qui est entièrement modulaire et qui est du deuxième type. </p>
<p>Maintenant, la grande question est : C&rsquo;est bien beau tout ça, mais ça sert à quoi ? Tout d&rsquo;abord, du point de vue du développeur, cela permet de séparer clairement les différentes parties de l&rsquo;application. On a donc des modules distincts plus faciles à maintenir qu&rsquo;une grosse application. Cela permet également d&rsquo;être très souple pour rajouter des fonctionnalités à l&rsquo;application, en effet, pour cela, il suffit de créer un nouveau module, d&rsquo;y coder la fonctionnalité et de rajouter ce module dans l&rsquo;application. Du point de vue de l&rsquo;utilisateur, cela ajoute de la souplesse au programme. En effet, l&rsquo;utilisateur va pouvoir choisir quels modules il veut lancer, rajouter de nouveaux modules, voire même en créer s&rsquo;il en est capable. Il pourra donc personnaliser son application. </p>
<p>Bien entendu, cela ne se fait pas tout seul et ce n&rsquo;est pas des plus simples à concevoir et à implémenter. En effet, cela pose beaucoup de problématiques qu&rsquo;il faut régler et cela implique beaucoup de questions qu&rsquo;il faut se poser. </p>
<p>C&rsquo;est ce que nous verrons dans les prochains articles. </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Concevoir une application modulaire &#8211; Modules</title>
		<link>https://blog.developpez.com/wichtounet/p6473/perso/concevoir_une_application_modulaire_modu</link>
		<comments>https://blog.developpez.com/wichtounet/p6473/perso/concevoir_une_application_modulaire_modu#comments</comments>
		<pubDate>Sun, 28 Sep 2008 14:33:09 +0000</pubDate>
		<dc:creator><![CDATA[Baptiste Wicht]]></dc:creator>
				<category><![CDATA[Conception]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JTheque]]></category>
		<category><![CDATA[Mes projets]]></category>
		<category><![CDATA[Perso]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Après avoir décrit dans le premier billet en quoi consistait une application modulaire et ce qu&#8217;était un module, nous allons maintenant nous pencher plus spécialement sur les modules. Nous avons dit qu&#8217;un module permettait de rajouter des fonctionnalités à l&#8217;application principale. Mais avant de se lancer dans le moindre code, il va falloir définir exactement ce que seront nos modules, ce qu&#8217;ils pourront faire, s&#8217;il y aura plusieurs types de modules, &#8230; C&#8217;est ce que [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Après avoir décrit dans <a href="http://blog.developpez.com/wichtounet?title=concevoir_une_application_modulaire_base">le premier billet</a> en quoi consistait une <strong>application modulaire</strong> et ce qu&rsquo;était un module, nous allons maintenant nous pencher plus spécialement sur les <strong>modules</strong>. </p>
<p>Nous avons dit qu&rsquo;un module permettait de rajouter des fonctionnalités à l&rsquo;application principale. Mais avant de se lancer dans le moindre code, il va falloir définir exactement ce que seront nos modules, ce qu&rsquo;ils pourront faire, s&rsquo;il y aura plusieurs types de modules, &#8230;</p>
<p>C&rsquo;est ce que nous allons voir dans ce billet. </p>
<p><span id="more-113"></span></p>
<p>La première question à se poser est : &laquo;&nbsp;Que vont pouvoir faire mes modules ?&nbsp;&raquo;. C&rsquo;est-à-dire, qu&rsquo;est-ce qu&rsquo;un module pourra ajouter à l&rsquo;application principale. </p>
<p>Nous avons dit qu&rsquo;un module rajoutait des fonctionnalités à l&rsquo;application principale, mais il faut maintenant spécifier ce que les modules pourront ajouter et la manière dont ils vont pouvoir les ajouter. En plus d&rsquo;ajouter, un module pourra éventuellement modifier l&rsquo;application principale. </p>
<p>Ce que les modules pourront faire va dépendre également du type d&rsquo;application modulaire : </p>
<ul>
<li>Dans le cas du premier type (application normale avec possibilité d&rsquo;extension par module), le module va rajouter des fonctionnalités de types spécifiques, c&rsquo;est-à-dire en accord avec l&rsquo;application. Prenons le cas d&rsquo;une application qui permet de regarder la télévision via internet. Dans ce cas-là, les modules pourront par exemple rajouter une chaîne à l&rsquo;application ou rajouter un format de conversion vidéo pour l&rsquo;enregistrement. Il peut aussi rajouter une fonctionnalité complète comme des statistiques qui indiqueraient le nombre d&rsquo;heures pendant lesquelles on a regardé la télé sur ce programme et la chaîne la plus regardée. </li>
<li>Dans le cas du second type (application vide de base et modules qui rendent l&rsquo;application utilisable), les modules ne vont pas rajouter des fonctionnalités à l&rsquo;application principale étant donné qu&rsquo;elle ne permet rien, mais vont définir ce que va faire l&rsquo;application. Cette fois, les modules, c&rsquo;est l&rsquo;application. Prenons mon application (JTheque) qui est destiné à gérer des collections diverses. J&rsquo;ai pour le moment un module Films et un module Livres. J&rsquo;ai ensuite des plus petits modules comme le modules Stats ou un module qui permet de gérer une liste de films à acheter. On voit qu&rsquo;on a déja des modules beaucoup plus large. En plus, avec quelque chose de ce type, on pourrait imaginer une module qui ferait quelque chose de complètement différent de l&rsquo;application de base, comme un module Calculette qui ajouterait une calculatrice à l&rsquo;application, ce qui n&rsquo;est pas du tout le but de l&rsquo;application de base mais qui est rendue possible par les possibilités d&rsquo;extension du coeur de l&rsquo;application. </li>
</ul>
<p>Dans ces deux cas, il faut donc définir certains points d&rsquo;extension. Dans le cas de JTheque, voici les points d&rsquo;extension que j&rsquo;ai créé pour mes modules : </p>
<ul>
<li>Rajouter des onglets dans la vue principale</li>
<li>Rajouter des composants dans la barre d&rsquo;état</li>
<li>Rajouter des éléments dans le menu de la vue principale</li>
<li>Rajouter des onglets dans la vue de configuration</li>
</ul>
<p>A partir de ces points d&rsquo;extension, les modules peuvent faire beaucoup de choses. Par exemple, si on veut faire une calculette, on peut imaginer rajouter un onglet principal avec une calculette, ou alors faire une fenêtre dediée et rajouter un élément dans le menu qui ouvrirait cette fenêtre. </p>
<p>Ceci est donc laissé au libre choix du développeur, mais il faut y penser avant et bien réfléchir à ce que ça implique. </p>
<p>En plus de points d&rsquo;extension, le coeur de l&rsquo;application fournit aussi une série de services aux modules. Ces services peuvent être de simples classes utilitaires ou alors un gestionnaire de persistence d&rsquo;entités, un gestionnaire de log ou encore un gestionnaire permettant aux modules d&rsquo;enregistrer des informations pour les retrouver après l&rsquo;arrêt de l&rsquo;application. </p>
<p>Là encore ces points sont laissés à la discrétion du développeur. Ces services ne sont pas obligatoires, mais cela permet d&rsquo;éviter que chaque module doivent tout refaire. En plus, cela permet également une standardisation. En effet, les modules vont (normalement) utiliser le même type de persistence, le même type de log, &#8230; Ce qui est plus facile à gérer ensuite. Bien entendu, rien n&rsquo;empêche un module d&rsquo;utiliser son propre système de log si celui du coeur ne lui convient pas. </p>
<p>Pour la petite histoire, voilà les services que j&rsquo;offre à mes modules : </p>
<ul>
<li>Gestionnaire de logs : Permet aux modules d&rsquo;obtenir des loggers (Log4J) pour logger différentes actions. </li>
<li>Gestionnaire d&rsquo;erreurs : Permet aux modules d&rsquo;afficher des erreurs facilement</li>
<li>Gestionnaire de vue : Permet aux modules d&rsquo;afficher des messages, de demander quelque chose à l&rsquo;utilisateur, &#8230;</li>
<li>Gestionnaire de beans : Permet aux modules d&rsquo;utiliser de l&rsquo;IOC (Spring). </li>
<li>Gestionnaire de ressources : Permet aux modules de bénéficier de l&rsquo;internationalisation (Spring) ainsi que d&rsquo;un cache d&rsquo;image</li>
<li>Gestionnaire de persistence : Permet aux modules de gérer des entités persistentes (JPA/Hibernate). </li>
<li>Gestionnaire d&rsquo;états : Permet aux modules de stocker des états. </li>
</ul>
<p>On peut aussi réfléchir si on veut un seul type de module ou s&rsquo;il y en aura plusieurs. Dans mon cas, j&rsquo;ai fait une petite distinction entre des modules dits principaux et des modules dits secondaires. Les fonctionnalités sont exactement les mêmes sauf qu&rsquo;un seul module principal peut être lancé en même temps. Par exemple, le module films est un module principal et le module ajoutant une liste de films à acheter est un module secondaire. </p>
<p>Le dernier point que je vois à traiter au niveau des modules est la dépendance entre modules. On peut permettre ou non qu&rsquo;un module dépende d&rsquo;un autre module. Cela ajoute un niveau de difficulté supplémentaire au niveau de l&rsquo;implémentation étant donné qu&rsquo;il faudra vérifier que la dépendance est remplie avant de pouvoir lancer le module. Cela implique également que le module principal doit être lancé avant le module qui en dépent. Et que faire des dépendances circulaires ? Bref, cela est également laissé au choix du développeur qui peut permettre les dépendances intra-modules ou non. Dans mon cas, je l&rsquo;ai permis, j&rsquo;ai par exemple, le module Stats qui dépend du module Films étant donné qu&rsquo;il a besoin des informations sur les films, acteurs et réalisateurs pour générer ses statistiques. </p>
<p>Voilà, j&rsquo;en ai fini (enfin, me direz-vous ^^) avec les caractéristiques des modules. Comme pour le premier article, n&rsquo;hésitez surtout pas à vous manifester si vous avez des questions ou si vous n&rsquo;êtes pas d&rsquo;accord avec quelque chose que j&rsquo;ai dit ou si vous aimeriez plus d&rsquo;informations sur un point spécifique <img src="https://blog.developpez.com/wichtounet/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Concevoir une application modulaire &#8211; Implémentation</title>
		<link>https://blog.developpez.com/wichtounet/p6494/perso/concevoir_une_application_modulaire_impl</link>
		<comments>https://blog.developpez.com/wichtounet/p6494/perso/concevoir_une_application_modulaire_impl#comments</comments>
		<pubDate>Wed, 01 Oct 2008 23:50:01 +0000</pubDate>
		<dc:creator><![CDATA[Baptiste Wicht]]></dc:creator>
				<category><![CDATA[Conception]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JTheque]]></category>
		<category><![CDATA[Mes projets]]></category>
		<category><![CDATA[Perso]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Maintenant que nous avons vu en détails les caractéristiques des modules, nous allons voir comment mettre en oeuvre un module. Il nous faut donc un conteneur pour notre module qu&#8217;on puisse ensuite charger depuis notre application principale. Nous allons maintenant voir ce que sera un module au niveau Java. Comme un module est complètement indépendant de l&#8217;application principale, on ne peut inclure directement le module dans l&#8217;application principale, il faut distinguer le fichier du module [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Maintenant que nous avons <a href="http://blog.developpez.com/wichtounet?title=concevoir_une_application_modulaire_modu">vu en détails</a> les caractéristiques des modules, nous allons voir comment mettre en oeuvre un module. </p>
<p>Il nous faut donc un conteneur pour notre module qu&rsquo;on puisse ensuite charger depuis notre application principale. </p>
<p>Nous allons maintenant voir ce que sera un module au niveau Java. </p>
<p><span id="more-114"></span></p>
<p>Comme un module est complètement indépendant de l&rsquo;application principale, on ne peut inclure directement le module dans l&rsquo;application principale, il faut distinguer le fichier du module de celui de l&rsquo;application principale. </p>
<p>Il faut maintenant définir ce que vont être ces fichiers. Comme est au niveau Java, on peut s&rsquo;imaginer les modules comme des extensions de l&rsquo;application principale. Or pour étendre une application Java, on utilise des fichiers Jars. </p>
<p>Nos modules seront donc contenus dans des fichiers Jars. </p>
<p>Voici pour ce qui est de la manière de représenter physiquement un module, nous allons voir comment le représenter pour qu&rsquo;il soit utilisable au niveau Java. </p>
<p>Nous allons donc créer une interface permet de décrire les caractèristiques principales d&rsquo;un module. Nous allons rester simple pour le moment. Un module doit tout d&rsquo;abord être rattachable et ensuite détachable. C&rsquo;est-à-dire le moment ou il va se rattacher à l&rsquo;application, c&rsquo;est-à-dire l&rsquo;étendre et le moment où il va se détacher de l&rsquo;application. En plus de cela, un module a aussi un nom. Pour le moment, ce sera tout ce dont on a besoin. </p>
<p>On va donc avoir une interface tout simple décrivant notre module :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public interface IModule { <br />
&nbsp; &nbsp;public void plug(); <br />
&nbsp; &nbsp;public void unplug(); <br />
&nbsp; &nbsp;public String getName(); <br />
}</div></div>
<p>On pourrait donc créer un module très simple affichant quelque chose sur la console :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">package org.modules.simple; <br />
&nbsp;<br />
public class SimpleModule implements IModule { <br />
&nbsp; &nbsp;public void plug(){ <br />
&nbsp; &nbsp; &nbsp; System.out.println(&quot;Hello kernel !&quot;); <br />
&nbsp; &nbsp;} <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;public void unplug(){ <br />
&nbsp; &nbsp; &nbsp; System.out.println(&quot;Bye kernel !&quot;); <br />
&nbsp; &nbsp;} <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;public String getName(){ <br />
&nbsp; &nbsp; &nbsp; return &quot;Simple module&quot;; <br />
&nbsp; &nbsp;} <br />
}</div></div>
<p>Nous allons donc créer un fichier Jar contenant notre classe. </p>
<p>Il faut maintenant une solution pour que l&rsquo;application principale connaisse cette classe pour la lancer. Il faut donc un moyen pour qu&rsquo;elle trouve cette classe. </p>
<p>On pourrait imaginer parcourir le fichier jar et tester pour chacun des classes si c&rsquo;est un module ou non. Cette méthode bien que fonctionnelle n&rsquo;est pas du tout optimale car elle implique de parcourir toute l&rsquo;archive ce qui risque de prendre du temps dans le cas de gros module. Alors, on va utiliser les outils que nous offre Java et ajouter une mention dans le manifest du jar pour indiquer à l&rsquo;application principale quelle est la classe du module à charger. </p>
<p>Voilà à quoi ressemblerait notre Manifest pour notre petit module :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Manifest-Version: 1.0 <br />
Module-Class: org.modules.simple.SimpleModule</div></div>
<p>Cela permettra à l&rsquo;application principale de savoir quelle classe charger. </p>
<p>Je montrerai dans mon prochain billet une manière de charger ces modules. Car il ne suffit pas de mettre ces fichiers jars dans le classpath pour les charger étant donné que l&rsquo;application principale ne doit pas connaître les modules. </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Concevoir une application modulaire &#8211; Chargement</title>
		<link>https://blog.developpez.com/wichtounet/p6535/jtheque/concevoir_une_application_modulaire_char</link>
		<comments>https://blog.developpez.com/wichtounet/p6535/jtheque/concevoir_une_application_modulaire_char#comments</comments>
		<pubDate>Wed, 08 Oct 2008 11:08:51 +0000</pubDate>
		<dc:creator><![CDATA[Baptiste Wicht]]></dc:creator>
				<category><![CDATA[Conception]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JTheque]]></category>
		<category><![CDATA[Mes projets]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Maintenant que nous avons vu comment représenter un module au niveau Java, nous allons voir comment charger dynamiquement ces modules dans notre application. Au niveau de Java, les classes sont chargées depuis des ClassLoader qui comme son nom l&#8217;indique est un chargeur de classes. De base, Java utilise le ClassLoader système pour charger les classes dont notre application a besoin et ce ClassLoader contient les classes de notre application et toutes les classe qu&#8217;il a [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Maintenant que <a href="http://blog.developpez.com/wichtounet?title=concevoir_une_application_modulaire_impl">nous avons vu </a>comment représenter un module au niveau Java, nous allons voir comment charger dynamiquement ces modules dans notre application. </p>
<p>Au niveau de Java, les classes sont chargées depuis des ClassLoader qui comme son nom l&rsquo;indique est un chargeur de classes. </p>
<p><span id="more-7"></span></p>
<p>De base, Java utilise le ClassLoader système pour charger les classes dont notre application a besoin et ce ClassLoader contient les classes de notre application et toutes les classe qu&rsquo;il a pu découvrir dans le classpath qu&rsquo;on lui a fourni. </p>
<p>Le problème est que dans notre cas, on ne peut pas vraiment ajouter les fichiers Jar des modules au classpath étant donné que l&rsquo;application ne connait pas les modules. </p>
<p>De plus, on ne peut théoriquement pas modifier le ClassLoader système. Je dis théoriquement, parce qu&rsquo;il est possible de rajouter des fichiers ou des ressources à un ClassLoader en utilisant la réfléction et en appelant une méthode non publiques, mais je ne trouve que cette méthode soit très propre. </p>
<p>Nous allons donc devoir créer un nouveau ClassLoader avec lequel nous allons charger les classe de nos modules. </p>
<p>Il nous faudra donc procéder en deux phases : </p>
<ul>
<li>La première servira à explorer les fichiers des modules, à en sortir la classe du module et à récolter les URLs des fichiers Jar</li>
<li>La seconde va charger les différents modules en se servant d&rsquo;un ClassLoader créé avec les URLs collectées durant la première phase. </li>
</ul>
<p>On va donc créer une classe ModuleLoader qui va nous permettre d&rsquo;effectuer ces phases. </p>
<p>Prenons maintenant la première phase et créons une méthode qui retourne la liste des classes à charger.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public class ModuleLoader { <br />
&nbsp; &nbsp; private static List&lt;URL&gt; urls = new ArrayList&lt;URL&gt;(); <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; private static List&lt;String&gt; getModuleClasses(){ <br />
&nbsp; &nbsp; &nbsp; List&lt;String&gt; classes = new ArrayList&lt;String&gt;(); <br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; //On liste les fichiers de module &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; File[] files = new File(&quot;dossier&quot;).listFiles(new ModuleFilter()); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; for(File f : files){ <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; JarFile jarFile = null; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //On ouvre le fichier JAR <br />
&nbsp; &nbsp; &nbsp; &nbsp; jarFile = new JarFile(f); <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; //On récupère le manifest <br />
&nbsp; &nbsp; &nbsp; &nbsp; Manifest manifest = jarFile.getManifest(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //On récupère la classe <br />
&nbsp; &nbsp; &nbsp; &nbsp; String moduleClassName = manifest.getMainAttributes().getValue(&quot;Module-Class&quot;); <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; classes.add(moduleClassName); <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; urls.add(f.toURI().toURL()); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (IOException e) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace(); <br />
&nbsp; &nbsp; &nbsp; } finally { <br />
&nbsp; &nbsp; &nbsp; &nbsp; if(jarFile != null){ <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jarFile.close(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (IOException e) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; return classes; <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; private static class ModuleFilter implements FileFilter { <br />
&nbsp; &nbsp; @Override <br />
&nbsp; &nbsp; public boolean accept(File file) { <br />
&nbsp; &nbsp; &nbsp; return file.isFile() &amp;&amp; file.getName().toLowerCase().endsWith(&quot;.jar&quot;); <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; } <br />
}</div></div>
<p>Comme vous le voyez, ce n&rsquo;est pas très compliqué, on parcours les fichiers Jar existant dans le dossier des modules, on ouvre le fichier Jar, on récupère le manifest et on récupère la classe du module. Ensuite de quoi, on ajoute encore l&rsquo;URL du fichier Jar à la liste des URLs. </p>
<p>Bien entendu ce code est perfectible, il faudrait traiter le cas ou le fichier JAR n&rsquo;a pas de manifest ou alors le cas ou le manifest n&rsquo;a pas de classe de module et il faudrait traiter les erreurs correctement, mais ce n&rsquo;est pas le but de ce billet. </p>
<p>On peut maintenant passer à la deuxième méthode qui va créer le ClassLoader et instancier les modules puis les retourner :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">private static ClassLoader classLoader; <br />
&nbsp;<br />
public static List&lt;IModule&gt; loadModules(){ <br />
&nbsp; List&lt;IModule&gt; modules = new ArrayList&lt;IModule&gt;(); <br />
&nbsp; <br />
&nbsp; List&lt;String&gt; classes = getModuleClasses(); <br />
&nbsp; <br />
&nbsp; AccessController.doPrivileged(new PrivilegedAction&lt;Object&gt;(){ <br />
&nbsp; &nbsp; @Override <br />
&nbsp; &nbsp; public Object run() { <br />
&nbsp; &nbsp; &nbsp; classLoader = new URLClassLoader( <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; urls.toArray(new URL[urls.size()]), &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ModuleLoader.class.getClassLoader()); <br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; return null; <br />
&nbsp; &nbsp; } <br />
&nbsp; }); <br />
&nbsp; <br />
&nbsp; for(String c : classes){ <br />
&nbsp; &nbsp; try { <br />
&nbsp; &nbsp; &nbsp; Class&lt;?&gt; moduleClass = Class.forName(c, true, classLoader); <br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; if(IModule.class.isAssignableFrom(moduleClass)){ <br />
&nbsp; &nbsp; &nbsp; &nbsp; Class&lt;IModule&gt; castedClass = (Class&lt;IModule&gt;)moduleClass; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; IModule module = castedClass.newInstance(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; modules.add(module); <br />
&nbsp; &nbsp; &nbsp; } &nbsp;<br />
&nbsp; &nbsp; } catch (ClassNotFoundException e1) { <br />
&nbsp; &nbsp; &nbsp; e1.printStackTrace(); <br />
&nbsp; &nbsp; } catch (InstantiationException e) { <br />
&nbsp; &nbsp; &nbsp; e.printStackTrace(); <br />
&nbsp; &nbsp; } catch (IllegalAccessException e) { <br />
&nbsp; &nbsp; &nbsp; e.printStackTrace(); <br />
&nbsp; &nbsp; } <br />
&nbsp; } <br />
&nbsp; <br />
&nbsp; return modules; <br />
}</div></div>
<p>On commence donc créer un nouveau ClassLoader à partir des URLs qu&rsquo;on a récupéré avec les fichiers JARs. On va utiliser un URLClassLoader qui permet de charger des classes depuis des emplacements définis par des URLs. On va lui donner comme parent le ClassLoader de la classe. Comme cela les modules qui utiliseront ce classloader pourront également utiliser les classes de l&rsquo;application, ce qui est le but d&rsquo;une application modulaire. Une fois qu&rsquo;on a créé notre ClassLoader, on va parcourir toutes nos classes et les instancier si elles implémentent bien la bonne interface. Ensuite, on va pouvoir les ajouter à la liste et les retourner. </p>
<p>Encore une fois, ce code est perfectible, il faudrait traiter les erreurs et réagir aux différents cas possibles, mais j&rsquo;ai essayé de faire au plus court. </p>
<p>Notre chargeur de modules est donc terminé. </p>
<p>Nous pouvons tester notre application en créant un Jar pour le module que nous avons défini dans le billet précédent et en créant un code tout simple pour les charger :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">List&lt;IModule&gt; modules = ModuleLoader.loadModules(); <br />
&nbsp;<br />
for(IModule module : modules){ <br />
&nbsp; System.out.println(&quot;Plug : &quot; + module.getName()); <br />
&nbsp; module.plug(); <br />
} <br />
&nbsp;<br />
System.out.println(&quot;Déroulement de l'application. &quot;); <br />
&nbsp;<br />
for(IModule module : modules){ <br />
&nbsp; module.unplug(); <br />
}</div></div>
<p>Voici ce que rendrait l&rsquo;éxécution : </p>
<blockquote><p>Plug : Simple module<br />
Hello kernel !<br />
Déroulement de l&rsquo;application.<br />
Bye kernel !</p></blockquote>
<p>Comme vous le voyez, nous venons de développer une application modulaire. Bien entendu, il faut ensuite développer tous les services et les points d&rsquo;extension, mais ces points sont spécifiques à l&rsquo;application. </p>
<p>La technique présentée dans ce billet pose néanmoins un problème pour ce qui est du déploiement à la volée de module. En effet, si on charge un module après le chargement des premiers modules, on devra recréer un nouveau ClassLoader et on aura donc une partie des modules dans le premier ClassLoader et une partie des modules dans le second ClassLoader. Néanmoins, si les modules n&rsquo;ont aucune intéraction entre eux, vous pouvez tout à fait envisager cette méthode pour le déploiement à la volée. Si ce n&rsquo;est pas le cas, vous serez obligé de vous rabattre sur la méthode avec réfléction pour ajouter des modules dans votre ClassLoader. Je présenterai peut-être cette méthode dans un prochain billet. </p>
<p>Le fait d&rsquo;avoir un deuxième ClassLoader pose également un problème pour les librairies qui chargent des classes à la volée comme par exemple Spring IOC ou Hibernate. Il faut voir au cas par cas pour ces librairies comment on peut leur spécifier d&rsquo;utiliser notre ClassLoader. Souvent ceci est faisable en spécifiant le contextClassLoader via la méthode <em>Thread.currentThread().setContextClassLoader(ClassLoader cl)</em>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
