<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on Java &amp; Moi</title><link>https://javaetmoi.com/posts/</link><description>Recent content in Posts on Java &amp; Moi</description><generator>Hugo</generator><language>fr</language><lastBuildDate>Mon, 06 Apr 2026 13:26:43 +0000</lastBuildDate><atom:link href="https://javaetmoi.com/posts/feed.xml" rel="self" type="application/rss+xml"/><item><title>Découverte de Spring Modulith</title><link>https://javaetmoi.com/2026/04/decouverte-de-spring-modulith/</link><pubDate>Mon, 06 Apr 2026 13:26:43 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2642</guid><description>&lt;p&gt;En 2025, j’ai eu l’opportunité de mettre en place &lt;a href="https://spring.io/projects/spring-modulith"&gt;&lt;strong&gt;Spring Modulith&lt;/strong&gt;&lt;/a&gt; sur une nouvelle application web. Pour partager cette expérience avec mes collègues, j’ai préparé une démonstration live montrant comment intégrer Spring Modulith dans une application Spring Boot.&lt;/p&gt;
&lt;p&gt;J’avais besoin pour cela d’une application simple et universelle. Vous commencez à me connaitre : mon choix s’est naturellement porté sur la version canonique de &lt;strong&gt;Spring Petclinic&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pris au jeu, j’ai progressivement enrichi l’application afin d’illustrer plusieurs fonctionnalités clés de Spring Modulith. J’ai ensuite mis ce fork à disposition de la communauté Spring Petclinic dont le code source complet est disponible sur GitHub : &lt;a href="https://github.com/spring-petclinic/spring-petclinic-modulith"&gt;spring-petclinic-modulith&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dans ce billet, je vous propose de découvrir Spring Modulith, puis de suivre pas à pas comment l’application démo Spring Petclinic a été enrichie pour tirer parti de ses fonctionnalités.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Bannière Spring PetClinic Modulith"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2026/04/banner-spring-petclinic-modulith.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Révolutionnez votre prise de notes : du Bullet Journal à Obsidian</title><link>https://javaetmoi.com/2025/10/revolutionnez-votre-prise-de-notes-du-bullet-journal-a-obsidian/</link><pubDate>Thu, 30 Oct 2025 16:45:25 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2612</guid><description>&lt;p&gt;Lors de la conférence &lt;a href="https://devfest2025.gdgnantes.com/"&gt;Devfest Nantes 2025&lt;/a&gt;, j&amp;rsquo;ai assisté au talk d&amp;rsquo; &lt;strong&gt;&lt;a href="https://linktr.ee/hoani.cross"&gt;Hoani Cross&lt;/a&gt;&lt;/strong&gt; portant sur la &lt;strong&gt;prise de notes&lt;/strong&gt;. Loin d&amp;rsquo;être nouveau, ce sujet m&amp;rsquo;a particulièrement interpellé. Figurez-vous en effet qu&amp;rsquo;une partie des &lt;strong&gt;articles publiés sur ce blog&lt;/strong&gt; (dont celui que vous avez sous les yeux) vient des notes rédigées lors de conférences, de projets personnels ou bien encore de ma veille techno.&lt;/p&gt;
&lt;p&gt;Dans son talk, Hoani nous présente le logiciel &lt;strong&gt;&lt;a href="https://obsidian.md/"&gt;Obsidian&lt;/a&gt;&lt;/strong&gt;, la manière dont &lt;strong&gt;il l&amp;rsquo;utilise au quotidien&lt;/strong&gt; pour &lt;strong&gt;noter&lt;/strong&gt; et &lt;strong&gt;gérer son activité&lt;/strong&gt;, qu&amp;rsquo;elle soit professionnelle ou personnelle.&lt;br&gt;Je suis sorti de sa présentation quelque peu désarçonné. Hoani utilise Obsidian comme un &lt;strong&gt;Bullet Journal&lt;/strong&gt; (qu&amp;rsquo;on appelle aussi « &lt;strong&gt;bujo&lt;/strong&gt; ») numérique pour compiler &lt;strong&gt;notes&lt;/strong&gt;, &lt;strong&gt;pense-bêtes&lt;/strong&gt;, &lt;strong&gt;objectifs&lt;/strong&gt;, &lt;strong&gt;rappels&lt;/strong&gt;, &lt;strong&gt;tracking&lt;/strong&gt;, &lt;strong&gt;plannings&lt;/strong&gt; et &lt;strong&gt;coups de coeur&lt;/strong&gt;. Son utilisation est vraiment avancée et très régulière. Je ne me voyais pas passer autant de temps que lui sur Obsidian.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;autre domaine dans lequel Obsidian semble exceller consiste en la possibilité de se créer un &lt;strong&gt;Second Cerveau&lt;/strong&gt;. Les notes peuvent être reliées ensemble à l&amp;rsquo;aide de &lt;strong&gt;Map Of Content&lt;/strong&gt; (MOC). Une alternative aux &lt;strong&gt;hashtags&lt;/strong&gt; et l&amp;rsquo;organisation hiérarchisée en &lt;strong&gt;dossiers&lt;/strong&gt; et sous-dossiers.&lt;br&gt;Une note de type Map of Content s&amp;rsquo;assimile à une thématique, un sujet principal, auquel on rattache bidirectionnellement des notes et qui va faire office de table de matières et de tableau de bord. La création de sous-MOCs spécialisés reste possible. On se rapproche du web, des liens hypertextes et du &lt;strong&gt;mind mapping&lt;/strong&gt;.&lt;br&gt;Dans ce billet, j&amp;rsquo;aimerais vous restituer la prestation d&amp;rsquo;Hoani et vous laisser découvrir son utilisation Obsidian.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Photo du talk de oani Cross à DevFest Nantes 2025"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2025/10/DevFest-Nantes-2025-Obsidian.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>JSpecify + NullAway + ErrorProne : la configuration Maven ultime pour dire adieu aux NullPointerException</title><link>https://javaetmoi.com/2025/07/jspecify-nullaway-errorprone-la-configuration-maven-ultime-pour-dire-adieu-aux-nullpointerexception/</link><pubDate>Sat, 05 Jul 2025 17:06:00 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2599</guid><description>&lt;p&gt;La gestion de la &lt;strong&gt;nullabilité&lt;/strong&gt; en Java a longtemps été source de bugs et de fragmentation.
Contrairement à Kotlin par exemple, Java ne possède pas encore nativement de moyen d’exprimer la nullité d’un type.
Qui n’aura donc jamais ragé contre une &lt;code&gt;NullPointerException&lt;/code&gt; survenue en production ? En juin 2024, avec l’arrivée de la spécification &lt;a href="https://jspecify.dev/"&gt;&lt;strong&gt;JSpecify&lt;/strong&gt;&lt;/a&gt;, soutenue par des acteurs majeurs comme Google, Microsoft, JetBrains, Oracle, Sonar ou bien encore Broadcom (Spring),
l’écosystème Java dispose enfin d’une &lt;strong&gt;bibliothèque unifiée d’annotations de nullité&lt;/strong&gt;.
Pour bénéficier d’une détection efficace des NullPointerException dès la compilation, il est nécessaire de coupler JSpecify à des outils d’analyse statique comme &lt;a href="https://github.com/uber/NullAway"&gt;&lt;strong&gt;NullAway&lt;/strong&gt;&lt;/a&gt; (Uber) et &lt;a href="https://errorprone.info/"&gt;&lt;strong&gt;ErrorProne&lt;/strong&gt;&lt;/a&gt; (Google).&lt;/p&gt;
&lt;p&gt;Ce court article explique comment mettre en place sur un projet d’entreprise la &lt;strong&gt;configuration Maven&lt;/strong&gt; correspondante qui fera casser votre build et votre CI lorsque vous essayerez de passer une variable &lt;code&gt;null&lt;/code&gt; en paramètre d’une méthode qui ne les accepte pas.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Screenshot du site de JSpecify"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2025/07/Screenshot-site-JSpecify.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>De Spring Data JPA à jOOQ</title><link>https://javaetmoi.com/2025/06/de-spring-data-jpa-a-jooq/</link><pubDate>Mon, 16 Jun 2025 06:57:01 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2580</guid><description>&lt;p&gt;Lors de la conférence Devoxx France 2025, j’ai participé à un hands-on lab de 2h intitulé &lt;a href="https://www.devoxx.fr/agenda-2025/talk/sortir-des-orms-avec-jooq/"&gt;Sortir des ORMs avec jOOQ&lt;/a&gt;. Acronyme de « &lt;strong&gt;Java Object Oriented Querying&lt;/strong&gt; », &lt;strong&gt;jOOQ&lt;/strong&gt; se présente comme une &lt;strong&gt;alternative à JPA&lt;/strong&gt; permettant d’ &lt;strong&gt;écrire des requêtes SQL&lt;/strong&gt; en Java via une &lt;strong&gt;fluent API&lt;/strong&gt;. Animé par Sylvain Decout et Samuel Lefebvre, cet atelier visait à migrer une application Spring Boot / JPA vers jOOQ à l’aide du &lt;strong&gt;starter Spring Boot&lt;/strong&gt; pour jOOQ. Pour les curieux, le repo de l’atelier est disponible sur Github : &lt;a href="https://github.com/sylvaindecout/jooq-handson"&gt;jooq-handson&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Fort de cette découverte, je me suis à mon tour prêté à l’exercice de migrer vers jOOQ la couche de persistance Spring Data JPA de l’application démo Spring Petclinic. Un nouveau fork est né : &lt;a href="https://github.com/spring-petclinic/spring-petclinic-jooq"&gt;&lt;strong&gt;spring-petclinic-jooq&lt;/strong&gt;&lt;/a&gt;. Bienvenue à ce dernier dans la communauté Spring Petclinic.&lt;/p&gt;
&lt;p&gt;L’usage de jOOQ se rapproche de l’utilisation de JdbcTemplate. Le développeur maitrise le nombre de requêtes envoyées à la base de données relationnelle. Ce qui les différencie, c’est la syntaxe : pas de SQL, mais une &lt;strong&gt;API Java fluide&lt;/strong&gt; et &lt;strong&gt;type-safe&lt;/strong&gt; spécifique à jOOQ qu’il va falloir appréhender. Rassurez-vous, cette API se rapproche du SQL : on y retrouve les mots clés &lt;strong&gt;select&lt;/strong&gt;, &lt;strong&gt;update&lt;/strong&gt;, &lt;strong&gt;insertInto&lt;/strong&gt;, &lt;strong&gt;where&lt;/strong&gt;, &lt;strong&gt;from&lt;/strong&gt;, &lt;strong&gt;join&lt;/strong&gt;, &lt;strong&gt;on&lt;/strong&gt;, &lt;strong&gt;as&lt;/strong&gt;… A ceux-ci, on ajoute des mots clés spécifiques à jOOQ : &lt;strong&gt;paginate&lt;/strong&gt;, &lt;strong&gt;fetch&lt;/strong&gt;, &lt;strong&gt;convertFrom&lt;/strong&gt; … La &lt;a href="https://www.jooq.org/learn/"&gt;&lt;strong&gt;documentation&lt;/strong&gt;&lt;/a&gt; de jOOQ est très &lt;strong&gt;complète&lt;/strong&gt;. On y apprend comment écrire des requêtes complexes à base de window function ou de Common Table Expressions (CTE) et comment utiliser des fonctionnalités avancées de SQL que peu de frameworks ORM supportent nativement : &lt;a href="https://www.jooq.org/doc/latest/manual/sql-building/column-expressions/json-functions/"&gt;JSON functions&lt;/a&gt;, &lt;a href="https://blog.jooq.org/how-to-use-sql-pivot-to-compare-two-tables-in-your-database/"&gt;PIVOT&lt;/a&gt;, &lt;a href="https://www.jooq.org/doc/latest/manual/sql-building/sql-statements/merge-statement/"&gt;MERGE&lt;/a&gt;, &lt;a href="https://www.jooq.org/doc/latest/manual/sql-building/sql-statements/select-statement/set-operations/set-operation-union/"&gt;UNION&lt;/a&gt; …&lt;/p&gt;
&lt;p&gt;Cet article a pour objectif d’expliquer les &lt;strong&gt;étapes&lt;/strong&gt; adoptées pour &lt;strong&gt;migrer l’implémentation Spring Data JPA des repository vers jOOQ&lt;/strong&gt;. Des exemples de code avant / après y sont proposés.&lt;/p&gt;</description></item><item><title>L’API Gatherers : l’outil qui manquait à vos Streams</title><link>https://javaetmoi.com/2025/04/api-gatherers-outil-qui-manquait-a-vos-streams/</link><pubDate>Fri, 25 Apr 2025 06:09:01 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2551</guid><description>&lt;p&gt;Date : 16 avril 2025&lt;br&gt;Conférence : &lt;a href="https://www.devoxx.fr/"&gt;Devoxx France 2025&lt;/a&gt;&lt;br&gt;Speaker : &lt;a href="https://www.linkedin.com/in/jos%C3%A9-paumard-2458ba5/"&gt;José Paumard&lt;/a&gt; (Oracle)&lt;br&gt;Format : Conférence 45 mn &lt;br&gt;Support : &lt;a href="https://speakerdeck.com/josepaumard/lapi-gatherer-loutil-qui-manquait-a-vos-streams-4df175d2-6466-479e-bff1-369a2cad324a"&gt;slides sur Speakerdeck&lt;/a&gt; / &lt;a href="https://www.youtube.com/watch?v=__piR-N9pXA"&gt;replay Youtube&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Java Developer Advocate&lt;/strong&gt; chez Oracle, &lt;strong&gt;José Paumard&lt;/strong&gt; nous présente la nouvelle &lt;a href="https://docs.oracle.com/en/java/javase/24/core/stream-gatherers.html"&gt;&lt;strong&gt;API Gatherers&lt;/strong&gt;&lt;/a&gt; qui, depuis Java 24, vient se greffer sur l’ &lt;strong&gt;API Stream&lt;/strong&gt; Java sortie il y’a 11 ans avec Java 8.&lt;/p&gt;
&lt;p&gt;Tout comme l’API Collector, José commence par rappeler que l’API Gatherers est indépendante de l’API Stream. Cette API a été introduite dans Java via la &lt;a href="https://openjdk.org/jeps/485"&gt;JEP 485 Stream Gatherers&lt;/a&gt; conduite par &lt;a href="https://viktorklang.com/"&gt;Viktor Klang&lt;/a&gt;. Les plus curieux pourront regarder la &lt;a href="https://www.youtube.com/watch?v=v_5SKpfkI2U"&gt;vidéo Youtube&lt;/a&gt; du Deep Dive qu’a animé Viktor lors de la conférence JavaOne qui s’est tenue en mars 2025.&lt;/p&gt;
&lt;p&gt;L’article &lt;a href="https://dev.java/learn/api/streams/gatherers/"&gt;The Gatherer API&lt;/a&gt; permet également d’approfondir votre étude des Gatherers. Notez que le site &lt;a href="https://dev.java/"&gt;dev.java&lt;/a&gt; permet désormais d’exécuter des snippets Java (pas directement dans le navigateur, mais sur un serveur Cloud).&lt;/p&gt;
&lt;p&gt;Toutes les classes et interfaces de l’API Gatherers ont été ajoutées au &lt;strong&gt;package java.util.stream&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="L’API Gatherers : l’outil qui manquait à vos Streams"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2025/04/word-image-2551-1-edited.jpeg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Les clés de l'architecture pour les dévs</title><link>https://javaetmoi.com/2025/04/cles-de-l-architecture-pour-les-devs/</link><pubDate>Tue, 22 Apr 2025 17:54:32 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2508</guid><description>&lt;p&gt;Conférence : &lt;a href="https://www.devoxx.fr/"&gt;Devoxx France 2025&lt;/a&gt;&lt;br&gt;
Date : 17 avril 2025&lt;br&gt;
Speakers : &lt;a href="https://www.linkedin.com/in/martraire/?originalSubdomain=fr"&gt;Cyrille Martraire&lt;/a&gt; (Arolla), &lt;a href="https://www.linkedin.com/in/eric-le-merdy-bb60704/?originalSubdomain=fr"&gt;Eric Le Merdy&lt;/a&gt; (QuickSign) remplaçant de &lt;a href="https://www.linkedin.com/in/christian-sperandio-25182a12"&gt;Christian Sperandio&lt;/a&gt; (Arolla)&lt;br&gt;
Format : Conférence (45mn) / &lt;a href="https://www.youtube.com/watch?v=ZoYDxF_7LoI&amp;amp;t=528s"&gt;Replay Youtube&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cette conférence a pour &lt;strong&gt;objectif&lt;/strong&gt; d’ &lt;strong&gt;ouvrir les portes&lt;/strong&gt; en nous donnant les &lt;strong&gt;clés de l’architecture&lt;/strong&gt;. Pour seconder Cyrille, Eric a du remplacer Christian au pied levé. &lt;br&gt;
Un constat est posé. Sur les &lt;strong&gt;dix dernières années&lt;/strong&gt;, les &lt;strong&gt;systèmes&lt;/strong&gt; ont changé : ils sont devenus &lt;strong&gt;modulaires&lt;/strong&gt;, de plus en plus &lt;strong&gt;distribués&lt;/strong&gt;. La modularité permise par le Cloud permet de répartir la charge. Il y’a &lt;strong&gt;de&lt;/strong&gt; &lt;strong&gt;plus en plus d’interconnexions entre briques applicatives&lt;/strong&gt;. &lt;br&gt;
&lt;strong&gt;L’architecture bouge tout le temps&lt;/strong&gt;, évolue constamment. &lt;br&gt;
&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Cyrille Martraire et Eric Le Merdy sur la scène de Devoxx France 2025"
class="image_figure image_external image_processed"
width="1384"
height="778"
src="https://javaetmoi.com/word-image-2508-1_8428793415211744030.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Que doit-on savoir ? Pour commencer, on ne saura jamais tout et il faudra vivre avec. Personne ne sait tout. Même le plus capé des architectes.&lt;/p&gt;
&lt;p&gt;Comme fil conducteur, Cyrille et Eric prennent un &lt;strong&gt;exemple réel&lt;/strong&gt; issu du monde des &lt;strong&gt;télécommunications&lt;/strong&gt;. &lt;br&gt;
Pour cahier des charges, le client précise que le &lt;strong&gt;système&lt;/strong&gt; va &lt;strong&gt;recevoir des fichiers chaque minute&lt;/strong&gt; et doit &lt;strong&gt;les intégrer tous les 15mn&lt;/strong&gt;. Contexte : ces fichiers viennent d’équipements télécom.&lt;/p&gt;</description></item><item><title>Optimisez vos applications Spring Boot avec CDS et le projet Leyden</title><link>https://javaetmoi.com/2025/04/optimisez-vos-applications-spring-boot-avec-cds-et-le-projet-leyden/</link><pubDate>Mon, 21 Apr 2025 12:04:33 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2482</guid><description>&lt;p&gt;Conférence : &lt;a href="https://www.devoxx.fr/"&gt;Devoxx France 2025&lt;/a&gt;&lt;br&gt;
Date : 17 avril 2025&lt;br&gt;Speaker : &lt;a href="https://seb.deleuze.fr/"&gt;Sébastien Deleuze&lt;/a&gt; (Broadcom)&lt;br&gt;
Format : Conférence (45 mn) / &lt;a href="https://www.youtube.com/watch?v=4EAxhhSWgw4"&gt;Replay Youtube&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sébastien est Core Commiter sur &lt;a href="https://spring.io/projects/spring-framework"&gt;Spring Framework&lt;/a&gt;.
Il intervient également sur des sujets transverses au portfolio Spring : support de Kotlin, null-safety (avec &lt;a href="https://jspecify.dev/"&gt;JSpecify&lt;/a&gt;) et les sujets d’optimisation.
Dans ce talk, il a pour ambition de nous montrer &lt;strong&gt;comment améliorer l’efficacité de 80% des applications Spring&lt;/strong&gt;, que ce soit de nouvelles applications ou des applications Legacy.&lt;/p&gt;
&lt;p&gt;Les raisons d’améliorer l’efficacité de nos applications sont multiples :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Baisser le cout&lt;/strong&gt; de run des applications&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Développement durable&lt;/strong&gt; pour diminuer la consommation d’énergie, de mémoire et de CPU&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimiser&lt;/strong&gt; les applications pour les &lt;strong&gt;containers&lt;/strong&gt; (sur le Cloud ou OnPremise)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour arriver à nos fins, Sébastien nous propose 3 technologies :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CDS&lt;/strong&gt; : techno relativement vieille mais qui s’est améliorée au fil des versions de Java&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AOT cache&lt;/strong&gt; : Java 24 permet d’utiliser l’AOT cache qui est une version améliorée CDS. Sébastien prédit l’exploision de AOT Cache avec la LTS Java 25&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AOT cache with profiling&lt;/strong&gt; : technologie expérimentale et prometeuse&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Sébastien Deleuze at Devoxx France 2025"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2025/04/word-image-2482-1.jpeg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Spring Petclinic sous extensions Quarkus</title><link>https://javaetmoi.com/2025/04/spring-petclinic-sous-extensions-quarkus/</link><pubDate>Sun, 13 Apr 2025 16:55:14 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2443</guid><description>&lt;p&gt;Spring et Quarkus dans le même repository Git, ou presque. Cela vous intrigue ? &lt;br&gt;Figurez-vous qu’il y’a quelques mois, la lecture du très bon &lt;strong&gt;livre &lt;a href="https://agoncal.teachable.com/p/ebook-understanding-quarkus"&gt;Understanding Quarkus 2.x&lt;/a&gt;&lt;/strong&gt; d’Antonio Gongalves m’a donné envie de pratiquer ce framework alternatif à Spring Boot. Et pour apprendre une nouvelle technologie, quoi de plus stimulant que de se fixer un objectif. Je me suis donc donné comme challenge de migrer vers Quarkus l’application démo Spring Boot que je connais bien. Une fois migrée, l’application devait rester &lt;strong&gt;iso-fonctionnelle&lt;/strong&gt;. &lt;br&gt;A travers leur repo &lt;a href="https://github.com/redhat-developer-demos/quarkus-petclinic"&gt;quarkus-petclinic&lt;/a&gt;, RedHat avait fait l’exercice avant moi. Malheureusement, l’historique Git a été écrasé, ne laissant aucune trace du chemin de migration parcouru. Pendant 3 mois, j&amp;rsquo;ai donc travaillé sur un nouveau fork que je suis fier de vous présenter : &lt;a href="https://github.com/arey/quarkus-spring-petclinic"&gt;&lt;strong&gt;quarkus-spring-petclinic&lt;/strong&gt;&lt;/a&gt;. Ajouté à la communauté Spring Petclinic, ce fork a un double objectif :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Montrer comment &lt;strong&gt;migrer une application Spring Boot 3.4 vers Quarkus 3.21&lt;/strong&gt;, avec le minium d&amp;rsquo;effort et en modifiant le moins de code possible&lt;/li&gt;
&lt;li&gt;Utiliser les &lt;strong&gt;extensions Spring&lt;/strong&gt; proposées par &lt;strong&gt;Quarkus&lt;/strong&gt; pour garder un lien avec le monde Spring tout en soulignant l&amp;rsquo;effort de l&amp;rsquo;équipe Quarkus pour supporter Spring, un framework incontournable de l&amp;rsquo;écosystème Java&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Les &lt;strong&gt;extensions Spring pour Quarkus&lt;/strong&gt; utilisées sont au nombre de quatre : &lt;strong&gt;Spring DI&lt;/strong&gt;, &lt;strong&gt;Spring Web&lt;/strong&gt;, &lt;strong&gt;Spring Data JPA&lt;/strong&gt; et &lt;strong&gt;Spring Cache&lt;/strong&gt;.&lt;br&gt;Le changement majeur aura été de porter le templating des pages HTML de &lt;strong&gt;Thymeleaf&lt;/strong&gt; vers &lt;strong&gt;Qute&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Débutant en Quarkus, le code proposé ne respecte peut-être pas toutes les règles de l’art prônées par l’équipe de dév Quarkus. Je m’en excuse par avance. Si vous voulez contribuer et corriger le tir : &lt;a href="https://github.com/spring-petclinic/quarkus-spring-petclinic/issues"&gt;issue&lt;/a&gt; et &lt;a href="https://github.com/spring-petclinic/quarkus-spring-petclinic/pulls"&gt;Pull Request&lt;/a&gt; sont les bienvenues.&lt;/p&gt;
&lt;p&gt;Le &lt;a href="https://github.com/spring-petclinic/quarkus-spring-petclinic/compare/spring-boot-version...v3.21.0"&gt;différenciel complet&lt;/a&gt; entre la version Spring Boot et la version Quarkus de Petclinic peut-être visualisé sur Github.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=" "
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2025/04/word-image-2443-1.png"
title=" "
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Intégrer un Chatbot dans une webapp Java avec LangChain4j</title><link>https://javaetmoi.com/2024/11/integrer-un-chatbot-dans-une-webapp-java-avec-langchain4j/</link><pubDate>Mon, 11 Nov 2024 18:34:24 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2391</guid><description>&lt;p&gt;Cet article explique comment intégrer un &lt;strong&gt;chatbot&lt;/strong&gt; utilisant l’ &lt;strong&gt;IA générative&lt;/strong&gt; dans une &lt;strong&gt;application de gestion&lt;/strong&gt; codée en &lt;strong&gt;Java&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Nous nous appuierons sur le framework Open Source &lt;a href="https://docs.langchain4j.dev/"&gt;&lt;strong&gt;LangChain4j&lt;/strong&gt;&lt;/a&gt;, une adaptation Java de la célèbre librairie python LangChain,
visant à simplifier l&amp;rsquo;intégration de grands modèles de langage ( &lt;strong&gt;LLM&lt;/strong&gt;). LangChain4j permet de créer des &lt;strong&gt;agents conversationnels&lt;/strong&gt;, des &lt;strong&gt;assistants virtuels&lt;/strong&gt; (comme notre chatbot),
ou des applications capables d&amp;rsquo;effectuer des &lt;strong&gt;analyses de texte&lt;/strong&gt; et de répondre en fonction de données contextuelles, le tout sans devoir écrire de code complexe et avec un &lt;strong&gt;haut niveau d’abstraction&lt;/strong&gt;.
Elle facilite notamment l&amp;rsquo;utilisation des API des Large Langage Model comme &lt;a href="https://docs.langchain4j.dev/integrations/language-models/open-ai"&gt;OpenAI&lt;/a&gt; et &lt;a href="https://docs.langchain4j.dev/integrations/language-models/hugging-face"&gt;Hugging Face&lt;/a&gt;,
et propose différents connecteurs pour des bases de données vectorielles, incluant &lt;a href="https://docs.langchain4j.dev/integrations/embedding-stores/elasticsearch"&gt;Elasticsearch&lt;/a&gt; et &lt;a href="https://docs.langchain4j.dev/integrations/embedding-stores/qdrant"&gt;Qdrant&lt;/a&gt;.
Pour accélérer son intégration, LangChain4j propose des extensions pour &lt;strong&gt;Quarkus&lt;/strong&gt; et des starters pour &lt;strong&gt;Spring Boot&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pour illustrer cet article, nous utiliserons l’illustre application démo &lt;strong&gt;Spring Petclinic&lt;/strong&gt; et son récent fork dédié à LangChain4j : &lt;a href="https://github.com/spring-petclinic/spring-petclinic-langchain4j"&gt;&lt;strong&gt;spring-petclinic-langchain4j&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;Propulsé par Spring Boot, Spring Petclinic s’appuie sur &lt;strong&gt;Spring Data JPA&lt;/strong&gt; pour l’accès aux données et &lt;strong&gt;Thymeleaf&lt;/strong&gt; pour la couche présentation HTML / CSS / JavaScript.&lt;br&gt;En septembre 2024, Oded Shopen, contributeur en 2020 du fork &lt;a href="https://github.com/spring-petclinic/spring-petclinic-cloud/"&gt;Spring Petclinic Cloud&lt;/a&gt;, &lt;a href="https://spring.io/blog/2024/09/26/ai-meets-spring-petclinic-implementing-an-ai-assistant-with-spring-ai-part-i"&gt;a proposé une intégration de Spring AI dans Spring Petclinic&lt;/a&gt;. De son travail, est né le projet &lt;a href="https://github.com/spring-petclinic/spring-petclinic-ai"&gt;spring-petclinic-ai&lt;/a&gt;. Le repository &lt;a href="https://github.com/spring-petclinic/spring-petclinic-langchain4j"&gt;spring-petclinic-langchain4j&lt;/a&gt; est un &lt;strong&gt;portage&lt;/strong&gt; du framework &lt;strong&gt;&lt;a href="https://spring.io/projects/spring-ai/"&gt;Spring AI&lt;/a&gt;&lt;/strong&gt; vers &lt;strong&gt;LangChain4j&lt;/strong&gt;. Y a été ajouté notamment une fonctionnalité de &lt;strong&gt;streaming&lt;/strong&gt;.&lt;br&gt;Extraits du sample, les exemples de code s’appuient sur les versions 3.3 de Spring Boot et &lt;strong&gt;0.35.0 de LangChaing4j&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=" "
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2024/11/langchain4j-question-llm.png"
title=" "
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Compatibilité Jakarta EE 9 de vieux frameworks</title><link>https://javaetmoi.com/2024/08/compatibilite-jakarta-ee-9-de-vieux-frameworks/</link><pubDate>Sun, 25 Aug 2024 15:54:14 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2374</guid><description>&lt;h2 id="de-java-ee-à-jakarta-ee"&gt;De Java EE à Jakarta EE&lt;/h2&gt;
&lt;p&gt;En &lt;strong&gt;2017&lt;/strong&gt;, &lt;strong&gt;Oracle&lt;/strong&gt; a fait &lt;strong&gt;don de la spécification Java EE&lt;/strong&gt; (précédemment connu sous le nom de J2EE) à la fondation &lt;strong&gt;Eclipse&lt;/strong&gt;.
Java EE regroupe différentes API utilisées aussi bien par des serveurs d’applications, des containers de servlets et des frameworks comme Quarkus ou Spring :
&lt;strong&gt;Servlet&lt;/strong&gt;, JSP, JSF, JPA, JTA, JAX-WS, JAX-RS, JAXB, WebSocket, Bean Validation, CDI, EL … &lt;br&gt;&lt;/p&gt;
&lt;p&gt;Sous l’égide d’Eclipse, Java EE a été rebaptisé Jakarta EE. La fondation a récupéré la base de code Java et les TCK.
En &lt;strong&gt;2019&lt;/strong&gt; est sortie une version &lt;strong&gt;Jakarta EE 8&lt;/strong&gt; pleinement compatible avec Java EE 8.
Comme seul changement notable pour les dév &lt;strong&gt;, le groupId des artefacts Maven a été renommé de javax à jakarta&lt;/strong&gt;.
Le patch du numéro de version a été incrémenté. A titre d’exemple, l’artefact &lt;code&gt;jakarta.faces:jakarta.faces-api:2.3.1&lt;/code&gt; est identique à &lt;code&gt;javax.faces:javax.faces-api:2.3&lt;/code&gt;.
Pas si anodin, ce changement de GAV Maven fait que notre outil de build peut être amené, via le mécanisme de dépendances transitives,
à placer dans le classpath deux mêmes artefacts ayant des groupId différents. Les exclusions maven permettent de corriger le tir.&lt;/p&gt;
&lt;p&gt;En décembre 2020, la communauté Java est secouée par la sortie de &lt;strong&gt;Java EE 9&lt;/strong&gt;. 20 ans de rétrocompatibilité s’écroulent.
Oracle a souhaité conserver la &lt;strong&gt;marque Java&lt;/strong&gt;. Les packages &lt;code&gt;javax.*&lt;/code&gt; de la spécification Java EE ont été renommés en &lt;code&gt;jakarta.*&lt;/code&gt;.
Certains sous-packages ont également été renommés.&lt;/p&gt;
&lt;p&gt;Pour exemple, la classe &lt;code&gt;Marshaller&lt;/code&gt; de l’API JAXB change de package : de &lt;code&gt;javax.xml.bind.Marshaller&lt;/code&gt; vers &lt;code&gt;jakarta.xml.bind.Marshaller&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Revue de code, on n’est pas venu-e-s ici pour souffrir !</title><link>https://javaetmoi.com/2024/05/revue-de-code-on-nest-pas-venu-ici-pour-souffrir/</link><pubDate>Fri, 03 May 2024 13:15:02 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2356</guid><description>&lt;p&gt;Conférence : &lt;a href="https://www.devoxx.fr/"&gt;Devoxx France 2024&lt;/a&gt;&lt;br&gt;
Vidéo Youtube : &lt;a href="https://www.youtube.com/watch?v=KeM1cjKiMr4"&gt;https://www.youtube.com/watch?v=KeM1cjKiMr4&lt;/a&gt;&lt;br&gt;
Date : 18 avril 2024&lt;br&gt;Speakerines : &lt;a href="https://twitter.com/@pauinegu"&gt;Pauline Rambaud&lt;/a&gt; et &lt;a href="https://twitter.com/AnneLaure2B"&gt;Anne-Laure de Boissieu&lt;/a&gt; (Bedrock Streaming)&lt;br&gt;
Format : Conférence (45mn)&lt;/p&gt;
&lt;p&gt;Déjà donnée à plusieurs reprises dans différents meetups et conférences, Pauline et Anne-Laure ont repensé spécialement cette présentation pour Devoxx France. Quel honneur !&lt;/p&gt;
&lt;p&gt;Afin de démontrer à l’assistance qu’un commentaire laissé dans une &lt;strong&gt;revue de code&lt;/strong&gt; peut amener de la &lt;strong&gt;confusion&lt;/strong&gt;, nos deux speakerines commencent leur show en nous montrant &lt;strong&gt;une Pull Request&lt;/strong&gt; sur le repo git de leurs slides reveal : une simple émoticône.
Mal interprétée, elle entraine un &lt;strong&gt;biais de communication&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="cest-quoi-la-revue-de-code-"&gt;C’est quoi la revue de code ?&lt;/h2&gt;
&lt;p&gt;Développeuses GO, Anne-Laure et Pauline rappellent que &lt;strong&gt;la revue de code fait partie intégrante du métier de développeur&lt;/strong&gt;.
Elle consiste à examiner le code écrit par un autre développeur afin d&amp;rsquo;en améliorer la qualité, détecter les bugs et s&amp;rsquo;assurer du respect des normes de codage.
Il existe différents types de revue. Au cours de cette présentation, elles se focaliseront sur les revues centrées sur le delta du code écrit pour corriger bug ou implémenter une feature.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_external image_processed"
width="1404"
height="560"
src="https://javaetmoi.com/word-image-2356-1_8503016766874189183.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>La doc va bien, ne t’en fais pas</title><link>https://javaetmoi.com/2024/04/la-doc-va-bien-ne-ten-fais-pas/</link><pubDate>Fri, 26 Apr 2024 17:55:09 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2335</guid><description>&lt;p&gt;Conférence : &lt;a href="https://www.devoxx.fr/"&gt;Devoxx France 2024&lt;/a&gt;&lt;br&gt;
Date : 17 avril 2024&lt;br&gt;Speakers : &lt;a href="https://www.linkedin.com/in/damien-lucas/"&gt;Damien Lucas&lt;/a&gt; (OnePoint)&lt;br&gt;
Format : Conférence (45 mn)&lt;br&gt;Slides : &lt;a href="https://dlucasd.github.io/la-doc-va-bien-ne-t-en-fais-pas/devoxx/#/"&gt;https://dlucasd.github.io/la-doc-va-bien-ne-t-en-fais-pas/devoxx/#/&lt;/a&gt;&lt;br&gt;
Vidéo Youtube : &lt;a href="https://www.youtube.com/watch?v=zQ0A75HqFuA"&gt;https://www.youtube.com/watch?v=zQ0A75HqFuA&lt;/a&gt;&lt;br&gt;
Repo GitHub : &lt;a href="https://github.com/dlucasd/la-doc-va-bien-ne-t-en-fais-pas"&gt;https://github.com/dlucasd/la-doc-va-bien-ne-t-en-fais-pas&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;La &lt;strong&gt;documentation&lt;/strong&gt;, sujet atemporel. Travaillant sur des projets en TMA, Damien faisait le constat suivant : d’un projet à l’autre, la structure,
l’organisation et le niveau d’informations de la documentation diffèrent. De temps à autres, Damien assistait à des réunions visant à restructurer
la documentation. Chaque participant a sa vision. Trouver un consensus n’est pas facile. &lt;br&gt;
Damien s’est ainsi demandé s’il n’existait pas clé en main un &lt;strong&gt;template de rédaction de la documentation&lt;/strong&gt;, si possible &lt;strong&gt;Open Source&lt;/strong&gt;
et &lt;strong&gt;reconnu&lt;/strong&gt; par la communauté des dévs et architectes.&lt;/p&gt;
&lt;p&gt;Au cours de ses recherches, il est tombé sur le framework &lt;a href="https://arc42.org/"&gt;&lt;strong&gt;arc42&lt;/strong&gt;&lt;/a&gt; créé en 2005 par 2 allemands : Gernot Starke et Peter Hruschka.
Ce template se focalise sur l’ &lt;strong&gt;architecture des logiciels et des systèmes&lt;/strong&gt;. Plusieurs formats sources sont possibles en téléchargement depuis
la page &lt;a href="https://arc42.org/download"&gt;https://arc42.org/download&lt;/a&gt; : &lt;strong&gt;asciidoc&lt;/strong&gt;, &lt;strong&gt;markdown&lt;/strong&gt;, latex, Word, Confluence, html, Doxygen, IBM Rhapsody … Voici par exemple le template arc42 pour Word : &lt;a href="https://github.com/arc42/arc42-template/raw/master/dist/arc42-template-FR-withhelp-docx.zip"&gt;arc42-template-FR-withhelp-docx.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Damien a une &lt;strong&gt;préférence pour l’asciidoc&lt;/strong&gt; qui permet d’avoir une &lt;strong&gt;approche docs-as-code&lt;/strong&gt; : on peut le commiter dans un repository &lt;strong&gt;git&lt;/strong&gt; puis générer un document au format souhaité (ex : PDF)&lt;/p&gt;
&lt;p&gt;Les templates arc42 au format asciidoc (extension .adoc) sont disponibles sur le repo GitHub &lt;a href="https://github.com/arc42/arc42-template/tree/master/FR/asciidoc"&gt;arc42-template&lt;/a&gt;: une &lt;strong&gt;dizaine de langues&lt;/strong&gt; est supportée dont le &lt;strong&gt;français&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ce template nous guide et nous pose les bonnes questions :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Contenu&lt;/strong&gt; : que faut-il documenter ?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Motivation&lt;/strong&gt; : pourquoi documenter et pour qui ?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Représentation&lt;/strong&gt; : comment documenter ? Faut-il préférer un diagramme ou une liste à puce ?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Arc42 propose de documenter une application en &lt;strong&gt;12 chapitres&lt;/strong&gt;. Chaque chapitre est lui-même généralement composé de 3 sous-parties. &lt;br&gt;Dans de ce talk, Damien s’appuie sur un projet fictif pour illustrer chacun des 12 chapitres. Ce projet consiste à développer une application de billetterie pour les JO. Il en profitera pour nous présenter des &lt;strong&gt;outils de génération de diagrammes&lt;/strong&gt; (PlantUML et Mermaid), des &lt;strong&gt;outils de modélisation&lt;/strong&gt; (C4 et Structurizr) et des &lt;strong&gt;outils de génération de documentation&lt;/strong&gt; (avec CLI et donc intégrable à la CI).&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="word-image-2335-1"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2024/04/word-image-2335-1.jpeg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>L’Architecture Hexagonale par la pratique</title><link>https://javaetmoi.com/2024/04/larchitecture-hexagonale-par-la-pratique/</link><pubDate>Sun, 21 Apr 2024 16:38:47 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2317</guid><description>&lt;h2 id="le-live-coding-qui-rendra-vos-applications-plus-pérennes"&gt;Le live coding qui rendra vos applications plus pérennes&lt;/h2&gt;
&lt;p&gt;Conférence : &lt;a href="https://www.devoxx.fr/"&gt;Devoxx France 2024&lt;/a&gt;&lt;br&gt;Date : 19 avril 2024 &lt;br&gt;Speakers : &lt;a href="https://twitter.com/JulienTopcu"&gt;Julien Topçu&lt;/a&gt; ( &lt;a href="https://shodo.io/"&gt;Shodo&lt;/a&gt;) &lt;br&gt;Format : Conférence (45mn) &lt;br&gt;Repo GitLab : &lt;a href="https://gitlab.com/beyondxscratch/hexagonal-architecture-java-springboot"&gt;https://gitlab.com/beyondxscratch/hexagonal-architecture-java-springboot&lt;/a&gt;&lt;br&gt;Vidéo Youtube : &lt;a href="https://www.youtube.com/watch?v=-dXN8wkN0yk"&gt;https://www.youtube.com/watch?v=-dXN8wkN0yk&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cette session de live coding se déroule dans l’univers de Starwars et commence par une &lt;strong&gt;citation de Maitre Yoda&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En 45mn, Julien doit développer le système &lt;strong&gt;Rebels Rescue&lt;/strong&gt; visant à reconstituer des flottes de sauvetage. N’en déplaise à l’Empire, les technos seront Spring Boot et Java 21.&lt;/p&gt;
&lt;p&gt;A cet effet, il s’appuiera sur l’API publique &lt;a href="https://swapi.dev/"&gt;SWAPI&lt;/a&gt; permettant d’accéder à un référentiel de vaisseaux à disposition. L’application sélectionne les vaisseaux qui permettent d’effectuer la mission de sauvetage. Le code source est disponible dans le repo GitLab de Julien : &lt;a href="https://gitlab.com/beyondxscratch/hexagonal-architecture-java-springboot"&gt;hexagonal-architecture-java-springboot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Julien commence par rappeler les inconvénients d’une &lt;strong&gt;architecture 3-tiers&lt;/strong&gt; basée sur le triptyque &lt;strong&gt;Contrôleur -&amp;gt; Service -&amp;gt; Persistance&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Apache Lucene : de l’indexation textuelle à l’IA</title><link>https://javaetmoi.com/2024/04/apache-lucene-de-l-indexation-textuelle-a-l-ia/</link><pubDate>Sun, 21 Apr 2024 15:26:06 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2298</guid><description>&lt;p&gt;Conférence : &lt;a href="https://www.devoxx.fr/"&gt;Devoxx France 2024&lt;/a&gt;&lt;br&gt;Date : 19 avril 2024&lt;br&gt;Speakers : &lt;a href="https://twitter.com/lucianprecup"&gt;Lucian Precup&lt;/a&gt; ( &lt;a href="https://www.adelean.com/"&gt;Adelean&lt;/a&gt;)&lt;br&gt;Format : Tools in action (30 mn)&lt;/p&gt;
&lt;p&gt;Lors de cette 12ième édition de Devoxx France, j’ai eu l’agréable surprise de voir 4 anciens collègues animer un talk : &lt;a href="https://www.devoxx.fr/schedule/talk/?id=20254"&gt;Guillaume Darmont&lt;/a&gt; sur Java Flight Recorder et Java Mission Control, &lt;a href="https://www.devoxx.fr/schedule/speaker-details/?id=38855"&gt;Florian Boulay&lt;/a&gt; sur emacs, &lt;a href="https://www.devoxx.fr/schedule/speaker-details/?id=44309"&gt;Stéphane Landelle&lt;/a&gt; sur Netty et &lt;a href="https://www.devoxx.fr/schedule/talk/?id=29378"&gt;Lucian Precup&lt;/a&gt; sur Lucene. Avec ce dernier, nous avons mis en œuvre Elasticsearch sur une application métier au cœur du SI d’une grande entreprise. C’était il y’a plus de 10 ans. Expert en moteur de recherche, je me souviens encore Lucian m’expliquer ce qu’est un index inversé.&lt;/p&gt;
&lt;p&gt;Lucian commence par sonder son public. Fait notable, dans l’assistance, personne n’utilise un moteur de recherche qui ne serait pas basé sur &lt;a href="https://lucene.apache.org/"&gt;&lt;strong&gt;Apache Lucene&lt;/strong&gt;&lt;/a&gt;, technologie à la base de milliers de moteur de recherche et dont Lucian va nous retracer l’histoire.&lt;/p&gt;
&lt;p&gt;Créé en 2001, Apache Lucene a aujourd’hui plus de 22 ans. C’est un projet Open Source de la fondation Apache toujours maintenu et même très actif. Chose assez rare dans le monde OSS qui voit passer de nombreux projets.&lt;/p&gt;</description></item><item><title>Utiliser les IA Génératives avec Java</title><link>https://javaetmoi.com/2024/04/utiliser-les-ia-generatives-avec-java/</link><pubDate>Sun, 21 Apr 2024 14:27:40 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2270</guid><description>&lt;h2 id="au-delà-des-simples-chatbots"&gt;Au-delà des simples chatbots&lt;/h2&gt;
&lt;p&gt;Conférence : &lt;a href="https://www.devoxx.fr/"&gt;Devoxx France 2024&lt;/a&gt;&lt;br&gt;Date : 17 avril 2024&lt;br&gt;Speakers : &lt;a href="https://twitter.com/boredabdel"&gt;Abdellfetah Sghiouar&lt;/a&gt; (Google), &lt;a href="https://twitter.com/clunven"&gt;Cédrick Lunven&lt;/a&gt; (DataStax)&lt;br&gt;Format : Deep Dive (3h)&lt;br&gt;Slides : &lt;a href="_wp_link_placeholder"&gt;https://github.com/datastaxdevs/conference-2024-devoxx-france/blob/main/slides.pdf&lt;/a&gt;&lt;br&gt;Vidéo Youtube : &lt;a href="https://www.youtube.com/watch?v=6n8JysFyVA8"&gt;https://www.youtube.com/watch?v=6n8JysFyVA8&lt;/a&gt;&lt;br&gt;Repo GitHub : &lt;a href="https://github.com/datastaxdevs/conference-2024-devoxx-france"&gt;https://github.com/datastaxdevs/conference-2024-devoxx-france&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dans ce Deep Dive de 3h (anciennement nommé Université à Devoxx France), Abdellfetah Sghiouar et Cédrick Lunven nous expliquent comment intégrer l&amp;rsquo;intelligence artificielle générative (la fameuse GenAI) dans nos applications Java, et ceci sans expertise en machine learning ou en Python (ce qui tombe bien). Après nous avoir initié aux Large Language Models (LLMs) et aux techniques de prompting, ils nous apprennent à coder en Java avec &lt;strong&gt;LangChain4J&lt;/strong&gt; et &lt;strong&gt;Spring AI&lt;/strong&gt; pour utiliser le &lt;strong&gt;LLM Gemini&lt;/strong&gt; de Google dans nos projets Java.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;approche &lt;strong&gt;Retrieval Augmented Generation&lt;/strong&gt; (RAG) est illustrée par son intégration avec des bases de données vectorielle comme Apache Cassandra, ceci pour générer des réponses avec nos propres données. Les Developer Advocates de Google et de DataStax nous donnent des stratégies pour minimiser les erreurs et les hallucinations des LLMs. Les modèles multimodaux (LMM) plus avancés seront également introduits.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cédrick&lt;/strong&gt; est Developer Advocate chez DataStax&lt;br&gt;Il y’a 10 ans, il s’est fait connaitre par la communauté en créant le projet &lt;a href="https://ff4j.org/"&gt;&lt;strong&gt;ff4j&lt;/strong&gt;&lt;/a&gt;.&lt;br&gt;Ces dernières années, il a énormément travaillé sur Cassandra. Cédrick contribue aux projets OpenSource Langchain4j et Spring AI. Je l’ai personnellement rencontré dans le cadre du projet &lt;a href="https://github.com/spring-petclinic/spring-petclinic-reactive"&gt;&lt;strong&gt;Spring Petclinic Reactive&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Abdel&lt;/strong&gt; est Developer Advocate chez Google&lt;br&gt;Expert en Kubernetes, il travaille notamment sur le déploiement des solutions d’IA sur k8s.&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_external image_processed"
width="1268"
height="717"
src="https://javaetmoi.com/word-image-2270-1_12798374238704013530.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;br&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="devoxx-france-2024-banniere-generative-ai-avec-java"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2024/04/devoxx-france-2024-banniere-generative-ai-avec-java.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>16 prises de notes à Devoxx France 2023</title><link>https://javaetmoi.com/2023/04/16-prises-de-notes-a-devoxx-france-2023/</link><pubDate>Sun, 16 Apr 2023 17:44:34 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2236</guid><description>&lt;p&gt;En attendant de pouvoir tester les 2 étages du Palais des Congrès du 17 au 19 avril 2024, je consigne dans ce billet &lt;strong&gt;16 notes&lt;/strong&gt; prises au cours de ces 3 jours toujours aussi riches.&lt;/p&gt;
&lt;p&gt;D&amp;rsquo;ici quelques jours / semaines, après un repos bien mérité des organisateurs, &lt;strong&gt;l’intégralité des vidéos des keynotes, conférences et universités présentées lors de Devoxx France&lt;/strong&gt; &lt;strong&gt;2023&lt;/strong&gt; seront disponibles sur Youtube sur la &lt;a href="https://www.youtube.com/channel/UCsVPQfo5RZErDL41LoWvk0A/videos"&gt;&lt;strong&gt;chaîne Devoxx FR&lt;/strong&gt;&lt;/a&gt;. Mes notes pourrons vous aider à vous faire rapidement un aperçu de leur contenu avant de les visionner.&lt;/p&gt;
&lt;p&gt;Tout comme l&amp;rsquo;édition précédente, je n&amp;rsquo;y aurais pas été découvrir les dernières technos hypes de 2023. Paradoxalement, il m&amp;rsquo;a semblé y avoir plus de conférences sur le SQL que le NoSQL. Kubernetes, les applications natives, le Craft et Docker auront été au rendez-vous de cette 11ième édition.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="16 prises de notes à Devoxx France 2023"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2023/04/Devoxx-France-2023.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Générateur de squelette d’application basé sur Spring Initializr</title><link>https://javaetmoi.com/2022/07/generateur-de-squelette-dapplication-base-sur-spring-initializr/</link><pubDate>Sun, 03 Jul 2022 12:25:17 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2217</guid><description>&lt;p&gt;Dans une &lt;strong&gt;grande entreprise&lt;/strong&gt;, le &lt;strong&gt;développement d’applications métiers&lt;/strong&gt; doit respecter les &lt;strong&gt;règles&lt;/strong&gt; en vigueur : normes de développement, normes de sécurité, barrière qualité, socle technique borné, intégration à l’usine de dév …&lt;br&gt;Le &lt;strong&gt;démarrage d’une nouvelle application Java&lt;/strong&gt; peut être accélérée de bien des manières : usage d’outils Low Code comme &lt;a href="https://www.vermeg.com/fr/produit-palmyra/"&gt;Palmyra&lt;/a&gt;, générateur de squelettes d’application comme &lt;a href="https://www.jhipster.tech/"&gt;JHipster&lt;/a&gt;, utilisation d’applications blanches déclinées par catégorie d’appli (ex : batch, web), copier/coller/élagage d’une application de référence, guide de démarrage sous forme wiki … Chaque technique présente ses avantages et ses inconvénients. Mais certaines ne couvrent pas toutes les règles évoquées précédemment.&lt;br&gt;Afin d’ &lt;strong&gt;accélérer le développement&lt;/strong&gt; d’une nouvelle application, mon objectif était de générer un &lt;strong&gt;squelette d’application minimaliste&lt;/strong&gt; dont le code généré est parfaitement maitrisé et avec des &lt;strong&gt;dépendances choisies à la carte&lt;/strong&gt; par le tech lead. Libre à lui ensuite de retravailler le code généré pour mettre en place l’architecture cible de l’application, en choisissant par exemple de partir sur une architecture hexagonale.&lt;/p&gt;
&lt;p&gt;Bien connu des développeurs Spring Boot, je me suis appuyé sur le code backend faisant tourner le site &lt;a href="https://start.spring.io/"&gt;https://start.spring.io/&lt;/a&gt;, à savoir le projet &lt;strong&gt;&lt;a href="https://github.com/spring-io/initializr"&gt;Spring Initializr&lt;/a&gt;&lt;/strong&gt; conçu et maintenu majoritairement par Stéphane Nicoll. Léger, codé en Java, reposant sur Spring Boot et documenté, ce projet a été conçu pour être personnalisé et extensible. Cela en a fait un excellent candidat.&lt;br&gt;La première mouture de ce générateur développé en quelques jours m’aura permis de générer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la configuration du socle Spring Boot d’entreprise&lt;/li&gt;
&lt;li&gt;la configuration du logger permettant de standardiser les logs au format JSON&lt;/li&gt;
&lt;li&gt;la sécurisation des API REST avec Spring Security, OpenID Connect et le SSO d’entreprise&lt;/li&gt;
&lt;li&gt;les contrôleurs et DTO d’une API REST à partir d’une spécification OpenAPI 3&lt;/li&gt;
&lt;li&gt;le Dockerfile et la configuration du pipeline CI/CD&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>13 prises de notes à Devoxx France 2022</title><link>https://javaetmoi.com/2022/04/13-prises-de-notes-a-devoxx-france-2022/</link><pubDate>Sun, 24 Apr 2022 15:22:06 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2187</guid><description>&lt;p&gt;Ce fut ma 9ième participation à Devoxx France (et oui, j’ai malheureusement loupé l’édition 9 ¾). Et je dois vous avouer que ma conférence préférée m’avait manqué. Une bonne bulle d’oxygène au détour d’un projet réglementaire en Java. Les &lt;strong&gt;10 ans de Devoxx France&lt;/strong&gt; furent un grand cru. Le nombre de stands / partenaires occupent de plus en plus d&amp;rsquo;espace au Palais des Congrés et les speakers se dépassent d’année en année. Un grand bravo aux organisateurs, gilets rouges, orateurs et aux &lt;a href="https://lescastcodeurs.com/"&gt;Cast Codeurs&lt;/a&gt; qui clôturent chaque édition en beauté.&lt;/p&gt;
&lt;p&gt;D&amp;rsquo;ici quelques jours, &lt;strong&gt;l’intégralité des vidéos des conférences et universités présentées lors de Devoxx France&lt;/strong&gt; &lt;strong&gt;2022&lt;/strong&gt; sont disponibles sur la &lt;a href="https://www.youtube.com/channel/UCsVPQfo5RZErDL41LoWvk0A/videos"&gt;chaîne Devoxx FR de Youtube&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Si vous souhaitez rapidement vous faire un avis sur leur contenu avant de les visionner ou si vous souhaitez garder une trace écrite de ce que vous y avez appris, je mets librement à disposition l’ensemble de &lt;strong&gt;mes 13 notes&lt;/strong&gt; prises au cours de ces 3 jours riches en contenus et en découvertes. Entre les retards SNCF et mon Macbook vieillissant qui fait des siennes, le nombre est moindre que les années précédentes. Mais promis, j’essaierai de me rattraper en 2023 :-)&lt;/p&gt;
&lt;p&gt;Fait marquant, cette édition 2022 n’aura pas fait place à de nouvelles technos hypes. On peut se souvenir de Quarkus en 2019, Kafka en 2016 ou bien encore Angular.JS en 2013. Cette 10ième édition aura été celle de la maturité : &lt;strong&gt;retours d’expérience&lt;/strong&gt;, &lt;strong&gt;architecture&lt;/strong&gt;, &lt;strong&gt;état de l’art&lt;/strong&gt;, &lt;strong&gt;sécurisation du code&lt;/strong&gt; et &lt;strong&gt;approfondissement du fonctionnement de la plateforme Java&lt;/strong&gt; étaient au rendez-vous.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="13 prises de notes à Devoxx France 2022"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2022/04/2022-04-21-10-ans-Devoxx-France.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Configuration Spring Security d’un client de l’API REST Salesforce sécurisée avec OAuth 2.0</title><link>https://javaetmoi.com/2021/11/configuration-spring-security-dun-client-de-lapi-rest-salesforce-securisee-avec-oauth-2-0/</link><pubDate>Sat, 06 Nov 2021 16:53:05 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2138</guid><description>&lt;h2 id="contexte"&gt;Contexte&lt;/h2&gt;
&lt;p&gt;De nos jours, il est courant de devoir &lt;strong&gt;consommer&lt;/strong&gt; une &lt;strong&gt;API REST sécurisée&lt;/strong&gt; à l’aide du standard &lt;strong&gt;OAuth 2.0&lt;/strong&gt; ou de sa surcouche &lt;strong&gt;OpenID Connect&lt;/strong&gt; (OIDC). &lt;br&gt;Schématiquement, le consommateur génère un &lt;strong&gt;jeton (token)&lt;/strong&gt; opaque ou JWT en appelant un serveur d’autorisation (Authorization server) puis, à chaque appel d’API REST, le transmet en tant que bearer via l’ &lt;strong&gt;en-tête HTTP&lt;/strong&gt; &lt;strong&gt;Authorization&lt;/strong&gt;. Ce token a souvent une &lt;strong&gt;durée de vie&lt;/strong&gt; transmise par le serveur d’autorisation via la propriété &lt;strong&gt;expires_in&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;OAuth 2.0 propose quatre cinématiques (flows), la plus commune étant l’Authorization Code Flow. Lorsque l’API REST est appelée depuis une application web, il est courant de voir utiliser le Client Credentials Flow ou le &lt;strong&gt;&lt;a href="https://www.oreilly.com/library/view/getting-started-with/9781449317843/ch04.html"&gt;Resource&lt;/a&gt;&lt;/strong&gt; &lt;strong&gt;&lt;a href="https://www.oreilly.com/library/view/getting-started-with/9781449317843/ch04.html"&gt;Owner Password Credentials Flow&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Récemment, j’ai été amené à &lt;strong&gt;consommer l’API REST du&lt;/strong&gt; &lt;strong&gt;CRM Salesforce&lt;/strong&gt; &lt;strong&gt;depuis une application Spring Boot&lt;/strong&gt;. Cette API était sécurisée avec le Resource Owner password Credentials Flow. Salesforce joue à la fois le rôle de l’Authorization Server et du Resource Owner. Le client (l’application Spring Boot) transmet ses &lt;strong&gt;credentials&lt;/strong&gt; (login et mot de passe) à l’Authorization Server pour obtenir un &lt;strong&gt;Access Token&lt;/strong&gt;. &lt;br&gt;Cet article a pour objectif de vous présenter la &lt;strong&gt;configuration Spring Security&lt;/strong&gt; mise en œuvre pour appeler cette API. Les extraits de code proviennent du repository GitHub &lt;a href="https://github.com/arey/spring-security-oauth2-salesforce-sample"&gt;&lt;strong&gt;arey/spring-security-oauth2-salesforce-sample&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Bonnes pratiques de logging</title><link>https://javaetmoi.com/2021/01/bonnes-pratiques-de-logging/</link><pubDate>Sun, 03 Jan 2021 11:44:26 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2100</guid><description>&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_external image_processed"
width="512"
height="512"
src="https://javaetmoi.com/lof-file-1_3583990369974809130.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Publier en 2021 un article sur les logs n’est pas très novateur ; je vous l’accorde. Le &lt;strong&gt;logging&lt;/strong&gt; est une pratique vieille comme l’informatique, ou presque. C’est une &lt;strong&gt;pratique universelle&lt;/strong&gt; qu’on retrouve &lt;strong&gt;quel que soit le langage de programmation&lt;/strong&gt; et quel que soit le type d’application. Pour autant, elle est survolée en fac et en école d’ingénieur. Les dévs apprennent bien souvent à logger sur le tas, en fonction de leurs besoins et de ce qui est déjà mis en place sur leur application. Rares sont également les entreprises mettant à disposition des normes et des bonnes pratiques en termes de traces applicatives.&lt;/p&gt;
&lt;p&gt;Dans cet article, je ne vous expliquerai pas comment utiliser &lt;a href="http://www.slf4j.org/"&gt;SLF4J&lt;/a&gt;, &lt;a href="http://logback.qos.ch/"&gt;Logback&lt;/a&gt;, &lt;a href="https://logging.apache.org/log4j/2.x/"&gt;Log4j 2&lt;/a&gt; ou la controversée &lt;a href="https://docs.oracle.com/javase/8/docs/technotes/guides/logging/index.html"&gt;API de Logging&lt;/a&gt; du langage Java. C’est un prérequis que bon nombre d’entre vous connaissent déjà. Beaucoup de ressources existent à ce sujet, en commençant par leurs documentations officielles.&lt;/p&gt;
&lt;p&gt;Non, &lt;strong&gt;je vous y exposerai plutôt les bonnes pratiques que je préconise&lt;/strong&gt;, tant au niveau d’une application que d’une organisation. Je répondrai également aux questions les plus courantes : &lt;strong&gt;quand utiliser tel ou tel niveau de log ?&lt;/strong&gt; &lt;strong&gt;que mettre dans les messages de logs ?&lt;/strong&gt;&lt;br&gt;Nom de mon blog oblige, j&amp;rsquo;utiliserai des exemples venant du monde Java. Mais vous pourrez aisément transposer ces bonnes pratiques à d’autres technologies. Et bien entendu, elles sont à adapter en fonction de votre contexte et de vos besoins.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Bonnes pratiques de logging"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2021/01/logo-splunk.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Tests de propriétés : écrire moins de tests, trouver plus de bugs</title><link>https://javaetmoi.com/2020/02/tests-de-proprietes-ecrire-moins-de-tests-trouver-plus-de-bugs/</link><pubDate>Mon, 17 Feb 2020 16:58:30 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2092</guid><description>&lt;p&gt;&lt;a href="https://javaetmoi.com/wp-content/uploads/2020/02/devfest_paris_2020.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_external image_processed"
width="300"
height="102"
src="https://javaetmoi.com/devfest_paris_2020-300x102_18111524337964630090.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Lors de l’excellente conférence &lt;a href="https://devfest.gdgparis.com/"&gt;&lt;strong&gt;DevFest Paris 2020&lt;/strong&gt;&lt;/a&gt; qui s’est tenue le 14 février au Palais des Congrès d’Issy-les-Moulineaux, j’ai découvert une typologie de tests dont je n’avais jamais entendu parler : les &lt;strong&gt;tests de propriétés&lt;/strong&gt;(property based tests en anglais).&lt;/p&gt;
&lt;p&gt;Pendant 2h, &lt;strong&gt;&lt;a href="https://twitter.com/Oteku"&gt;Thomas Haessle&lt;/a&gt;&lt;/strong&gt; (CTO de Cutii) et &lt;strong&gt;&lt;a href="https://twitter.com/sir4ur0n"&gt;Julien Debon&lt;/a&gt;&lt;/strong&gt; (Tech Lead chez Décathlon) nous ont fait travailler sur un &lt;strong&gt;Code lab&lt;/strong&gt; disponible en pas moins de 5 langages de programmation : JavaScript, Java, OCaml, Haskell et Rust. Comme vous vous en doutez, j’ai suivi le lab Java.&lt;/p&gt;
&lt;p&gt;Les quelques slides de leur introduction sont disponibles sur &lt;a href="https://docs.google.com/presentation/d/1bkdvm96-9tPe-ldCVjziDhccV3lzS_DDeFibCQ_cY54/edit#slide=id.g4f013f4ff4_0_20"&gt;Google Docs&lt;/a&gt;. Le projet GitHub du &lt;strong&gt;lab Troll of Fame&lt;/strong&gt; contenant les 5 repos se trouve quant à lui ici : &lt;a href="https://github.com/trollaklass"&gt;&lt;strong&gt;trollaklass&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Au travers de ce cours billet, je tenais à mettre en avant leur travail et à partager mon enthousiasme. De chez vous, n’hésitez pas à suivre ce Lab pour vous familiariser avec les tests de propriétés. Le &lt;a href="https://github.com/trollaklass/troll-of-fame-java/blob/master/README.md"&gt;README.md&lt;/a&gt; contient l’énoncé des 6 étapes et l’explication des concepts associés. Comme son nom l’indique, la &lt;strong&gt;branche&lt;/strong&gt; &lt;a href="https://github.com/trollaklass/troll-of-fame-java/tree/solution"&gt;&lt;strong&gt;solution&lt;/strong&gt;&lt;/a&gt; contient l’ensemble des solutions.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Tests de propriétés : écrire moins de tests, trouver plus de bugs"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2020/02/devfest_paris_2020.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Certification Microsoft Azure Fondamentals</title><link>https://javaetmoi.com/2020/02/certification-microsoft-azure-fondamentals/</link><pubDate>Sat, 08 Feb 2020 18:35:40 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2080</guid><description>&lt;p&gt;&lt;a href="https://www.youracclaim.com/earner/earned/badge/e18659c6-5f65-4efa-becd-c4293079ea4b"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_external image_processed"
width="150"
height="150"
src="https://javaetmoi.com/azure-fundamentals-600x600-1-150x150_6489878026618608652.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Assurée par un formateur Microsoft, la formation « Microsoft Azure Fondamentals » se déroule sur une journée et permet de se préparer à la &lt;strong&gt;&lt;a href="https://docs.microsoft.com/fr-fr/learn/certifications/exams/az-900"&gt;certification AZ-900 « Microsoft Azure Fondamentals »&lt;/a&gt;&lt;/strong&gt;. A l’issue de la formation, un voucher est donné à chaque participant. Ces derniers sont invités à passer leur certification dans la foulée.&lt;/p&gt;
&lt;p&gt;La formation est découpée en 4 modules.
Les notes ci-dessous m’auront permis d’obtenir &lt;a href="https://www.youracclaim.com/earner/earned/badge/e18659c6-5f65-4efa-becd-c4293079ea4b"&gt;ma certification&lt;/a&gt; du premier coup. J’espère qu’elles vous aideront à vous préparer. En rouge, sont notés les mots clés, concepts et noms de produits à retenir par cœur.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="azure-fundamentals-600x600"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2020/02/azure-fundamentals-600x600-1.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Désendettement de Spring Cloud Netflix</title><link>https://javaetmoi.com/2019/11/desendettement-de-spring-cloud-netflix/</link><pubDate>Thu, 28 Nov 2019 08:37:31 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2045</guid><description>&lt;p&gt;&lt;a href="https://javaetmoi.com/wp-content/uploads/2019/11/spring-cloud-netflix.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_external image_processed"
width="225"
height="225"
src="https://javaetmoi.com/spring-cloud-netflix_1305183779605428790.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;Le projet &lt;a href="https://spring.io/projects/spring-cloud-netflix"&gt;Spring Cloud Netflix&lt;/a&gt; facilite l’intégration de différents projets de la suite &lt;a href="https://netflix.github.io/"&gt;Netflix OSS&lt;/a&gt; dans des applications Spring Boot / Spring Cloud : Eureka, Zuul 1, Ribbon, Hystrix, Archaius, Feign. Jusqu’en 2018, le projet &lt;a href="https://github.com/spring-petclinic/spring-petclinic-microservices"&gt;Spring Petclinic Microservices&lt;/a&gt; dont j’assure la maintenance utilisait ces 4 premiers projets.&lt;/p&gt;
&lt;p&gt;Or, certains des projets historiques de Netflix OSS ne sont plus activement développés. Ils sont rentrés en mode maintenance. C’est notamment le cas d’ &lt;a href="https://github.com/Netflix/Hystrix#hystrix-status"&gt;Hystrix&lt;/a&gt;, de Zuul 1 et de Ribbon. En décembre 2018, lors de l’annonce de la &lt;a href="https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now"&gt;sortie de Spring Cloud Greenwich RC1&lt;/a&gt;, Pivotal recommande de migrer vers des projets tiers et de nouveaux modules Spring Cloud :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anciennement****Solutions cibles&lt;/strong&gt; Hystrix &lt;a href="https://github.com/resilience4j/resilience4j"&gt;Resilience4j&lt;/a&gt;Hystrix Dashboard / Turbine &lt;a href="https://micrometer.io/"&gt;Micrometer&lt;/a&gt; + Monitoring System Ribbon &lt;a href="https://cloud.spring.io/spring-cloud-static/spring-cloud-commons/2.2.0.RC2/reference/html/#spring-cloud-loadbalancer"&gt;Spring Cloud Loadbalancer&lt;/a&gt; Zuul 1 &lt;a href="https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.0.RC2/reference/html/"&gt;Spring Cloud Gateway&lt;/a&gt; Archaius 1 Spring Boot external config + Spring Cloud Config&lt;/p&gt;
&lt;p&gt;Dans le cadre de Spring Petclinic Microservices, seul Eureka est épargné et continue de jouer son rôle d’annuaire de service. Un désendettement vers &lt;strong&gt;Resilience4j&lt;/strong&gt;, &lt;strong&gt;Micrometer&lt;/strong&gt;, &lt;strong&gt;Spring Cloud Loadbalancer&lt;/strong&gt; et &lt;strong&gt;Spring Cloud Gateway&lt;/strong&gt; s’est naturellement imposé (issue &lt;a href="https://github.com/spring-petclinic/spring-petclinic-microservices/issues/117"&gt;#117&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Cet article retrace les différentes étapes de
migration. J’espère qu’il vous sera utile si vous avez le même chemin à
parcourir.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Désendettement de Spring Cloud Netflix"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2019/11/spring-cloud-netflix.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>18 prises de notes à Devoxx France 2019</title><link>https://javaetmoi.com/2019/05/18-prises-de-notes-a-devoxx-france-2019/</link><pubDate>Fri, 03 May 2019 17:28:03 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=1987</guid><description>&lt;p&gt;Ce fut ma 8ième participation à Devoxx France. Les années passent et je suis toujours aussi friand de cette bulle d’oxygène dans mon quotidien encore bien trop souvent parsemé de Struts, JSF et MagicDraw. Un grand bravo aux organisateurs, bénévoles et aux speakers.&lt;/p&gt;
&lt;p&gt;D&amp;rsquo;ici quelques jours, &lt;strong&gt;l’intégralité des vidéos des conférences et universités présentées lors de Devoxx France&lt;/strong&gt; &lt;strong&gt;2019&lt;/strong&gt; sont disponibles sur la &lt;a href="https://www.youtube.com/channel/UCsVPQfo5RZErDL41LoWvk0A/videos"&gt;chaîne Devoxx FR de Youtube&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Si vous souhaitez rapidement vous faire un avis sur leur contenu avant de les visionner ou si vous souhaitez garder une trace écrite de ce que vous y avez appris, je mets librement à disposition l’ensemble de &lt;strong&gt;mes 18 notes&lt;/strong&gt; prises au cours de ces 3 jours riches en contenus et en découvertes.&lt;/p&gt;
&lt;p&gt;Lors de cette édition 2019, les 2 frameworks hypes du moment &lt;strong&gt;Quarkus&lt;/strong&gt; et &lt;strong&gt;Micronaut&lt;/strong&gt; étaient sur le devant de la scène en permettant de développer des applications Java modernes et natives grâce à &lt;strong&gt;GraalVM&lt;/strong&gt;. Poussée par l’essor des &lt;strong&gt;microservices&lt;/strong&gt;, l’intégration de Java à &lt;strong&gt;Docker&lt;/strong&gt; et son orchestrateur &lt;strong&gt;Kubernetes&lt;/strong&gt; est de plus en plus poussée. Les indémodables étaient également de la partie : design d’ &lt;strong&gt;API REST&lt;/strong&gt;, &lt;strong&gt;montée de version de Java&lt;/strong&gt;, &lt;strong&gt;qualimétrie, JavaEE&lt;/strong&gt;(oups, pardon, JakartaEE) et &lt;strong&gt;sécurité&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://javaetmoi.com/wp-content/uploads/2019/05/Devoxx-France-2019.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_external image_processed"
width="1024"
height="554"
src="https://javaetmoi.com/Devoxx-France-2019-1024x554_134393457400624656.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Devoxx France 2019"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2019/05/Devoxx-France-2019-banner.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Dashboard Grafana dockerizé</title><link>https://javaetmoi.com/2019/03/dashboard-grafana-docker/</link><pubDate>Thu, 28 Mar 2019 17:27:32 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1959</guid><description>&lt;p&gt;A l’instar de SLF4J pour les logs, &lt;strong&gt;&lt;a href="https://micrometer.io/"&gt;Micrometer&lt;/a&gt;&lt;/strong&gt; est la &lt;strong&gt;façade d’export de métriques&lt;/strong&gt; utilisée par Spring Boot et ses Actuators. Micrometer supporte une douzaine de systèmes de monitoring : Datalog, Netflix Atlas, New Relic, JMX, CloudWatch, InfluxDB ou bien encore Prometheus.&lt;/p&gt;
&lt;p&gt;Récemment, j’ai poursuivi le travail initié par Kevin Crawley pour intégrer &lt;strong&gt;Prometheus&lt;/strong&gt; et &lt;strong&gt;Grafana&lt;/strong&gt; dans la version microservices de Spring Petclinic. Proposée par Maciej Szarliński, l’idée consistait à remplacer les compteurs &lt;strong&gt;Micrometer&lt;/strong&gt; de typeregistry.counter(&amp;ldquo;create.visit&amp;rdquo;).increment() par l’ &lt;a href="https://micrometer.io/docs/concepts"&gt;annotation @Timed.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;J’ai profité de ce changement pour améliorer le packaging &lt;strong&gt;Docker&lt;/strong&gt; de Grafana et en simplifier l’accès. Pour accéder au dashboard personnalisé exposant l’évolution du nombre d’animaux et de propriétaires, un &lt;em&gt;docker-compose up&lt;/em&gt; suivi d’un clic sur l’ &lt;a href="http://localhost:3000/d/69JXeR0iw/spring-petclinic-metrics"&gt;URL du dashboard&lt;/a&gt; sont désormais suffisant.&lt;br&gt;&lt;strong&gt;Ce billet présente les configurations Docker et Grafana mises en oeuvre&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2019/03/2019-03-Dashboard-Grafana-dockerise%CC%81-grafana.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Dashboard Grafana Spring Petclinic Metrics"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2019/03/2019-03-Dashboard-Grafana-dockerise%CC%81-grafana.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="2019-03 - Dashboard Grafana dockerisé - grafana"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2019/03/2019-03-Dashboard-Grafana-dockerise%CC%81-grafana.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Black Hell : mon premier jeu vidéo</title><link>https://javaetmoi.com/2019/02/black-hell-mon-premier-jeu-video/</link><pubDate>Mon, 11 Feb 2019 16:27:37 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1906</guid><description>&lt;a href="wp-content/uploads/2019/02/2019-02-Black-Hell-Ecran-accueil.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2019/02/2019-02-Black-Hell-Ecran-accueil.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Pour ce premier article de 2019, je vous propose un &lt;strong&gt;voyage dans le temps&lt;/strong&gt;, au contenu plus personnel. J’ai récemment dîné avec mon vieil ami Nicolas Lidzborski qui travaille chez Google aux US et que je n’avais pas revu depuis une dizaine d’années. Comme toute retrouvaille, nous nous sommes remémorés des souvenirs du Lycée, ses profs et son club IF. De sa chambre d’ado, Nicolas a retrouvé une illustration que nous avions réalisé pendant le &lt;strong&gt;&lt;a href="#ZgotmplZ"&gt;concours Soft la Nuit&lt;/a&gt;&lt;/strong&gt; de 1996, un marathon de 24h pendant lequel 20 équipes de 4 jeunes devaient développer un logiciel. Et oui, mon premier &lt;strong&gt;hackaton&lt;/strong&gt; commence à dater. Afin de pouvoir se qualifier, nous avions du présenter des projets personnels. Mon &lt;a href="https://github.com/arey/black-hell"&gt;jeu vidéo Black Hell&lt;/a&gt; en faisait partie. Par curiosité, et avec un brin de nostalgie, je suis parti à la recherche d’un backup de disquette. J’en ai ressorti code source et binaire. Et surprise : avec l’émulateur &lt;a href="https://www.dosbox.com/"&gt;DOSBox&lt;/a&gt;, j’ai réussi à le faire tourner, à la fois sous Windows 10 et MacOS.</description></item><item><title>Architecture Microservices avec Spring Cloud</title><link>https://javaetmoi.com/2018/10/architecture-microservices-avec-spring-cloud/</link><pubDate>Thu, 04 Oct 2018 05:58:31 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1869</guid><description>&lt;p&gt;Dans ce billet, j’aimerais vous présenter les différentes briques techniques permettant de mettre en œuvre une &lt;a href="https://martinfowler.com/articles/microservices.html"&gt;&lt;strong&gt;architecture microservices&lt;/strong&gt;&lt;/a&gt; reposant sur &lt;strong&gt;Spring Boot&lt;/strong&gt;, &lt;strong&gt;Spring Cloud&lt;/strong&gt;, &lt;strong&gt;Netflix OSS&lt;/strong&gt; et &lt;strong&gt;Docker&lt;/strong&gt;. Pour m’y aider, je m’appuierai sur l’application démo &lt;a href="https://github.com/spring-petclinic/spring-petclinic-microservices"&gt;&lt;strong&gt;Spring Petclinic Microservices&lt;/strong&gt;&lt;/a&gt; que je vous avais déjà brièvement présenté &lt;a href="http://javaetmoi.com/2016/12/les-forks-de-spring-petclinic/"&gt;en 2016&lt;/a&gt; et que j’ai récemment migrée vers Spring Cloud Finchley et Spring Boot 2.&lt;/p&gt;
&lt;p&gt;Ce fork a été construit à partir de l’application monolithique &lt;a href="https://github.com/spring-petclinic/spring-petclinic-angularjs"&gt;spring-petclinic-angularjs&lt;/a&gt;. Cette dernière a été découpée en plusieurs services, chacun responsable d’un domaine métier de la clinique vétérinaire : les animaux et leurs propriétaires, leurs visites à la clinique et les vétérinaires.&lt;/p&gt;
&lt;p&gt;Au final, Spring Petclinic Microservices est construit autour de &lt;strong&gt;petits services indépendants&lt;/strong&gt; (quelques centaines de ligne de code), s’exécutant dans &lt;strong&gt;leur propre JVM&lt;/strong&gt; et communiquant sur HTTP via une &lt;strong&gt;API&lt;/strong&gt; &lt;strong&gt;REST&lt;/strong&gt;.
Ces microservices sont tous écrits en &lt;strong&gt;Java&lt;/strong&gt;. Mais on aurait pu utiliser &lt;strong&gt;Kotlin&lt;/strong&gt; pour développer certains d’entre eux. Le front est quant à lui codé en &lt;strong&gt;JavaScript&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="architecture-technique"&gt;Architecture technique&lt;/h2&gt;
&lt;p&gt;Pour fonctionner, les différents microservices composant l’application Petclinic reposent sur différentes briques techniques matérialisées sur le diagramme d’architecture ci-dessous :&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2018/09/Diapositive1.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2018/09/2018-08-24-Architecture-microservices-avec-Spring-Cloud.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="2018-08-24-Architecture-microservices-avec-Spring-Cloud"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2018/09/2018-08-24-Architecture-microservices-avec-Spring-Cloud.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>15 prises de notes à Devoxx France 2018</title><link>https://javaetmoi.com/2018/04/15-prises-de-notes-a-devoxx-france-2018/</link><pubDate>Fri, 27 Apr 2018 16:23:25 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1826</guid><description>&lt;p&gt;L’intégralité des &lt;strong&gt;vidéos&lt;/strong&gt; des &lt;strong&gt;conférences&lt;/strong&gt; et &lt;strong&gt;universités&lt;/strong&gt; présentées lors de &lt;strong&gt;Devoxx France&lt;/strong&gt; &lt;strong&gt;2018&lt;/strong&gt; sont disponibles sur la &lt;a href="https://www.youtube.com/channel/UCsVPQfo5RZErDL41LoWvk0A/videos"&gt;chaîne Devoxx FR de Youtube&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Si vous souhaitez rapidement vous faire un avis sur leur contenu avant de les visionner ou si vous souhaitez garder une trace écrite de ce que vous y avez appris, je mets librement à disposition &lt;strong&gt;mes notes&lt;/strong&gt; prises au cours de ces 3 jours.&lt;/p&gt;
&lt;p&gt;Les sujets sont variés : le &lt;strong&gt;langage Java&lt;/strong&gt; bien évidemment, des &lt;strong&gt;frameworks&lt;/strong&gt; comme Spring et RxJS, de l’ &lt;strong&gt;outillage&lt;/strong&gt; pour vos test tests et vos builds, de l’ &lt;strong&gt;infrastructure&lt;/strong&gt; avec Docker et Kubernetes, de l’ &lt;strong&gt;architecture&lt;/strong&gt; avec DDD et OpenAPI, sans oublier des sujets plus connexes tels la place du développeur en entreprise ou bien l’apprentissage du code aux enfants.&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2018/04/IMG_20180420_090935.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2018/04/IMG_20180420_090935.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2018/04/IMG_20180420_090935.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Initiation à Apache Cassandra</title><link>https://javaetmoi.com/2018/04/lab-initiation-apache-cassandra/</link><pubDate>Sun, 22 Apr 2018 15:08:55 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1820</guid><description>&lt;p&gt;Lors de &lt;strong&gt;Devoxx France 2018&lt;/strong&gt;, j’ai participé au &lt;strong&gt;&lt;a href="https://cfp.devoxx.fr/2018/talk/GVY-2134/Initiation_a_Apache_Cassandra"&gt;Hands-on Lab d’initiation à Apache Cassandra&lt;/a&gt;&lt;/strong&gt;. Animé par Alexander Dejanovski (The LastPickle) et Maxence Lecointe (Ippon), ce Lab m’aura enfin permis de découvrir cette &lt;strong&gt;base de donnée NoSQL&lt;/strong&gt;, d’appréhender ses concepts fondamentaux, de jouer avec un cluster en local et d’écrire quelques requêtes CQL par le biais de son client Java.&lt;/p&gt;
&lt;p&gt;Le Lab était construit autour d’un support de présentation et de 5 exercices pratiques. Les &lt;strong&gt;slides&lt;/strong&gt; &lt;a href="https://github.com/thelastpickle/devoxxfr2018/raw/master/Devoxx%20France-%20Initiation%20%C3%A0%20Apache%20Cassandra%20-%20Avril%202018.pdf"&gt;Devoxx France – Initiation àApache Cassandra - Avril 2018.pdf&lt;/a&gt; et les &lt;strong&gt;exercices&lt;/strong&gt; sont disponibles sur le dépôt GitHub &lt;a href="https://github.com/thelastpickle/devoxxfr2018/"&gt;thelastpickle/devoxxfr2018&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ce billet a pour objectif de permettre aux développeurs n’ayant pas eu la chance de suivre ce Lab de profiter du travail préparatif des 2 speakers (un grand merci à eux) en lui donnant de la visibilité. Vous pourrez ainsi vous former par vous-même à Cassandra. Les explications données dans ce billet complètent les slides mais ne remplacent pas leur lecture.&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2018/04/IMG_20180418_132919.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2018/04/IMG_20180418_132919.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="cof"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2018/04/IMG_20180418_132919.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Configurez Logback en Java</title><link>https://javaetmoi.com/2018/03/configurez-logback-en-java/</link><pubDate>Fri, 30 Mar 2018 17:01:59 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1811</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2018/03/logback-logo.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2018/03/logback-logo.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Afin de &lt;strong&gt;normaliser&lt;/strong&gt; la &lt;strong&gt;configuration Logback&lt;/strong&gt; des applications web sur lesquelles j’interviens, j’ai récemment eu besoin de programmer Logback via son &lt;strong&gt;API en Java&lt;/strong&gt; et non en utilisant la syntaxe XML Joran.
Moins courant que le traditionnel &lt;strong&gt;logback.xml&lt;/strong&gt;, cette possibilité de configurer Logback par le code offre davantage de possibilités, ne serait-ce que par son caractère dynamique.&lt;/p&gt;
&lt;p&gt;Par le passé, j’avais déjà eu l’occasion de manipuler l’API Logback dans des tests unitaires afin de changer dynamiquement le niveau de log des loggers.
Cette fois-ci, je l’ai utilisé pour déclarer les différents appenders et configurer toute l’ &lt;strong&gt;infrastructure applicative de logs&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Activer l’appender Console uniquement sur le poste de dév (afin qu’en prod, les logs ne se retrouvent pas en double dans le fichier server.log de JBoss)&lt;/li&gt;
&lt;li&gt;Factoriser la stratégie de journalisation des différents appenders fichiers (troubleshooting, overview, soap …)&lt;/li&gt;
&lt;li&gt;Récupérer différentes informations applicatives (ex : nom de la JVM, application, nom de l’environnement, login de l’utilisateur authentifié) à destination du collecteur de logs (Logstash ou Splunk)&lt;/li&gt;
&lt;li&gt;Exposer l’accès aux loggers au travers d’une API REST&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La configuration des logs reste paramétrable via un fichier de properties externe. En effet, le paramétrage peut différer d’un environnement de déploiement à l’autre (ex : chemin du répertoire des fichiers logs). La configuration Logback reste extensible par l’inclusion d’un fichier XML au format Joran.&lt;/p&gt;
&lt;p&gt;Dans cet article, je vais vous présenter quelques bouts de code simplifié manipulant l’API Java de Logback.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logback-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2018/03/logback-logo.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Migration Spring MVC vers Spring WebFlux</title><link>https://javaetmoi.com/2017/12/migration-spring-web-mvc-vers-spring-webflux/</link><pubDate>Thu, 07 Dec 2017 17:26:12 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1794</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2017/12/spring-webflux.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/12/spring-webflux.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;a href="https://docs.spring.io/spring-framework/docs/5.0.1.RELEASE/spring-framework-reference/web-reactive.html#spring-webflux"&gt;&lt;strong&gt;Spring WebFlux&lt;/strong&gt;&lt;/a&gt; est une &lt;strong&gt;fonctionnalit&lt;/strong&gt; &lt;strong&gt;é majeure&lt;/strong&gt; de &lt;strong&gt;Spring Framework 5&lt;/strong&gt;. Disposant de son propre module Maven (spring-weblux), ce &lt;strong&gt;nouveau framework web&lt;/strong&gt; se positionne comme une &lt;strong&gt;alternative&lt;/strong&gt; &lt;strong&gt;à Spring Web MVC.&lt;/strong&gt; Ce dernier a été conçu par-dessus l’API Servlet. Spring WebFlux l’a été pour les &lt;strong&gt;applications r&lt;/strong&gt; &lt;strong&gt;éactives&lt;/strong&gt;, avec I/O non bloquantes, asynchrones, &lt;strong&gt;à faible latence&lt;/strong&gt;, basées sur des serveurs comme Netty, Undertow ou compatibles Servlets 3.1 et +.
Spring WebFlux s’éloigne du modèle d’un thread par requête HTTP et se base désormais sur le projet &lt;a href="https://projectreactor.io/"&gt;&lt;strong&gt;Reactor&lt;/strong&gt;&lt;/a&gt; pour orchestrer le traitement des requêtes.
Conçu avant tout pour exposer des &lt;strong&gt;API REST&lt;/strong&gt; attaquant des bases NoSQL non bloquantes dans des architecture micro-services, Spring WebFlux peut être utilisé sur des applications web dont les &lt;strong&gt;IHM&lt;/strong&gt; sont rendues côté serveur (ex : avec Thymeleaf ou Freemarker).&lt;/p&gt;
&lt;p&gt;J’ai récemment migré vers Spring WebFlux la &lt;a href="http://github.com/spring-petclinic/spring-petclinic-kotlin"&gt;version Kotlin et Spring Boot de l’application démo Spring Petclinic&lt;/a&gt;. Dans ce court billet, je voulais vous lister les adaptations mises en œuvre dans le &lt;a href="https://github.com/spring-petclinic/spring-petclinic-kotlin/commit/279b2e7c58906d9a765e7229043c7d563f016b1c"&gt;commit 279b2e7&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="spring-webflux"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/12/spring-webflux.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Build Gradle en Kotlin d’une webapp Spring Boot</title><link>https://javaetmoi.com/2017/11/build-gradle-dsl-kotlin-webapp-spring-boot/</link><pubDate>Wed, 22 Nov 2017 07:40:41 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1786</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2017/11/gradle-logo.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/11/gradle-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; En guise de conclusion de &lt;a href="http://javaetmoi.com/2017/09/migrez-application-java-spring-boot-vers-kotlin/"&gt;mon précédent billet&lt;/a&gt;, je proposais de &lt;strong&gt;migrer le &lt;a href="https://github.com/spring-petclinic/spring-petclinic-kotlin/blob/c66b152b83be2cdf8c28ca4e3e8869158b47a40b/pom.xml"&gt;build Maven&lt;/a&gt; d&lt;/strong&gt; &lt;strong&gt;’une application web Spring Boot 2 en un build Gradle bas&lt;/strong&gt; &lt;strong&gt;é sur le langage Kotlin&lt;/strong&gt;. C’est désormais chose faite. Mais bien que Gradle &lt;strong&gt;privil&lt;/strong&gt; &lt;strong&gt;égie&lt;/strong&gt; aujourd’hui l’usage du &lt;strong&gt;DSL&lt;/strong&gt; &lt;strong&gt;Kotlin&lt;/strong&gt; au détriment de &lt;strong&gt;Groovy&lt;/strong&gt;, son &lt;a href="https://docs.gradle.org/4.3.1/userguide/userguide.html"&gt;guide d’utilisation&lt;/a&gt; n’a pas encore été actualisé et il est difficile de trouver de la documentation. Il faut passer par le projet GitHub &lt;a href="https://github.com/gradle/kotlin-dsl"&gt;kotlin-dsl&lt;/a&gt; pour accéder à quelques tutoriaux et des exemples. Heureusement, GitHub fourmille d’autres d’exemples, notamment du côté des projets soutenus par les contributeurs Pivotal sur Spring Boot.&lt;/p&gt;
&lt;p&gt;Sans plus tarder, voici le fichier de conf &lt;a href="https://github.com/spring-petclinic/spring-petclinic-kotlin/blob/master/build.gradle.kts"&gt;build.gradle.kts&lt;/a&gt; de la version Kotlin de Spring Petclinic.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="gradle-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/11/gradle-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Découvrir Kotlin en migrant une webapp Spring Boot</title><link>https://javaetmoi.com/2017/09/migrez-application-java-spring-boot-vers-kotlin/</link><pubDate>Mon, 25 Sep 2017 16:50:26 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1753</guid><description>&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/09/Kotlin_logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Lors la dernière conférence Google I/O qui s’est tenue en mai 2017, Google a officialisé le &lt;strong&gt;support de Kotlin sur Android&lt;/strong&gt;. Google n’est pas le seul acteur de l’IT à miser sur ce nouveau langage créé par JetBrains (l’éditeur de l’IDE IntelliJ) et s’exécutant sur la JVM (mais pas que). En effet, dès février 2016, &lt;a href="https://spring.io/blog/2016/02/15/developing-spring-boot-applications-with-kotlin"&gt;Pivotal proposait de développer des applications &lt;strong&gt;Spring Boot&lt;/strong&gt; avec Kotlin&lt;/a&gt;. En janvier 2017, ils annonçaient que &lt;a href="https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0"&gt;la version 5 du &lt;strong&gt;framework Spring&lt;/strong&gt; proposerait des &lt;strong&gt;fonctionnalités exclusives à Kotlin&lt;/strong&gt;&lt;/a&gt;. Chez Gradle, le langage Kotlin est désormais privilégié au détriment de Groovy.&lt;/p&gt;
&lt;p&gt;Pour découvrir ce nouveau venu dans la galaxie des langages de programmation, je me suis intéressé à migrer vers Kotlin l’application démo Spring Petclinic développée en Java et Spring Boot. Je souhaitais ici partager son code source : &lt;a href="https://github.com/spring-petclinic/spring-petclinic-kotlin"&gt;&lt;strong&gt;spring-petclinic-kotlin&lt;/strong&gt;&lt;/a&gt; et énumérer les différences notables avec sa version Java.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Logo Kotlin"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/09/Kotlin_logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Implémentation Java de l'algorithme de Kruskal</title><link>https://javaetmoi.com/2017/09/algo-java-kruskal-recherche-arbre-couvrant-poids-minium/</link><pubDate>Sat, 16 Sep 2017 10:28:59 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1759</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2017/09/300px-Minimum_spanning_tree.svg_.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Arbre couvrant de poids minimum"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/09/300px-Minimum_spanning_tree.svg_.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Faisant partie des &lt;a href="https://fr.wikipedia.org/wiki/Cat%C3%A9gorie:Algorithme_de_la_th%C3%A9orie_des_graphes" title="Catégorie:Algorithme de la théorie des graphes"&gt;algorithmes de la théorie des graphes&lt;/a&gt;, l&amp;rsquo; &lt;a href="https://fr.wikipedia.org/wiki/Algorithme_de_Kruskal"&gt;algorithme de Kruskal&lt;/a&gt; permet de rechercher un arbre recouvrant de poids minimum.&lt;/p&gt;
&lt;p&gt;Une application pratique de l&amp;rsquo;algorithme de Kruskal consiste à relier tous les ordinateurs d&amp;rsquo;un même réseau local avec une longueur optimale de fibre optique.&lt;/p&gt;
&lt;p&gt;Dans ce billet, vous trouverez une implémentation Java de cet algorithme. Il m&amp;rsquo;aura permis de résoudre le &lt;a href="https://www.isograd.com/FR/solutionconcours.php"&gt;problème Fibre Optique donné en finale du concours du Meilleur Dev de France 2017&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="300px-Minimum_spanning_tree.svg"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/09/300px-Minimum_spanning_tree.svg_.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Implémentation Java de l'algorithme de rendu de monnaie par programmation dynamique</title><link>https://javaetmoi.com/2017/07/algo-rendu-monnaie-programmation-dynamique-java/</link><pubDate>Sat, 01 Jul 2017 08:07:45 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1742</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2017/07/300px-Rendu_monnaie.svg_.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/07/300px-Rendu_monnaie.svg_.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Dans ce billet, j’ai eu l’envie de vous partager mon implémentation Java du très célèbre &lt;a href="https://fr.wikipedia.org/wiki/Probl%C3%A8me_du_rendu_de_monnaie"&gt;problème du rendu de monnaie&lt;/a&gt; dont voici l’énoncé : étant donné un système de monnaie, comment rendre de façon optimale une somme donnée, c&amp;rsquo;est-à-dire avec le nombre minimal de pièces et de billets ?
Par exemple, dans le système monétaire de l’Euro, la manière la plus optimale de rendre 6 euros consiste à rendre un billet de 5 € et une pièce de 1 €, même si d’autres combinaisons existent (ex : 3 x 2 € ou 6 x 1 €).&lt;/p&gt;
&lt;p&gt;Dans le cas d’un système monétaire non canonique, utiliser un &lt;a href="https://fr.wikipedia.org/wiki/Algorithme_glouton"&gt;algorithme glouton&lt;/a&gt; ne donnera pas nécessairement un résultat optimal. Il est nécessaire de passer par la méthode algorithmique dite de &lt;a href="https://fr.wikipedia.org/wiki/Programmation_dynamique"&gt;programmation dynamique&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="300px-Rendu_monnaie.svg"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/07/300px-Rendu_monnaie.svg_.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Formulaire dynamique en Vue.Js</title><link>https://javaetmoi.com/2017/05/formulaire-dynamique-en-vue-js/</link><pubDate>Thu, 18 May 2017 16:15:36 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1726</guid><description>&lt;p&gt;Dans ce billet, nous allons mettre en pratique l’initiation à Vue.js reçue le mois dernier. Je vous propose de &lt;strong&gt;coder un pseudo Google Form&lt;/strong&gt; avec l’aide de &lt;a href="https://vuejs.org/"&gt;&lt;strong&gt;Vue.js&lt;/strong&gt;&lt;/a&gt;, de &lt;strong&gt;Bootsrap&lt;/strong&gt; et du framework de validation &lt;a href="http://vee-validate.logaretm.com/"&gt;&lt;strong&gt;VeeValidate&lt;/strong&gt;&lt;/a&gt;.
Le &lt;strong&gt;formulaire HTML&lt;/strong&gt; est généré automatiquement à partir d’un &lt;strong&gt;paramétrage JSON&lt;/strong&gt; récupéré par une API REST. Nous n’aborderons pas ici la partie serveur.
Un utilisateur peut sauvegarder son formulaire à l’état de brouillon afin de poursuivre ultérieurement sa saisie. Le formulaire à afficher peut donc être pré-saisi.
La &lt;strong&gt;validation&lt;/strong&gt; est &lt;strong&gt;dynamique&lt;/strong&gt;: elle se fait au fur et à mesure de la saisie du formulaire.
Voici un exemple de formulaire :&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2017/05/2017-05-Formulaire-dynamique-en-Vue.js.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/05/2017-05-Formulaire-dynamique-en-Vue.js.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Formulaire dynamique en Vue.Js"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/05/2017-05-Formulaire-dynamique-en-Vue.js.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>14 prises de notes à Devoxx France 2017</title><link>https://javaetmoi.com/2017/04/14-prises-de-notes-a-devoxx-france-2017/</link><pubDate>Tue, 25 Apr 2017 19:03:47 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1699</guid><description>&lt;p&gt;Les &lt;strong&gt;vidéos des présentations&lt;/strong&gt; données lors de l’édition &lt;strong&gt;2017&lt;/strong&gt; de la conférence &lt;strong&gt;Devoxx France&lt;/strong&gt; sont d’ores et déjà disponibles sur la &lt;a href="https://www.youtube.com/channel/UCsVPQfo5RZErDL41LoWvk0A/videos"&gt;chaîne Devoxx FR de Youtube&lt;/a&gt;.
Si vous n’avez pas le temps de toutes les visionner, si vous souhaitez vous faire un avis avant de les regarder ou si vous souhaitez garder une trace écrite de ce que vous y avez appris, je mets librement à disposition quelques-unes de &lt;strong&gt;mes notes&lt;/strong&gt;.
Il y’en a pour tous les goûts : du Java pur et dur, du framework avec Spring, du front avec Vue.js, des conteneurs avec Docker Swarm mode, des nouvelles approches de développement avec la programmation réactive, des patterns d’architecture avec les microservices, CQRS et l’Event-Sourcing, du legacy tendance avec les logs, et du Big Data avec Elasticsearch.&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2017/04/2017-04-14-prises-de-notes-a%CC%80-Devoxx-France-2017.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/04/2017-04-14-prises-de-notes-a%CC%80-Devoxx-France-2017.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="14 prises de notes à Devoxx France 2017"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/04/2017-04-14-prises-de-notes-a%CC%80-Devoxx-France-2017.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Quoi de neuf à Devoxx France 2017 ?</title><link>https://javaetmoi.com/2017/04/quoi-de-neuf-a-devoxx-france-2017/</link><pubDate>Tue, 25 Apr 2017 17:30:12 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1718</guid><description>&lt;p&gt;Voici la présentation qui m’a permis de partager avec mes collègues les &lt;strong&gt;différents sujets qui m’auront marqué&lt;/strong&gt; lors de cette &lt;strong&gt;édition 2017 de Devoxx France&lt;/strong&gt;.
Au programme : &lt;strong&gt;Java 9&lt;/strong&gt; &lt;strong&gt;et&lt;/strong&gt; &lt;strong&gt;10&lt;/strong&gt; (les java modules, mais pas que), les &lt;strong&gt;Microservices&lt;/strong&gt;, &lt;strong&gt;Docker&lt;/strong&gt; et les orchestrateurs, &lt;strong&gt;Spring Framework 5&lt;/strong&gt;, la &lt;strong&gt;programmation réactive&lt;/strong&gt;, &lt;strong&gt;Vue.js&lt;/strong&gt; et enfin ces bons vieux &lt;strong&gt;logs&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;[slideshare id=75354376&amp;amp;doc=13-14-devoxx-fr-home-170424152217]&lt;/p&gt;</description></item><item><title>Codez le lab Vue.js de Devoxx France 2017</title><link>https://javaetmoi.com/2017/04/codez-lab-vue-js-devoxx-france-2017/</link><pubDate>Sun, 09 Apr 2017 18:16:16 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1677</guid><description>&lt;p&gt;Au cours des précédentes éditions de Devoxx France, je me suis familiarisé avec les frameworks JavaScript du moment : &lt;a href="http://javaetmoi.com/2013/04/angularjs-devoxx-france-2013/"&gt;AngularJS&lt;/a&gt; en 2013 puis &lt;a href="http://javaetmoi.com/2016/04/angular-2-hands-on-lab-devoxx-france/"&gt;Angular 2&lt;/a&gt; et &lt;a href="wp-content/uploads/2016/05/Devoxx_France-2016-Let_s_React.pdf"&gt;ReactJS&lt;/a&gt; en 2016. Cette année, ce fut au tour d’un nouveau venu, à savoir &lt;strong&gt;Vue.js&lt;/strong&gt;. Je l’ai testé au travers du &lt;a href="http://cfp.devoxx.fr/2017/talk/USM-5688/Apres_Angular_et_React,_voici_..._VueJS"&gt;Hands-on Lab&lt;/a&gt; animé par Emmanuel Demey et Aurélien Loyer. Si vous n’avez pas eu la chance d’y participer, cet article a pour humble &lt;strong&gt;objectif de vous aider à réaliser ce Lab par vous-même&lt;/strong&gt;, tel un &lt;strong&gt;tutoriel&lt;/strong&gt;. Il complète le code disponible sur le &lt;a href="https://github.com/Gillespie59/devoxx-vuejs/"&gt;dépôt GitHub du Lab&lt;/a&gt; ainsi que &lt;a href="http://slides.com/emmanueldemey-1/deck-13"&gt;les slides consultables en ligne&lt;/a&gt;. Vous pouvez également l’utiliser pour étudier à quoi ressemble une application Vue.js et découvrir ses principaux concepts.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/04/vuejs-emmanuel.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
Emmanuel et Aurélien sont consultants web chez Zenika Lille. Familiarisés avec Angular, ils ont découvert VueJS au travers d’un projet personnel.
VueJS nous est présenté comme une librairie (et non un framework) dédiée à la création d’interfaces web HTML. Il se veut &lt;strong&gt;simple&lt;/strong&gt; et efficace, idéal pour créer rapidement une application web. Ses concepts principaux sont les &lt;strong&gt;Vues&lt;/strong&gt;(il ne s’appelle pas Vue.js pour rien), les &lt;strong&gt;Directives&lt;/strong&gt;, les &lt;strong&gt;Composants&lt;/strong&gt; et le &lt;strong&gt;Binding&lt;/strong&gt;. Tels les Web Components, Vue.js utilise le &lt;strong&gt;Shadow DOM&lt;/strong&gt; pour scoper le style CSS des composants.
Après cette courte introduction, place au CodeLab.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Codez le lab Vue.js de Devoxx France 2017"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/04/vuejs-emmanuel.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Up-to-date Spring Framework Petclinic presentation</title><link>https://javaetmoi.com/2017/02/spring-framework-petclinic-presentation/</link><pubDate>Fri, 10 Feb 2017 07:40:20 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1672</guid><description>&lt;p&gt;Spring Petclinic is a sample application that has been designed to show how the Spring Framework can be used to build simple but powerful database-­oriented applications.
The « canonical » version of Spring Petclinic is based on Spring Boot and Thymeleaf. But many forks exists: distributed version (microservices) built with Spring Cloud, React, AngularJS. The fork we are talking about is named &lt;strong&gt;Spring&lt;/strong&gt; &lt;strong&gt;Framework&lt;/strong&gt; &lt;strong&gt;Petclinic&lt;/strong&gt;. It maintains a Petclinic version both with a &lt;strong&gt;plain old Spring Framework configuration&lt;/strong&gt; and a &lt;strong&gt;3-layer architecture&lt;/strong&gt; (i.e. presentation &amp;ndash;&amp;gt; service &amp;ndash;&amp;gt; repository).&lt;/p&gt;</description></item><item><title>Découvrez les forks de Spring Petclinic</title><link>https://javaetmoi.com/2016/12/les-forks-de-spring-petclinic/</link><pubDate>Wed, 21 Dec 2016 16:20:08 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1657</guid><description>&lt;p&gt;L’ &lt;a href="https://github.com/spring-projects/spring-petclinic"&gt;&lt;strong&gt;application démo Spring Petclinic&lt;/strong&gt;&lt;/a&gt; a été conçue pour montrer comment le framework Spring peut être utilisé pour développer une &lt;strong&gt;application web&lt;/strong&gt; secondée par une base de données relationnelle. En somme, rien de révolutionnaire. Mais c’est ce qui fait tout son intérêt : présenter une &lt;strong&gt;architecture logicielle&lt;/strong&gt; respectant &lt;strong&gt;l’état de l’art&lt;/strong&gt; d’une application conçue avec &lt;strong&gt;Spring&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Avec plus de 2000 forks sur GitHub, la communauté a créé de nombreux forks de Spring Petclinic : &lt;strong&gt;Angular&lt;/strong&gt;, &lt;strong&gt;React&lt;/strong&gt;, &lt;strong&gt;REST&lt;/strong&gt;, &lt;strong&gt;Spring Cloud&lt;/strong&gt; … Afin de fédérer cet engouement, l’ &lt;a href="https://github.com/spring-petclinic"&gt;&lt;strong&gt;organisation GitHub Spring Petclinic&lt;/strong&gt;&lt;/a&gt; a été créé sur GitHub en novembre 2016. La version de référence de Spring Petclinic reste sur &lt;a href="https://github.com/spring-projects/spring-petclinic"&gt;https://github.com/spring-projects/spring-petclinic&lt;/a&gt;. Les branches et les forks ont basculé sur &lt;a href="https://github.com/spring-petclinic"&gt;https://github.com/spring-petclinic&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ce billet a pour objectif de vous présenter cette récente initiative puis de vous présenter les &lt;strong&gt;différents forks&lt;/strong&gt; d’ores et déjà disponible dans l’organisation Spring Petclinic. Mais avant cela, remontons le temps.&lt;/p&gt;</description></item><item><title>Image Docker pour Spring Boot Petclinic</title><link>https://javaetmoi.com/2016/11/image-docker-pour-spring-boot-petclinic/</link><pubDate>Tue, 08 Nov 2016 16:22:45 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1651</guid><description>&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="docker-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/11/docker-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
Par le passé, j’ai publié 2 images Docker sur le registre &lt;strong&gt;Docker Hub&lt;/strong&gt;, l’équivalent du Maven Central Repository pour Docker : un &lt;a href="https://hub.docker.com/r/arey/mysql-client/"&gt;client MySQL&lt;/a&gt; et &lt;a href="https://hub.docker.com/r/arey/musicbrainz-database/"&gt;une base PostgreSQL MusicBrainz&lt;/a&gt;. Ces images étaient construites puis publiées automatiquement à partir d’un dépôt GitHub contenant un Dockerfile et, éventuellement, un script Shell.&lt;/p&gt;
&lt;p&gt;Plus récemment, j’ai souhaité mettre à disposition une &lt;strong&gt;image Docker de l’&lt;/strong&gt; &lt;a href="https://github.com/spring-petclinic/spring-petclinic-angular1"&gt;&lt;strong&gt;application Spring Petclinic basée sur Angular 1 et Spring Boot.&lt;/strong&gt;&lt;/a&gt; Ce billet explique :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Comment l’image Docker a été construire&lt;/li&gt;
&lt;li&gt;Et comment l’utiliser pour tester Petclinic&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="docker-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/11/docker-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Introduction à Spring Boot</title><link>https://javaetmoi.com/2016/10/introduction-a-spring-boot/</link><pubDate>Wed, 05 Oct 2016 16:06:55 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1644</guid><description>&lt;p&gt;Dans &lt;a href="http://javaetmoi.com/2016/08/migrer-vers-spring-boot/"&gt;mon précédent article sur Spring Boot&lt;/a&gt;, je vous détaillais le chemin de migration de l’application démo &lt;a href="https://github.com/spring-projects/spring-petclinic"&gt;Spring Petclinic&lt;/a&gt; vers Spring Boot. Intéressons-nous aujourd’hui aux fondamentaux : &lt;strong&gt;qu’est-ce qu’est Spring Boot ? Et comment fonctionne-t-il ?&lt;/strong&gt; Vous trouverez des éléments de réponse dans la présentation suivante. J’y décris les grands principes de Spring Boot. Puis j’essaie de démystifier le &lt;strong&gt;fonctionnement de l’auto-configuration&lt;/strong&gt;. Enfin, je montre comment Spring Boot permet de simplifier encore davantage vos &lt;strong&gt;tests&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;[slideshare id=66730766&amp;amp;doc=2016-10-04-introductionaspringboot-161004173204]&lt;/p&gt;</description></item><item><title>Faire cohabiter merge Git et release Maven</title><link>https://javaetmoi.com/2016/09/merge-git-et-release-maven/</link><pubDate>Tue, 06 Sep 2016 15:58:15 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1630</guid><description>&lt;p&gt;L’utilisation conjointe de &lt;strong&gt;Maven&lt;/strong&gt; pour réaliser des release et de &lt;strong&gt;git-flow&lt;/strong&gt; peut s’avérer laborieuse.
En effet, lorsque vous travaillez avec des branches (quel que soit le SCM), une bonne pratique veut que chaque branche possède son propre numéro de version. Afin d’éviter des collisions de nommage, cette pratique devient indispensable lorsque vous utilisez un serveur d’intégration continue pour publier les artefacts construits dans un repo Maven.
Une fois une branche crée à partir d’une autre, chaque branche vit sa vie. Des releases Maven peuvent être réalisées de part et d’autre. Là où cela devient tendu, c’est lorsque vous devez reporter les commits d’une branche vers une autre. &lt;strong&gt;Des conflits de merge sur le numéro de version Maven apparaissent alors inévitablement&lt;/strong&gt;. Lorsque votre application multi-modules comporte 15 pom.xml, c’est 15 conflits qu’il va falloir gérer manuellement. Il est effectivement risqué de conserver aveuglément la version du pom.xml local ou distant, car d’autres changements (et vrais conflits) peuvent se produire dans d’autres sections du pom.xml.&lt;/p&gt;
&lt;p&gt;Comme cas d’études, prenons l’exemple du repo Git helloworld :&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="merge1"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/09/merge1.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="merge1"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/09/merge1.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Migrer vers Spring Boot</title><link>https://javaetmoi.com/2016/08/migrer-vers-spring-boot/</link><pubDate>Mon, 29 Aug 2016 16:05:29 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1623</guid><description>&lt;p&gt;Cela fait un an que je contribue activement à la maintenance de l’application &lt;strong&gt;Spring Petclinic&lt;/strong&gt;. Développée initialement par les créateurs du framework Spring, Juergen Hoeller et Rob Harrop, cette application démo a évolué au fur et à mesure des montées de version du framework. Elle est passée d’une approche full XML, à une approche mixte annotations + XML. Une branche est également disponible pour la configuration Java.
Récemment, nous avons mis à disposition une branche basée sur &lt;strong&gt;Spring Boot 1.4.0&lt;/strong&gt;. L’objectif de ce billet est de vous expliquer quels ont été les impacts d’une telle migration.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="screenshot-petclinic"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/07/screenshot-petclinic.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>L’offre Compute de Google Cloud Platform</title><link>https://javaetmoi.com/2016/07/offre-compute-google-cloud-platform/</link><pubDate>Mon, 04 Jul 2016 17:09:05 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1618</guid><description>&lt;p&gt;J’ai eu l’opportunité d’assister à une journée de découverte de la plateforme &lt;strong&gt;Cloud&lt;/strong&gt; de Google. Dispensée dans les locaux parisiens de Google, cette formation d’une journée était animée par &lt;strong&gt;Didier Girard&lt;/strong&gt;, Google Developer Expert et Directeur Général Délégué de Sfeir. Ce fut l’occasion de découvrir la diversité des offres proposées par la &lt;strong&gt;Google Cloud Platform&lt;/strong&gt; et de pouvoir les comparer à celles, plus médiatisées, d’autres géants du web tels Amazon (AWS) et Microsoft (Azure).&lt;/p&gt;
&lt;p&gt;Large, la gamme de services Google Cloud Platform est répartie en 4 offres :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compute : App Engine, Container Engine, Compute Engine&lt;/li&gt;
&lt;li&gt;Storage : Bigtable, Cloud Storage, Cloud SQL, Cloud Datastore&lt;/li&gt;
&lt;li&gt;Big Data: BigQuery, Pub/Sub, Dataflow, Dataproc, Datalab&lt;/li&gt;
&lt;li&gt;Machine Learning: Vision API, Machine Leargning, Speech API, Translate API&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cet article se focalisera sur l’ &lt;strong&gt;offre Compute&lt;/strong&gt;. Mais avant d’aller plus loin, arrêtons-nous un moment sur ce qui est l’une des forces de la plateforme Cloud de Google : son infrastructure.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Didier Girard à la formation Google"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/06/Didier-Girard-a%CC%80-la-formation-Google.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Les Streams Java 8 par l'exemple</title><link>https://javaetmoi.com/2016/06/les-streams-java-8-par-lexemple/</link><pubDate>Fri, 10 Jun 2016 05:32:14 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1615</guid><description>&lt;p&gt;Bien que &lt;strong&gt;Java 8&lt;/strong&gt; soit sorti il y’a 2 ans, tous les développeurs n’ont pas eu encore la chance de pouvoir utiliser, en entreprise, tous les concepts issus de la &lt;strong&gt;programmation fonctionnelle&lt;/strong&gt; et qui ont été introduits dans cette version majeure : expressions lambda, interfaces fonctionnelles, méthodes par défaut, Optional, références de méthode, Streams …
Pourtant, Java 8 est à nos portes : des projets de migration de serveur d’application se terminent, les socles d’entreprise se mettent à jour, des frameworks exploitent ces nouveautés (ex : JUnit 5) &amp;hellip; Et on va enfin pouvoir exploiter à bon escient toutes ces nouvelles fonctionnalités. Mais avant cela, une mise à niveau est indispensable. Et c’est dans cet objectif que j’ai récemment initié mes collègues aux &lt;strong&gt;Streams&lt;/strong&gt;.
A partir d’un jeux de données réduit (une liste de 3 clients), &lt;strong&gt;j’ai implémenté quelques règles de gestion à la fois en Java 7 avec des boucles et en Java 8 avec des Streams&lt;/strong&gt;, histoire de leur montrer la différence.&lt;/p&gt;</description></item><item><title>Devoxx France 2016 : une conf appréciée, un slide</title><link>https://javaetmoi.com/2016/05/devoxx-france-2016-un-slide-par-conf/</link><pubDate>Sat, 14 May 2016 09:10:07 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1608</guid><description>&lt;p&gt;Voici la présentation que j&amp;rsquo;ai animée auprès de mes collègues afin de leur faire un retour suite à ma participation à Devoxx France 2016. Le leitmotiv était &lt;strong&gt;&lt;em&gt;&amp;ldquo;1&lt;/em&gt; &lt;em&gt;conférence appréciée =&amp;gt; 1 slide&amp;rdquo;&lt;/em&gt;&lt;/strong&gt;.Au menu : Angular 2, ECMASript 2015, Kakfa, Spring Cloud, architecture StackOverflow, Jenkins pipeline, React, revues de code et documentation.&lt;/p&gt;
&lt;p&gt;[slideshare id=61995666&amp;amp;doc=2016-05-13-retoursdevoxxfrance2016-160513175637]&lt;/p&gt;</description></item><item><title>16 prises de notes à Devoxx France 2016</title><link>https://javaetmoi.com/2016/05/16-prises-de-notes-a-devoxx-france-2016/</link><pubDate>Thu, 12 May 2016 17:14:54 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1580</guid><description>&lt;p&gt;Pour vous aider à choisir quelle conférence visionner sur la &lt;strong&gt;&lt;a href="https://www.youtube.com/channel/UCsVPQfo5RZErDL41LoWvk0A"&gt;chaîne Devoxx FR 2016 de Youtube&lt;/a&gt;&lt;/strong&gt; ou pour vous remémorer certaines chose, je mets librement à votre disposition les différentes notes que j’ai pu prendre sur mon laptop.&lt;/p&gt;
&lt;p&gt;Les sujets sont variés : des &lt;strong&gt;Microservices&lt;/strong&gt; avec Spring Boot et Spring Cloud, du &lt;strong&gt;Big Data&lt;/strong&gt; avec Kafka et Elasticsearch, du &lt;strong&gt;Front End&lt;/strong&gt; avec ECMAScript 2015 et React, du &lt;strong&gt;Java 8&lt;/strong&gt; et &lt;strong&gt;9&lt;/strong&gt; ou bien encore de la &lt;strong&gt;méthodologie&lt;/strong&gt; avec les revues de code et de la living documentation.&lt;/p&gt;
&lt;p&gt;Certaines notes pourront être lues de manière autonome ; je pense par exemple au quickie &lt;a href="wp-content/uploads/2016/05/Devoxx_France-2016-Comment_rater_ses_revues_de_code.pdf"&gt;Comment rater ses revues de code ?&lt;/a&gt; et à la conférence &lt;a href="wp-content/uploads/2016/05/Devoxx_France-2016-Stack_Overflow_behind_the_scenes.pdf"&gt;Stack Overflow behind the scenes&lt;/a&gt;. Pour être exploitables en l’état, d’autres notes demanderont à ce que vous ayez assisté à la conférence ou que vous ayez pu récupérer les supports de présentation.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="2016_04_21_Devoxx_France_2016_keynote"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/05/2016_04_21_Devoxx_France_2016_keynote.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Lab Angular 2 à Devoxx France 2016</title><link>https://javaetmoi.com/2016/04/angular-2-hands-on-lab-devoxx-france/</link><pubDate>Sat, 30 Apr 2016 15:04:09 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1560</guid><description>&lt;p&gt;Lors de l’édition 2013 de Devoxx France, &lt;a href="http://javaetmoi.com/2013/04/angularjs-devoxx-france-2013/"&gt;je découvrais la simplicité de coder une application full JavaScript avec Angular JS&lt;/a&gt;. Lors de l’édition 2014, &lt;a href="http://javaetmoi.com/2014/04/lab-angularjs-from-scratch-devoxx-france-2014/"&gt;je recodais from scratch sa fonctionnalité phare de binding directionnel&lt;/a&gt;. Deux ans ont passé. Depuis son annonce, la version 2 d’Angular déchaine les passions au sein de la communauté front. Animé par Wassim Chegham , Emmanuel Demey et Cyril Balit, le &lt;a href="http://cfp.devoxx.fr/2016/talk/ROC-7855/Angular_2_hands_on"&gt;&lt;strong&gt;Hand’s On Lab sur Angular 2&lt;/strong&gt;&lt;/a&gt; fut pour moi l’occasion de découvrir les nouveautés, mais surtout, de découvrir si ce nouveau cru est aussi séduisant que le premier.&lt;/p&gt;
&lt;p&gt;Ce billet s’adresse à celles et ceux qui n’ont pas pu assister à ce Lab et qui &lt;strong&gt;ont envie de découvrir&lt;/strong&gt; &lt;a href="https://angular.io/"&gt;&lt;strong&gt;Angular 2&lt;/strong&gt;&lt;/a&gt;. Il s’appuie sur les ressources mises à disposition par les speakers.
En7 étapes, vous développerez une application de Quizz avec la beta 11 d’Angular 2.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="2016-04-20_Hands-on-lab-Angular2_Devoxx_France_2016"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/04/2016-04-20_Hands-on-lab-Angular2_Devoxx_France_2016.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="2016-04-20_Hands-on-lab-Angular2_Devoxx_France_2016"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/04/2016-04-20_Hands-on-lab-Angular2_Devoxx_France_2016.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Génération de jeux de données Java</title><link>https://javaetmoi.com/2016/03/generation-jeux-donnees-java/</link><pubDate>Thu, 24 Mar 2016 07:36:23 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1553</guid><description>&lt;p&gt;Les &lt;strong&gt;jeux de données&lt;/strong&gt; font partie intégrante des tests. Elaborer un jeu de données demande une &lt;strong&gt;connaissance fonctionnelle&lt;/strong&gt;, aussi bien sur la nature des données que sur le scénario de test envisagé. Utiliser des jeux de &lt;strong&gt;données&lt;/strong&gt; &lt;strong&gt;réalistes&lt;/strong&gt; participe à la compréhension du &lt;strong&gt;scénario de test&lt;/strong&gt; et, donc, à sa documentation.
S’il vous était possible de &lt;strong&gt;générer&lt;/strong&gt; ces fameux jeux de données, seriez-vous intéressés ?C’est précisément l’objet de ce billet et d’un modeste &lt;strong&gt;outil&lt;/strong&gt; baptisé &lt;strong&gt;JavaBean Marshaller&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="artist"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/03/artist.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Ces outils qui nous font gagner du temps</title><link>https://javaetmoi.com/2016/03/outils-pour-developpeurs-java/</link><pubDate>Mon, 21 Mar 2016 07:16:35 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1549</guid><description>&lt;p&gt;Au quotidien, tout &lt;strong&gt;développeur Java&lt;/strong&gt; utilise un IDE, un JDK, un outil build et un navigateur. Ce sont des standards. A côté, chaque développeur utilise un ou plusieurs petits outils permettant d’améliorer son quotidien. Par outil, j’entends aussi bien un &lt;strong&gt;plugin&lt;/strong&gt;, un &lt;strong&gt;logiciel&lt;/strong&gt; ou une &lt;strong&gt;fonctionnalité&lt;/strong&gt; avancée de son IDE.
Dans cette présentation, j’ai eu envie de partager des &lt;strong&gt;outils fonctionnant sous Windows&lt;/strong&gt;(mais pas que). J’utilise certains depuis des années, d’autres depuis seulement quelques semaines suite aux recommandations de collègues.
A vous de voir si vous souhaitez les tester puis les adopter, ou non.&lt;/p&gt;
&lt;p&gt;[slideshare id=59714114&amp;amp;doc=2016-03-17-cesoutilsquivousfontgagnerdutemps-160318071738]&lt;/p&gt;</description></item><item><title>Tester unitairement une application Java</title><link>https://javaetmoi.com/2016/02/tester-unitairement-application-java/</link><pubDate>Fri, 12 Feb 2016 07:06:01 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1519</guid><description>&lt;p&gt;Un récent 13-14 m’a donné l’occasion de partager ma vision des &lt;strong&gt;tests unitaires&lt;/strong&gt; avec mes collègues, qu’ils soient &lt;strong&gt;développeurs Java&lt;/strong&gt; ou &lt;strong&gt;chefs de projet&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Au cours de cette présentation, j’ai essayé de répondre à des questions qui font régulièrement débat : &lt;em&gt;« Qu’est-ce qu’un test unitaire ? A quoi çà sert ? Que dois-je tester ? »&lt;/em&gt;. Tester n’est pas facile. Cela demande un apprentissage. Heureusement, il existe des &lt;strong&gt;bonnes pratiques&lt;/strong&gt; et des outils. J’y ai notamment présenté ceux faisant parti de notre stack technique : &lt;strong&gt;JUnit&lt;/strong&gt;, &lt;strong&gt;Mockito&lt;/strong&gt;, &lt;strong&gt;DbUnit&lt;/strong&gt; et &lt;strong&gt;Spring Test&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Spring Core 4.2 Certification Mock Exam</title><link>https://javaetmoi.com/2016/01/spring-core-4-2-certification-mock-exam/</link><pubDate>Mon, 18 Jan 2016 07:05:32 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1508</guid><description>&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="spring-pro-cert"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/01/spring-pro-cert.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
Four years ago, I’ve published a first &lt;a href="http://javaetmoi.com/2012/02/core-spring-3-0-certification-mock-exam/"&gt;mock exam for the Spring Core 3.0 Certification&lt;/a&gt;. Encouraged by Michael and Alan, I’ve updated this &lt;strong&gt;free&lt;/strong&gt; &lt;strong&gt;mock exam&lt;/strong&gt; for the &lt;a href="http://pivotal.io/academy#certification"&gt;Spring Professional certification based on the Spring Core 4.2 course&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;According to the &lt;a href="wp-content/uploads/2016/01/Core-Spring-4.2-Certification-Study-Guide.pdf"&gt;Core Spring 4.2 Certification Study Guide&lt;/a&gt;, 3 new topics have been added to the &lt;strong&gt;Spring Core 4.2 mock exam&lt;/strong&gt;: &lt;strong&gt;REST&lt;/strong&gt;, &lt;strong&gt;Microservices&lt;/strong&gt; and &lt;strong&gt;Spring Cloud&lt;/strong&gt;. They replace older topics: JMX, JMS and Remoting.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="spring-pro-cert"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/01/spring-pro-cert.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Les dessous du Framework Spring</title><link>https://javaetmoi.com/2015/12/les-dessous-du-framework-spring/</link><pubDate>Mon, 07 Dec 2015 17:50:46 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1493</guid><description>&lt;p&gt;Chaque jour, de nombreux développeurs utilisent le &lt;strong&gt;framework Spring&lt;/strong&gt; pour &lt;strong&gt;l’injection de dépendances&lt;/strong&gt; et la &lt;strong&gt;gestion des transactions&lt;/strong&gt;. Majeures, ces 2 fonctionnalités ne nécessitent pas un gros effort d’apprentissage. Pour autant, leurs mises en œuvre par le framework est complexe. Par curiosité intellectuelle, mais également afin d’éviter certains pièges et de profiter pleinement des capacités de Spring, il est intéressant de comprendre les &lt;strong&gt;mécanismes internes du framework&lt;/strong&gt; qu’on utilise au quotidien : &lt;strong&gt;cycle de vie&lt;/strong&gt; d’un bean, &lt;strong&gt;proxy&lt;/strong&gt;, &lt;strong&gt;intercepteur&lt;/strong&gt;, &lt;strong&gt;post-processeur&lt;/strong&gt;, &lt;strong&gt;fabrique&lt;/strong&gt; de beans, &lt;strong&gt;hiérarchie de contextes&lt;/strong&gt;, &lt;strong&gt;portée&lt;/strong&gt; …
Les slides de cette présentation ont pour objectif de vous les introduire.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="//fr.slideshare.net/AntoineRey/les-dessous-du-framework-spring" title="Les dessous du framework spring"&gt;Les dessous du framework spring&lt;/a&gt;&lt;/strong&gt; par &lt;strong&gt;&lt;a href="//www.slideshare.net/AntoineRey"&gt;Antoine Rey&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Formatez votre code</title><link>https://javaetmoi.com/2015/12/formatez-votre-code-editorconfig/</link><pubDate>Fri, 04 Dec 2015 07:27:57 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1488</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2015/11/editorconfig-stickers.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="editorconfig-stickers"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/11/editorconfig-stickers.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Lors du démarrage d’un projet sur lequel plusieurs développeurs vont être amenés à travailler, se pose très tôt la question des &lt;strong&gt;styles et règles de formatage&lt;/strong&gt; à appliquer au code. En effet, afin de pouvoir comparer l’historique des révisions d’un fichier, une bonne pratique veut que l’on ne change pas les règles de formatage au cours de route. Si tel était le cas, les changements importants seraient noyés par les changements d’indentations et autres retours à la ligne.
Parmi les normes de développements d’une entreprise ou d’un projet Open Source, un chapitre couvre généralement les règles de formatage. C’est par exemple le cas du &lt;a href="https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Code-Style"&gt;guide de style de code&lt;/a&gt; du projet Spring Framework. Ces règles peuvent également être définies au sein d’un outil de qualimétrie comme &lt;a href="http://nemo.sonarqube.org/coding_rules#qprofile=java-sonar-way-45126%7Cactivation=true"&gt;SonarQube&lt;/a&gt;. Chaque violation de règle entraine alors un défaut.
Ce &lt;strong&gt;billet propose 2 solutions&lt;/strong&gt; permettant à des développeurs &lt;a href="https://www.jetbrains.com/idea/"&gt;IntelliJ&lt;/a&gt;, &lt;a href="https://spring.io/tools"&gt;Spring Tools Suite&lt;/a&gt; (STS) et &lt;a href="https://eclipse.org/home/index.php"&gt;Eclipse&lt;/a&gt; de travailler ensemble.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="editorconfig-stickers"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/11/editorconfig-stickers.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Tout sur le Elastic{ON} Tour Paris 2015</title><link>https://javaetmoi.com/2015/11/tout-sur-elastic-on-tour-paris-2015/</link><pubDate>Fri, 13 Nov 2015 13:00:47 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1480</guid><description>&lt;p&gt;Sur les 12 représentations mondiales, la 3ième date de la tournée européenne de l &lt;a href="https://www.elastic.co/elasticon"&gt;a conférence Elastic{ON}&lt;/a&gt; a eu lieu le 5 novembre 2015 à Paris.&lt;/p&gt;
&lt;p&gt;Invité par la société &lt;a href="http://adelean.com/"&gt;Adelean&lt;/a&gt;, j’ai pu y participé. Pour toutes celles et ceux qui n’ont pas eu cette chance, ce billet me permet de vous faire partager cette journée.&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2015/11/elasticon-patis-2015-keynote.jpeg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="elasticon-patis-2015-keynote"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/11/elasticon-patis-2015-keynote.jpeg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="elasticon-patis-2015-keynote"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/11/elasticon-patis-2015-keynote.jpeg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Docker file de la database MusicBrainz</title><link>https://javaetmoi.com/2015/11/docker-file-database-musicbrainz/</link><pubDate>Mon, 02 Nov 2015 06:12:35 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1471</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2015/07/docker-logo.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="docker-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/07/docker-logo.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Lorsqu’on développe dans son coin une démo basée sur une nouvelle techno, il est fréquent d’avoir besoin de données de tests. Soit on se les construit à la main, soit on en récupère sur Internet. Le mouvement &lt;a href="https://fr.wikipedia.org/wiki/Open_data"&gt;Open Data&lt;/a&gt; et les API mises à disposition par les grands du Web permettent de récupérer des données en temps réel. Dans les conférences, nombre de démos live utilisent les API de Twitter ou de Github. Ces données sont généralement formatées en JSON. Une connexion réseau est alors nécessaire.&lt;/p&gt;
&lt;p&gt;Dans le cadre d’une série d’articles sur Elasticsearch et AngularJS, j’ai eu le besoin d’indexer des données de manière &lt;strong&gt;offline&lt;/strong&gt;. Cherchant une &lt;strong&gt;source de donnée musicale&lt;/strong&gt;, j’ai opté pour &lt;a href="https://musicbrainz.org/"&gt;&lt;strong&gt;MusicBrainz&lt;/strong&gt;&lt;/a&gt; qui, à l’instar d’IMDb pour le cinéma, est une plateforme ouverte collectant des méta-données sur les artistes, leurs albums et leurs chansons puis les mettant à disposition du publique. Cette plateforme est composée d’une base de données relationnelles et d’une interface web permettant d’effectuer des recherches, de consulter les données et de participer à l’enrichissement de la base. &lt;a href="http://blog.last.fm/2011/11/24/the-brainz-are-back-in-town"&gt;Last.fm&lt;/a&gt;, &lt;a href="http://www.theguardian.com/open-platform/blog/linked-data-open-platform"&gt;The Guardian&lt;/a&gt; ou bien encore la &lt;a href="http://www.bbc.co.uk/music/brainz/"&gt;BBC&lt;/a&gt; s’interfacent avec MusicBrainz.&lt;/p&gt;
&lt;p&gt;Dans l’article &lt;a href="http://javaetmoi.com/2013/11/musicbrainz-elasticsearch-angularjs-openshift/"&gt;Elastifiez la base MusicBrainz sur OpenShift&lt;/a&gt;, je proposais 2 méthodes pour installer la base de données : récupérer une VM ou un dump de la base PostgreSQL. Dans les 2 cas, la procédure d’installation demandait une intervention humaine.
Ce billet vous en propose une 3ième : automatiser l’installation de base de données à l’aide de &lt;a href="https://www.docker.com/"&gt;&lt;strong&gt;Docker&lt;/strong&gt;&lt;/a&gt;. Après &lt;strong&gt;quelques lignes de commande&lt;/strong&gt; et un peu de &lt;strong&gt;patience&lt;/strong&gt; le temps de l’import du dump PostgreSQL, vous pourrez vous connecter localement à la base musicale contenant des données à jour.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="docker-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/07/docker-logo.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Hibernate Validator 5 sur un conteneur de Servlet 2.5</title><link>https://javaetmoi.com/2015/10/hibernate-validator-5-sur-conteneur-servlet-2-5/</link><pubDate>Thu, 01 Oct 2015 05:17:30 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1462</guid><description>&lt;p&gt;Implémentation de référence de &lt;a href="http://beanvalidation.org/"&gt;Bean Validation 1.1&lt;/a&gt;, &lt;a href="http://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/validator-gettingstarted.html#validator-gettingstarted-uel"&gt;Hibernate Validator 5.x requière une implémentation d&amp;rsquo;Unified Expression Language respectant la JSR-341&lt;/a&gt; (correspond aux &lt;a href="https://jcp.org/en/jsr/detail?id=341"&gt;&lt;strong&gt;EL 2.2&lt;/strong&gt;&lt;/a&gt;).
EL 2.2 étant apparue avec Java EE 6, il n’est donc pas possible d’utiliser Hibernate Validator 5 dans un serveur d’application Java EE 5 et un conteneur de servlets 2.5. C’est pourquoi &lt;a href="http://hibernate.org/validator/faq/#does-hibernate-validator-5-x-work-with-tomcat-6"&gt;Hibernate Validator 5 ne fonctionne pas avec Tomcat 6&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2015/09/hibernate-validator-logo.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="hibernate-validator-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/09/hibernate-validator-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Essayer et vous tomberez au runtime sur l’exception suivante :
NoSuchMethodError: javax.el.ExpressionFactory.newInstance()Ljavax/el/ExpressionFactory)&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="hibernate-validator-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/09/hibernate-validator-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Benchmark de frameworks de mapping objet</title><link>https://javaetmoi.com/2015/09/benchmark-frameworks-java-mapping-objet/</link><pubDate>Wed, 16 Sep 2015 05:20:37 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1442</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2015/09/logo-java-performance.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-java-performance"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/09/logo-java-performance.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Ce billet a pour origine un commentaire posté dans &lt;a href="http://javaetmoi.com/2015/08/check-list-revue-code-et-architecture-java/"&gt;mon précédent billet&lt;/a&gt; et dans lequel Laurent demandait un &lt;strong&gt;retour d’expérience&lt;/strong&gt; sur l’utilisation de &lt;strong&gt;frameworks Java de mapping objet vers objet&lt;/strong&gt; tels &lt;a href="https://github.com/DozerMapper/dozer"&gt;Dozer&lt;/a&gt; ou &lt;a href="http://modelmapper.org/"&gt;ModelMapper&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dans l’architecture d’une &lt;strong&gt;applicative n-tiers&lt;/strong&gt;, une couche de mapping objet / objet peut intervenir à plusieurs niveaux :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;En entrée ou en sortie d’un web service SOAP afin de convertir en objet métier les DTO générés à partir du WSDL, ou inversement.&lt;/li&gt;
&lt;li&gt;Entre la couche de présentation et la couche de services métiers lorsque la première expose des DTO et la seconde travaille avec des objets métiers.&lt;/li&gt;
&lt;li&gt;Entre la couche de services métiers et la couche d’accès aux données afin de mapper les entités persistances en objets métiers.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dans le premier exemple, le développeur n’a guère le choix. Dans les 2 autres, il s’agit d’un choix d’architecture.
L’introduction d’une couche de mapping n’est pas un choix à prendre à la légère : ayant pour objectif de découpler les couches, elle complexifie l’application et peut détériorer ses performances. Le choix d’en introduire une et d’utiliser un framework pour faciliter sa mise en œuvre n’est pas non plus évident.&lt;/p&gt;
&lt;p&gt;Ce billet est découpé en 2 parties :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Une première dressant les &lt;strong&gt;avantages&lt;/strong&gt; et les &lt;strong&gt;inconvénients&lt;/strong&gt; d’utiliser &lt;strong&gt;Dozer&lt;/strong&gt; par rapport à une &lt;strong&gt;approche manuelle&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;et une seconde présentant les résultats d’un &lt;strong&gt;micro-benchmark&lt;/strong&gt; comparant plusieurs frameworks : &lt;strong&gt;Dozer&lt;/strong&gt;, &lt;strong&gt;Orika&lt;/strong&gt;, &lt;strong&gt;Selma&lt;/strong&gt;, &lt;strong&gt;MapStruct&lt;/strong&gt; et &lt;strong&gt;ModelMapper&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-java-performance"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/09/logo-java-performance.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Check-list revue de code Java</title><link>https://javaetmoi.com/2015/08/check-list-revue-code-et-architecture-java/</link><pubDate>Thu, 27 Aug 2015 05:20:24 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1435</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2015/08/clean_code_72_color.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="clean_code_logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/08/clean_code_72_color.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Réaliser des &lt;strong&gt;revues de code e&lt;/strong&gt; st une activité que je pratique régulièrement sur les projets que j’encadre techniquement. De manière général, elles &lt;strong&gt;se déroulent sur le poste du développeur&lt;/strong&gt;. Ce dernier me présente ses derniers changements, justifie ses choix et m’explique ses difficultés. En fonction de son expérience sur le projet, la périodicité des revues varie d’1 fois par jour à 2 fois par mois.
Les améliorations à apporter sont réalisées en séance en pair programming ou bien consignées directement dans le code à l’aide d’un TODO. Je profite de ces moments privilégiés pour expliquer et/ou échanger autour des règles de coding et d’architecture logicielle.&lt;/p&gt;
&lt;p&gt;Dans le cadre de l’ &lt;strong&gt;externalisation du développement&lt;/strong&gt; d’une application, les revues de code se pratiquent différemment. En effet, la livraison du code intervient souvent après un long effet tunnel. Dès le début des développements, les développeurs doivent connaître mes attentes. Ce billet a pour objectif de les formaliser de manière synthétique.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="clean_code_logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/08/clean_code_72_color.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Plateforme LAMP avec Docker Compose</title><link>https://javaetmoi.com/2015/07/plateforme-lamp-docker-compose/</link><pubDate>Wed, 15 Jul 2015 05:31:19 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1429</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2015/07/docker-logo.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="docker-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/07/docker-logo.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Afin de préparer la migration technique d’un site web, j’ai eu besoin de reconstruire un environnement à l’identique de la production.&lt;/p&gt;
&lt;p&gt;Hébergé sur un serveur Linux, ce site est propulsé par Apache 2.2, PHP 5.6 et MySQL 5.5.
C’était l’occasion parfaite pour découvrir &lt;strong&gt;Docker&lt;/strong&gt;. Une première étape consiste à décomposer cette plateforme LAMP en &lt;strong&gt;conteneurs&lt;/strong&gt; Docker ayant chacun leur responsabilité. Voici les 3 conteneurs identifiés :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;site&lt;/strong&gt;: conteneur Apache et PHP sur lequel les pages PHP du site sont déployées&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;database&lt;/strong&gt;: conteneur MySQL hébergeant la base de données utilisée par les pages PHP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;phpmyadmin&lt;/strong&gt;: conteneur dédié à l’outil d’administration de base de données phpMyAdmin&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pour orchestrer le démarrage des conteneurs, gérer leur configuration et définir leurs interactions, l’utilisation de l’outil &lt;a href="https://docs.docker.com/compose/"&gt;&lt;strong&gt;Docker Compose&lt;/strong&gt;&lt;/a&gt; paraissait évidente.&lt;/p&gt;
&lt;p&gt;Dans ce billet, vous trouverez le fichier docker-compose correspondant, un Dockerfile personnalisant l’image officielle php:5.6-apache, les lignes de commandes démarrant les conteneurs sous MacOSX et alimentant la base à partir d’un script SQL.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="docker-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/07/docker-logo.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Personnaliser Spring Batch Admin</title><link>https://javaetmoi.com/2015/06/personnaliser-spring-batch-admin/</link><pubDate>Tue, 23 Jun 2015 19:15:14 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1410</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2015/06/spring-batch-admin-screenshot.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="spring-batch-admin-screenshot"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/06/spring-batch-admin-screenshot.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Pour rappel, &lt;strong&gt;Spring Batch Admin&lt;/strong&gt; est une &lt;strong&gt;console de supervision des traitements par lots implémentés avec Spring Batch&lt;/strong&gt;. En plus d&amp;rsquo;un &lt;strong&gt;frontal web&lt;/strong&gt;, elle offre une &lt;strong&gt;API JSON&lt;/strong&gt; et expose des métriques via JMX.
Bien que dépendant du projet Spring Batch, Spring Batch Admin dispose de &lt;a href="https://github.com/spring-projects/spring-batch-admin"&gt;son propre repo GitHub&lt;/a&gt; et de son propre cycle de vie. Cet article se base sur la &lt;a href="https://spring.io/blog/2015/01/16/spring-batch-and-spring-batch-admin-releases"&gt;version 2.0.0.M1 sortie en janvier 2015.&lt;/a&gt; Développé en Spring MVC et composé de 3 JARs, Spring Batch Admin peut aussi bien être intégrée dans une application existante que déployée dans son propre WAR.&lt;/p&gt;
&lt;p&gt;Ouvert aux extensions, Spring Batch Admin a tout pour devenir un véritable &lt;strong&gt;serveur de batchs&lt;/strong&gt; : monitoring, chargement et mise à jour à chaud de la configuration des jobs, ordonnancement, exécution de jobs sur réception de fichiers …
En 3 ans, c&amp;rsquo;est la seconde fois que je suis amené à personnaliser Spring Batch Admin. Le manuel de référence fourmille d&amp;rsquo;explications. Ce billet recense quelques informations complémentaires qui, je l&amp;rsquo;espère, pourront vous être utiles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transformer Spring Batch Admin en une application auto-exécutable embarquant sa propre base de données et son propre conteneur de servlet&lt;/li&gt;
&lt;li&gt;Personnaliser l’interface d’admin&lt;/li&gt;
&lt;li&gt;Adapter les templates FreeMarker au besoin métier&lt;/li&gt;
&lt;li&gt;Exécuter un job suite à la réception d’un fichier&lt;/li&gt;
&lt;li&gt;Router un message en fonction du résultat de l’exécution d’un job&lt;/li&gt;
&lt;li&gt;Ajouter un contrôleur REST&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="spring-batch-admin-screenshot"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/06/spring-batch-admin-screenshot.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Embarquer Jetty dans une web app</title><link>https://javaetmoi.com/2015/06/web-app-jetty-standalone/</link><pubDate>Wed, 03 Jun 2015 05:19:45 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1339</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2015/04/jetty-logo.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="jetty-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/04/jetty-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Une fois le développement d’une &lt;strong&gt;application web&lt;/strong&gt; terminé, vient le moment (douloureux ou non) de son &lt;strong&gt;installation sur un serveur&lt;/strong&gt;. En général, plusieurs pré-requis sont nécessaires : JRE, &lt;strong&gt;serveur d’application&lt;/strong&gt;, base de données … Aujourd’hui, Docker et/ou des outils comme Ansible et Puppet facilitent le provisionning du middleware. Néanmoins, il est possible de simplifier encore davantage cette phase d’installation. Des applications comme Sonar et Jenkins le font depuis des années : &lt;strong&gt;packager l’application avec son propre conteneur de Servlets&lt;/strong&gt; et sa propre base de données. Afin de pouvoir déployer des applications les plus légères possibles, les architectures micro-services poussent dans ce sens. Et c’est d’ailleurs ce que proposent des frameworks comme Play Framework et Spring Boot. Ce dernier permet en effet de créer un JAR exécutable démarrant au choix un Tomcat ou un Jetty.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ce billet explique pas à pas comment embarquer un conteneur Jetty dans sa propre application&lt;/strong&gt;. Nul besoin d’utiliser Spring ou Scala.&lt;/p&gt;
&lt;p&gt;Pour distribuer votre web app, vous aurez le choix entre :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;une &lt;strong&gt;archive ZIP&lt;/strong&gt; contenant JARs, scripts shells et fichiers de configuration.&lt;/li&gt;
&lt;li&gt;ou un unique &lt;strong&gt;JAR auto-exécutable&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Le packaging est assuré par différents plugins Maven.&lt;/p&gt;
&lt;p&gt;Disposer d’une JVM et le seul pré-requis. Sachant qu’OpenJDK est installé sur la plupart des distributions Linux, ce n’est pas nécessairement une contrainte. Seule la version de Java devra être vérifiée avec soin.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="jetty-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/04/jetty-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Introduction à Angular JS</title><link>https://javaetmoi.com/2015/05/introduction-a-angularjs/</link><pubDate>Wed, 20 May 2015 17:36:21 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1316</guid><description>&lt;p&gt;Si vous pensez encore que le &lt;strong&gt;data-binding&lt;/strong&gt;, l’ &lt;strong&gt;inversion de dépendances&lt;/strong&gt;, le &lt;strong&gt;pattern MVC&lt;/strong&gt; ou bien encore la gestion de la &lt;strong&gt;navigation&lt;/strong&gt; sont réservés au code Java des applications web modernes, courrez visionner cette présentation.
&lt;strong&gt;AngularJS&lt;/strong&gt;, le dernier framework JavaScript de chez Google, devrait vous surprendre.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Basée sur l’université AngularJS, ou le futur du développement Web présentée lors de Devoxx France 2013&lt;/strong&gt;, cette présentation a pour objectif de vous initier à AngularJS.
Les concepts fondamentaux seront mis en action au travers de l&amp;rsquo;application Game Store.
Côté industrialisation, nous verrons que tests unitaires, tests fonctionnels et infrastructure de build ne sont pas non plus délaissés.&lt;/p&gt;</description></item><item><title>18 prises de notes à Devoxx France 2015</title><link>https://javaetmoi.com/2015/04/18-prises-de-notes-a-devoxx-france-2015/</link><pubDate>Tue, 21 Apr 2015 06:03:20 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1356</guid><description>&lt;p&gt;En attendant que les vidéos des &lt;a href="http://cfp.devoxx.fr/2015/index.html"&gt;différentes conférences de l’édition 2015&lt;/a&gt; de Devoxx France soient mises en ligne sur &lt;a href="http://www.parleys.com/"&gt;Parleys&lt;/a&gt; et en complément de certains supports déjà mis en ligne par certains Speakers, je mets librement à votre disposition les différentes notes que j’ai pu prendre sur mon laptop.&lt;/p&gt;
&lt;p&gt;Les sujets sont variés : du &lt;strong&gt;Machine Learning&lt;/strong&gt; avec Watson, Spark et MMLib, du &lt;strong&gt;Reactive Programming&lt;/strong&gt; avec RxJava et Vert.x, du &lt;strong&gt;Java 9&lt;/strong&gt;, du &lt;strong&gt;Spring 4.1&lt;/strong&gt; ou bien encore du Docker.&lt;/p&gt;
&lt;p&gt;Certaines notes pourront être lues de manière autonome ; je pense par exemple au quickie &lt;a href="wp-content/uploads/2015/04/Devoxx_France_2015-Strat%C3%A9gie_de_mise_en_place_de_revues_de_code.pdf"&gt;Stratégie de mise en place de revues de code&lt;/a&gt; et à la conférence &lt;a href="ploads/2015/04/Devoxx_France_2015-Livrer_chaque_jour_ce_qui_est_pret.pdf"&gt;Livrer chaque jour ce qui est prêt !.&lt;/a&gt; Pour être exploitables en l’état, d’autres notes demanderont à ce que vous ayez assisté à la conférence ou que vous ayez pu récupérer les supports de présentation.&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2015/04/Keynote-des-organisateurs.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Keynote des organisateurs"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/04/Keynote-des-organisateurs.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Keynote des organisateurs"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/04/Keynote-des-organisateurs.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Initiation à Apache Spark avec Java</title><link>https://javaetmoi.com/2015/04/initiation-apache-spark-en-java-devoxx/</link><pubDate>Tue, 14 Apr 2015 04:28:48 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1343</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2015/04/spark-logo.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="spark-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/04/spark-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En cette édition 2015 de Devoxx France, &lt;a href="https://spark.apache.org/"&gt;&lt;strong&gt;Apache Spark&lt;/strong&gt;&lt;/a&gt; est l’une des technologies qui se démarque, comme le furent Docker et Java 8 en 2014 ou AngularJS en 2013. Connu pour être le digne successeur d’Hadoop, le framework Spark fait partie des &lt;a href="http://javaetmoi.com/2015/03/nosql-matters-paris-2015/"&gt;outils Big-Data que j’ai découvert lors de la conférence NoSQL Matters 2015&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Présenté par Hayssam Saleh et Olivier Girardot, &lt;a href="http://cfp.devoxx.fr/2015/talk/YGL-3979/_Initiation_a_Spark_avec_Java_8_et_Scala"&gt;le Hands-on-Lab « Initiation à Spark avec Java 8 et Scala »&lt;/a&gt; était donc l’occasion idéale pour m’initier en pratique aux fonctionnalités proposées par Spark et découvrir l’univers du &lt;strong&gt;Machine Learning&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Si vous n’avez pas eu la chance de pouvoir assister à ce Lab, toutes les ressources utilisées lors du Lab ont été mises en lignes pour le suivre en offline (ou le terminer à la maison).&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Un &lt;a href="wp-content/uploads/2015/04/initiation-a-spark-avec-java-8-et-scala.pdf"&gt;gitbook Initiation à Spark avec Java 8 et Scala&lt;/a&gt;. Avec ses 33 pages, ce livre contient à la fois la présentation réalisée en séance par les speakers ainsi que les intitulés des exercices.&lt;/li&gt;
&lt;li&gt;&lt;a href="wp-content/uploads/2016/01/initiation-apache-spark-data.zip"&gt;Les jeu de données&lt;/a&gt; au format CSV et JSON nécessaires pour le Lab&lt;/li&gt;
&lt;li&gt;La &lt;a href="wp-content/uploads/2016/01/initiation-apache-spark-build.zip"&gt;configuration maven pour Java ou sbt pour Scala&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="spark-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/04/spark-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>NoSQL Matters Paris 2015</title><link>https://javaetmoi.com/2015/03/nosql-matters-paris-2015/</link><pubDate>Tue, 31 Mar 2015 16:32:57 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1324</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2015/03/nosql-matters-logo.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="nosql-matters-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/03/nosql-matters-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ayant gagné une place par le groupe utilisateurs Elasticsearch (que je remercie une nouvelle fois), j’ai eu l’opportunité d’assister pour la première fois à une conférence dédiée au NoSQL. Parmi la centaine de participants, je devais sans nul doute être le plus néophyte. Certes, je connais relativement bien Elasticsearch pour l’avoir mis en œuvre, mais l’écosystème d’Hadoop et des bases de données NoSQL restait pour moi encore très vague.
Ce fut donc l’occasion rêvée d’approfondir mes connaissances sur le sujet et de m’aérer l’esprit.
Cerise sur le gâteau, cette conférence m’aura permis d’apprécier la qualité de speaker de deux anciens collègues, Bruno Guedes et Lucian Precup.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="nosql-matters-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2015/03/nosql-matters-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Etude de cas Spring Integration</title><link>https://javaetmoi.com/2015/03/etude-de-cas-spring-integration-elasticsearch/</link><pubDate>Wed, 11 Mar 2015 06:30:58 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1310</guid><description>&lt;p&gt;Vous avez déjà entendu parler d’ &lt;strong&gt;Apache Camel&lt;/strong&gt; ?
Les Design Pattern n’ont plus de secrets pour vous ?
L’Event Driven Architecture vous attire ?
Les &lt;strong&gt;Enterprise Integration Pattern&lt;/strong&gt; vous interpellent ?
Vos applications reposent sur TCP, JMS, FTP, SFTP, les fichiers, les mails, XML, les web services SOAP, REST, RSS, JPA, JDBC ou même Twitter ?&lt;/p&gt;
&lt;p&gt;N’attendez plus : venez découvrir l’utilisation des patterns comme le &lt;strong&gt;Channel&lt;/strong&gt; &lt;strong&gt;Adapter&lt;/strong&gt;, le &lt;strong&gt;Router&lt;/strong&gt; ou l’ &lt;strong&gt;Aggregator&lt;/strong&gt; au travers d’un &lt;strong&gt;workshop sur Spring Integration&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Etudes de cas Spring Batch</title><link>https://javaetmoi.com/2015/02/worskshop-etudes-de-cas-spring-batch/</link><pubDate>Mon, 02 Feb 2015 07:16:08 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1304</guid><description>&lt;p&gt;Pour créer vos IHM web en Java, vous n’avez que l’embarras du choix : Vaadin, JSF, GWT, Spring MVC, Tapestry …&lt;/p&gt;
&lt;p&gt;Pour accéder aux données, à chacun ses préférences : Hibernate, JPA 2, iBatis, Spring JDBC, Spring Data …&lt;/p&gt;
&lt;p&gt;En matière de web services, il n’y a qu’à choisir : CXF, JAX-WS, JAX-RS, Spring WS, Restlet …&lt;/p&gt;
&lt;p&gt;Mais pour écrire vos traitements par lot ? java.io ? Soyons fou : commons-io. Pas très sexy …
la JSR-352 Java Batch de JEE 7 ? Optez pour l’original.&lt;/p&gt;
&lt;p&gt;Alors franchissez le pas et venez découvrir Spring Batch au cours d’un workshop basé sur un cas d’utilisation concret.&lt;/p&gt;</description></item><item><title>Hook SVN et Git pour Maven sous Windows</title><link>https://javaetmoi.com/2015/01/hook-svn-git-maven-windows/</link><pubDate>Tue, 13 Jan 2015 06:29:47 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1286</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2014/12/logo-maven.gif"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-maven"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/12/logo-maven.gif"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Désormais ancrées dans le quotidien des développeurs, les plateformes d’ &lt;strong&gt;intégration continue&lt;/strong&gt; permettent de détecter rapidement tout problème de compilation, de tests en erreur ou même d’ &lt;a href="http://www.sonarqube.org/analysis-vs-preview-vs-incremental-preview-in-sonarqube/"&gt;ajout de défauts remontés par SonarQube&lt;/a&gt;. L’objectif fixé par le team leader est de ne pas faire échouer le build et, si c’est malheureusement le cas, tout arrêter pour le réparer. Sur certains projets, le gage donné au développeur ayant cassé le build est de ramener les viennoiseries le lendemain.
Pour être certain de ne pas faire chauffer sa carte de paiement, &lt;strong&gt;une bonne pratique consiste à exécuter une ligne de commande maven (ou gradle) avant chaque commit dans le gestionnaire de code source&lt;/strong&gt;. Cependant, sur certains changements que l’on juge mineur, il peut être tentant de passer outre. Aujourd’hui, les PC ou les Mac multi-coeurs avec SSD permettent de lancer un build sans freezer le poste de développement. C’est donc davantage par excès de confiance qu’à cause du temps d’attente qu’il arrive de casser Jenkins, Bamboo ou bien encore TeamCity.&lt;/p&gt;
&lt;p&gt;Pour contrer tout oubli, il est possible de systématiser l’exécution du build Maven avant de commiter. Les outils de gestion de configuration SVN et Git offrent un mécanisme de hook. Lors de la phase de pre-commit, on va demander au SCM d’exécuter un script de hook chargé de vérifier le code source. En cas d’erreur, le commit est refusé.
Ecrire de tels scripts n’est pas compliqué sous Linux car beaucoup d’exemples existent. Par contre, &lt;strong&gt;sous Windows&lt;/strong&gt;, c’est plus rare. &lt;strong&gt;L’objet d&lt;/strong&gt; &lt;strong&gt;e cet article est donc de vous donner des exemples de scripts de hook de pre-commit et de vous expliquer comment les configurer dans Tortoise SVN et Git.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-maven"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/12/logo-maven.gif"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Tests et techniques avancées du conteneur Spring</title><link>https://javaetmoi.com/2014/12/tests-et-techniques-avancees-conteneur-spring/</link><pubDate>Wed, 17 Dec 2014 17:09:13 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1268</guid><description>&lt;p&gt;L&amp;rsquo;écosystème des technologies supportées par Spring vous est familier.
L&amp;rsquo;inversion de contrôle et l&amp;rsquo;injection de dépendances n&amp;rsquo;ont plus de secret pour vous.
Les supports de JDBC, de JPA et d&amp;rsquo;Hibernate sont pour vous une réalité.
Vous êtes conquis par la magie de Spring Data JPA.
Vous avez testé QueryDSL.
Alors n&amp;rsquo;attendez plus !!&lt;/p&gt;
&lt;p&gt;Les &lt;strong&gt;secrets du conteneur&lt;/strong&gt; Spring vous attendent pour ce 3ième workshop sur le framework Spring : module &lt;strong&gt;spring-test&lt;/strong&gt;, &lt;strong&gt;injection de beans de portées différentes&lt;/strong&gt;, &lt;strong&gt;support&lt;/strong&gt; des &lt;strong&gt;JSR 250&lt;/strong&gt; et &lt;strong&gt;330&lt;/strong&gt;, &lt;strong&gt;post-processeurs de beans&lt;/strong&gt;, fichiers de &lt;strong&gt;configuration&lt;/strong&gt; et abstraction de l’accès aux ressources.&lt;/p&gt;
&lt;p&gt;Conçu en décembre 2011, et faisant suite aux 2 billets précédents, le support de présentation de ce workshop reste d’actualités avec Spring 4.x. Seule la syntaxe XML pourrait de nos jours être réécrites en Java.&lt;/p&gt;</description></item><item><title>Désendettement du projet ehcache-spring-annotations</title><link>https://javaetmoi.com/2014/12/migration-projet-ehcache-spring-annotations/</link><pubDate>Mon, 01 Dec 2014 05:53:51 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1273</guid><description>&lt;p&gt;EhCache est sans nul doute le framework open source de gestion de cache applicatif le plus populaire parmi les développeurs Java. Polyvalent, &lt;strong&gt;EhCache&lt;/strong&gt; peut être mis en œuvre dans les différentes couches d’une application web :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="wp-content/uploads/2014/05/logo-spring-highres.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-spring-highres"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/05/logo-spring-highres.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Persistance : utilisé comme cache de niveau 2 de JPA / Hibernate pour stocker des entités et le résultat des requêtes en base.&lt;/li&gt;
&lt;li&gt;Service métier : mise en cache du résultat d’un service métier ou d’un appel de web service&lt;/li&gt;
&lt;li&gt;Présentation : cache de pages ou de fragments de page HTML&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Habitués à gérer la sécurité et les transactions de manière déclarative à l’aide d’annotations, le projet open source &lt;a href="https://code.google.com/p/ehcache-spring-annotations/"&gt;ehcache-spring-annotations&lt;/a&gt; a fait le bonheur des développeurs Spring en 2010 en introduisant l’ &lt;strong&gt;annotation @Cacheable&lt;/strong&gt;
Hébergé sur Google Code, ce projet n’est aujourd’hui plus maintenu. Il ne supporte pas Spring 4.x. Rattrapant son retard, la version 3.1 du framework Spring a été enrichi de sa propre annotation @Cacheable. Comme à son habitude, Spring permet de s’abstraire de la solution de cache sous-jacente (ex : ConcurrentMap, EhCache, Guava …) en proposant une API générique. Les débuts de cette API ont été difficiles (cf. SPR-10237 à laquelle j’ai participé). Aujourd’hui mature, implémentant la JSR-107 JCache, il n’y a aucune raison pour ne pas migrer dessus.
Relativement court &lt;strong&gt;, ce billet explique pas à pas comment migrer de ehcache-spring-annotations vers le support de cache du framework Spring&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-spring-highres"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/05/logo-spring-highres.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Persistance de données avec Spring</title><link>https://javaetmoi.com/2014/11/persistance-spring-jdbc-hibernate-jpa/</link><pubDate>Fri, 21 Nov 2014 06:14:42 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1247</guid><description>&lt;p&gt;Dans le &lt;a href="http://javaetmoi.com/2014/11/workshop-spring-1-offre-spring-et-bases/" title="L’offre Spring et les bases"&gt;1er workshop&lt;/a&gt;, je vous présentais l&amp;rsquo;écosystème de Spring et les bases du conteneur léger.
Ce second workshop se focalise sur une couche centrale de la majorité des applications d&amp;rsquo;entreprise : &lt;strong&gt;la persistance de données&lt;/strong&gt;. Vous verrez que Spring facilite la &lt;strong&gt;gestion des exceptions&lt;/strong&gt; et des &lt;strong&gt;transactions&lt;/strong&gt;. En supprimant le boilerplate code, Spring facilite également l&amp;rsquo;accès aux différentes technologies de persistance : que ce soit &lt;strong&gt;JDBC&lt;/strong&gt;, &lt;strong&gt;Hibernate&lt;/strong&gt; ou bien encore &lt;strong&gt;JPA&lt;/strong&gt;. Enfin, nous verrons comment les projets &lt;strong&gt;Spring Data JPA&lt;/strong&gt; et &lt;strong&gt;QueryDSL&lt;/strong&gt; simplifient encore davantage l&amp;rsquo;écriture de la couche d&amp;rsquo;accès aux données.&lt;/p&gt;
&lt;p&gt;Voici le support de présentation du workshop sur Spring que j’ai animé en décembre 2011 au sein de ma société et que j’ai réactualisé avant sa diffusion sur Slideshare :&lt;/p&gt;</description></item><item><title>Plugin exit pour LogStash</title><link>https://javaetmoi.com/2014/11/plugin-exit-pour-logstash/</link><pubDate>Sun, 09 Nov 2014 11:15:07 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1254</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2014/11/logstash.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logstash"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/11/logstash.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Ce billet a pour objectif de vous présenter un cas d’usage du &lt;strong&gt;plugin exit&lt;/strong&gt; pour LogStash.
Une utilisation répandue de LogStash consiste à alimenter Elasticsearch à partir de fichiers de logs.
Extensible via un mécanisme de plugins, LogStash sait gérer plusieurs types de source et plusieurs types de destinations.
&lt;strong&gt;Une utilisation alternative de LogStash consiste à l’utiliser comme batch d’indexation&lt;/strong&gt;. Le fichier à indexer a une fin. Et &lt;strong&gt;l’utilisateur souhaite que LogStash s’arrête une fois les données importées&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logstash"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/11/logstash.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>L'offre Spring et les bases</title><link>https://javaetmoi.com/2014/11/workshop-spring-1-offre-spring-et-bases/</link><pubDate>Sat, 01 Nov 2014 16:09:11 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1235</guid><description>&lt;p&gt;Rejoignez les millions de développeurs Spring.
De par sa forte pénétration dans les entreprises, tout développeur Java /JEE a ou aura à travailler sur une application s’appuyant sur Spring. Or Spring dépasse le cadre du simple framework open source.
Cette série de 5 workshops a pour objectif de faire un tour d’horizon de l’écosystème des technologies supportées par Spring avant de se focaliser plus spécifiquement sur certaines d’entre elles.
Retours d’expérience, bonnes pratiques, techniques avancées seront de partie.&lt;/p&gt;
&lt;p&gt;Propulsée dans Java EE 6 avec CDI et plus récemment au sein de JavaScript avec Google Gin, l’injection de dépendance sera au cœur du premier workshop.
Voici le support de présentation du workshop sur Spring que j&amp;rsquo;ai animé en novembre 2011 au sein de ma SSII et que j&amp;rsquo;ai réactualisé avant sa diffusion sur Slideshare.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="//fr.slideshare.net/AntoineRey/workshop-spring-session-1-loffre-spring-et-les-bases" title="Workshop Spring - Session 1 - L&amp;#39;offre Spring et les bases"&gt;Workshop Spring - Session 1 - L&amp;rsquo;offre Spring et les bases&lt;/a&gt;&lt;/strong&gt; from &lt;strong&gt;&lt;a href="//www.slideshare.net/AntoineRey"&gt;Antoine Rey&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Démystifier l’annotation @SessionAttributes de Spring MVC</title><link>https://javaetmoi.com/2014/10/annotation-sessionattributes-modelattribute-spring-mvc/</link><pubDate>Tue, 14 Oct 2014 04:53:33 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1216</guid><description>&lt;a href="wp-content/uploads/2014/05/logo-spring-highres.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-spring-highres"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/05/logo-spring-highres.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Le développement d’applications web requière une vigilance toute particulière quant à l’utilisation de la &lt;strong&gt;session web&lt;/strong&gt;. Spring MVC offre les mécanismes permettant aux développeurs de ne plus manipuler directement l’objet &lt;strong&gt;&lt;em&gt;HttpSession&lt;/em&gt;&lt;/strong&gt; mis à disposition par le conteneur web. Les 2 annotations &lt;strong&gt;&lt;em&gt;@Scope(&amp;ldquo;session&amp;rdquo;)&lt;/em&gt;&lt;/strong&gt; et &lt;strong&gt;&lt;em&gt;@SessionAttributes&lt;/em&gt;&lt;/strong&gt; en font parties. Dans ce billet, je vous expliquerai &lt;strong&gt;le fonctionnement de l’annotation &lt;em&gt;@SessionAttributes&lt;/em&gt;&lt;/strong&gt; qu’il est essentiel de maitriser avant d’utiliser. Nous verrons qu’elle fonctionne de pair avec l’annotation &lt;strong&gt;&lt;em&gt;@ModelAttribute&lt;/em&gt;&lt;/strong&gt; et qu’elle permet de simuler une &lt;strong&gt;portée conversation&lt;/strong&gt;. Nous commencerons cet article par rappeler ce qu’est &lt;strong&gt;un modèle&lt;/strong&gt; et nous le terminerons en &lt;strong&gt;testant&lt;/strong&gt; &lt;strong&gt;unitairement&lt;/strong&gt; du code qui utilise &lt;em&gt;@SessionAttributes&lt;/em&gt;.</description></item><item><title>Validation HTML 5 avec Spring MVC et Bean Validation</title><link>https://javaetmoi.com/2014/09/validation-html-5-avec-spring-mvc-et-bean-validation/</link><pubDate>Tue, 16 Sep 2014 06:40:53 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1199</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2014/09/2014-09-input-spring-mvc-en-html5-logo.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Logo HTML 5"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/09/2014-09-input-spring-mvc-en-html5-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cet article explique comment &lt;strong&gt;étendre Spring MVC pour générer le code HTML 5&lt;/strong&gt; &lt;strong&gt;des champs de saisie&lt;/strong&gt; (input fields) à partir des &lt;strong&gt;annotations Bean Validation&lt;/strong&gt; (JSR 330) apposées sur des Entités ou de simples DTO.&lt;/p&gt;
&lt;p&gt;Dans une application web &lt;strong&gt;, valider les écrans de saisie côté client&lt;/strong&gt; permet de donner un retour rapide à l’utilisateur. Avant HTML 5, le développeur web était bien démuni pour implémenter ces contrôles de surface sur le Navigateur. Certes, HTML 4 permettait de spécifier la taille max des champs de saisie (balise &lt;em&gt;maxLength&lt;/em&gt;) et leur caractère obligatoire ou non (balise &lt;em&gt;required&lt;/em&gt;). Les autres contrôles effectués côté serveur étaient alors bien souvent recodés en JavaScript à l’aide de jQuery, de CSS et de quelques plugins.
Aujourd’hui, HTML 5 se démocratise et le code JavaScript de validation devrait bientôt s’alléger drastiquement. En effet, cette spécification permet de standardiser la validation des champs de saisie côté client. Le développeur a désormais la possibilité de spécifier le type de champs (ex : nombre, date, URL …), des valeurs min et max ou bien encore un pattern de validation à l’aide d’une expression régulière.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Logo HTML 5"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/09/2014-09-input-spring-mvc-en-html5-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Publiez vos artefacts sur Maven Central</title><link>https://javaetmoi.com/2014/09/publier-deployer-releaser-artefact-sur-maven-central/</link><pubDate>Mon, 08 Sep 2014 04:30:59 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1184</guid><description>&lt;p&gt;Lorsque vous rendez open-source un projet, même le plus modeste soit-il, quoi de plus naturel que de vouloir faciliter son utilisation par la communauté de développeurs intéressés ? Dans le monde Java, le dépôt de binaires Open Source le plus connu est le &lt;strong&gt;Central Repository&lt;/strong&gt;, également connu sous le nom de &lt;a href="http://central.sonatype.org/"&gt;&lt;strong&gt;Maven Central&lt;/strong&gt;&lt;/a&gt;. En effet, lors de la construction d’un projet Java, &lt;a href="http://maven.apache.org/"&gt;Apache Maven&lt;/a&gt; essaie par défaut de localiser ses dépendances depuis Maven Central. D’autres outils de build comme Gradle et Ant/Ivy y font également référence. Géré par Sonatype et reposant sur Nexus, &lt;strong&gt;Maven Central est accessible en écriture par les développeurs Open-Source en faisant la demande&lt;/strong&gt;. Ayant récemment publié des artefacts sur ce repo, ce billet présente les différentes étapes qui m’ont permis d’y arriver.&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2014/09/2014-09-publier-sur-maven-central-javaetmoi-search.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="2014-09-publier-sur-maven-central-javaetmoi-search"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/09/2014-09-publier-sur-maven-central-javaetmoi-search.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="2014-09-publier-sur-maven-central-javaetmoi-search"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/09/2014-09-publier-sur-maven-central-javaetmoi-search.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Notes de migration vers JSF 2 et Richfaces 4</title><link>https://javaetmoi.com/2014/06/notes-migration-jsf2-richfaces4-jboss5-eap/</link><pubDate>Sat, 28 Jun 2014 16:19:58 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1165</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2014/06/2014-07-jsf2-richfaces4-dans-jboss5-richfaces-logo.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="JBoss Richfaces Logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/06/2014-07-jsf2-richfaces4-dans-jboss5-richfaces-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Début 2014, j’ai étudié la faisabilité technique d’une &lt;strong&gt;migration&lt;/strong&gt; de &lt;strong&gt;JSF 1.2&lt;/strong&gt; &lt;strong&gt;+ Richfaces 3.3&lt;/strong&gt; &lt;strong&gt;vers JSF 2.1 + Richfaces 4.3&lt;/strong&gt; sans changer de serveur d’application.
Notre serveur &lt;a href="https://access.redhat.com/site/articles/112673#EAP_5"&gt;JBoss 5.1 EAP&lt;/a&gt; étant certifié &lt;strong&gt;JavaEE 5&lt;/strong&gt;, la première difficulté consistait à &lt;strong&gt;désinstaller l’implémentation &lt;a href="https://javaserverfaces.java.net/"&gt;Mojarra&lt;/a&gt; de JSF 1.2 embarquée dans JBoss&lt;/strong&gt;. Cette opération est le pré-requis à l’installation de la version de JSF de son choix. Cette dernière aura alors pour unique contrainte d’être compatible avec le moteur de &lt;strong&gt;Servlet 2.5&lt;/strong&gt; sur lequel repose JBoss Web.
Plus classique, la seconde difficulté consistait à &lt;strong&gt;monter les versions de JSF et de Richfaces&lt;/strong&gt; d’une application existante.
J’ai arrêté mon étude après avoir migré le premier écran de cette application. Ayant conservé quelques notes, je me suis dit qu’elles pourraient intéresser certains ou certaines d’entre vous.
Ce billet commence par expliquer comment &lt;strong&gt;désinstaller JSF 1.2&lt;/strong&gt;, se poursuit par le déploiement du &lt;strong&gt;Showcase de Richfaces 4.3.5&lt;/strong&gt; dans JBoss 5.1 EAP et se termine par la mise à disposition de mes &lt;strong&gt;notes de migration&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="JBoss Richfaces Logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/06/2014-07-jsf2-richfaces4-dans-jboss5-richfaces-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Configurez Spring en Java</title><link>https://javaetmoi.com/2014/06/spring-framework-java-configuration/</link><pubDate>Mon, 16 Jun 2014 05:07:42 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1122</guid><description>Dans ce billet, nous verrons comment &lt;strong&gt;configurer en Java&lt;/strong&gt; le &lt;strong&gt;contexte Spring&lt;/strong&gt; d’une application basée sur &lt;strong&gt;Spring MVC&lt;/strong&gt;, &lt;strong&gt;Spring Security&lt;/strong&gt;, &lt;strong&gt;Spring Data JPA&lt;/strong&gt; et &lt;strong&gt;Hibernate&lt;/strong&gt;, et cela sans utiliser la moindre ligne de XML.&lt;br&gt;Personnellement, je n’ai rien contre la &lt;strong&gt;syntaxe XML&lt;/strong&gt; à laquelle j’étais habitué. D’autant la &lt;strong&gt;verbosité&lt;/strong&gt; de la configuration avait considérablement diminué grâce à l’introduction des &lt;strong&gt;namespaces XML&lt;/strong&gt; et des &lt;strong&gt;annotations&lt;/strong&gt;. Avant d’utiliser la syntaxe Java sur une application d’entreprise, j’étais même sceptique quant aux gains qu’elle pouvait apporter. Aujourd’hui, je comprends mieux son intérêt et pourquoi les projets du portfolio Spring tels &lt;a href="http://spring.io/blog/2014/04/30/spring-integration-4-0-released"&gt;Spring Integration 4.0&lt;/a&gt;, &lt;a href="#ZgotmplZ"&gt;Spring Web Service 2.2&lt;/a&gt; ou bien &lt;a href="http://spring.io/blog/2013/07/03/spring-security-java-config-preview-web-security"&gt;Spring Security 3.2&lt;/a&gt; proposent dans leur dernière version un niveau de configuration Java iso-fonctionnel avec leur équivalent XML. Sans compter que le support de la configuration Java leur ouvre la porte d’une intégration plus poussée à &lt;a href="http://projects.spring.io/spring-boot/"&gt;&lt;strong&gt;Spring Boot&lt;/strong&gt;&lt;/a&gt;, le nouveau fer de lance de Pivotal.&lt;br&gt;</description></item><item><title>14 prises de notes à Devoxx France 2014</title><link>https://javaetmoi.com/2014/04/14-prises-de-notes-a-devoxx-france-2014/</link><pubDate>Wed, 23 Apr 2014 15:28:37 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1082</guid><description>&lt;p&gt;En attendant que les vidéos des &lt;a href="http://cfp.devoxx.fr/devoxxfr2014"&gt;différentes conférences de l’édition 2014&lt;/a&gt; de Devoxx France soient mises en ligne sur &lt;a href="http://www.parleys.com/"&gt;Parleys&lt;/a&gt; et en complément des &lt;a href="http://www.parleys.com/"&gt;supports&lt;/a&gt; déjà mis en ligne par certains Speakers, je mets librement à votre disposition les différentes notes que j’ai pu prendre sur mon laptop.
Les sujets sont variés : de Docker à Angular JS, en passant par Java 8. Certaines pourront être lues de manière autonome ; je pense par exemple au quickie &lt;a href="wp-content/uploads/2014/04/Outils-pour-manager-une-%C3%A9quipe.pdf"&gt;Outils pour manager une équipe&lt;/a&gt; et à la conférence &lt;a href="wp-content/uploads/2014/04/33-things-your-want-to-do-better.pdf"&gt;33 things your want to do better&lt;/a&gt;. Pour être exploitables en l’état, d’autres notes demanderont à ce que vous ayez assisté à la conférence ou que vous ayez pu récupérer les supports de présentation.&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2014/04/devoxx-france-2014-les-cast-codeurs.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="devoxx-france-2014-les-cast-codeurs"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/04/devoxx-france-2014-les-cast-codeurs.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="devoxx-france-2014-les-cast-codeurs"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/04/devoxx-france-2014-les-cast-codeurs.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Comprendre AngularJS en le recodant à Devoxx France 2014</title><link>https://javaetmoi.com/2014/04/lab-angularjs-from-scratch-devoxx-france-2014/</link><pubDate>Sat, 19 Apr 2014 08:41:24 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1068</guid><description>&lt;p&gt;Lors de Devoxx France 2013, je découvrais AngularJS lors de l’Université sur AngularJS animée par Thierry Chatel. Enthousiasmé par ce framework, je vous faisais ici même &lt;a href="http://javaetmoi.com/2013/04/angularjs-devoxx-france-2013/"&gt;une restitution de cette Université&lt;/a&gt;. Depuis un an, j’ai poursuivi mon initiation en codant un &lt;a href="http://javaetmoi.com/2014/02/developper-industrialiser-web-app-recherche-angularjs/"&gt;front-end pour Elasticsearch avec Angular&lt;/a&gt;. Lorsque j’ai découvert que &lt;a href="http://swiip.github.io/"&gt;Matthieu Lux&lt;/a&gt; et &lt;a href="https://twitter.com/@olivierhuber"&gt;Olivier Huber&lt;/a&gt; proposaient le &lt;a href="http://cfp.devoxx.fr/devoxxfr2014/talk/FWA-551/AngularJS%20from%20scratch%20:%20comprendre%20Angular%20en%20le%20re-faisant%20de%20z%C3%A9ro"&gt;&lt;strong&gt;Hand’s-on-Lab&lt;/strong&gt; &lt;strong&gt;« Angular JS from scratch : comprendre Angular en le refaisant de zéro »&lt;/strong&gt;&lt;/a&gt; à &lt;a href="http://www.devoxx.fr/"&gt;Devoxx France 2014&lt;/a&gt;, j’y ai vu l’occasion ou jamais d’approfondir mes connaissances et de découvrir les mécanismes se cachant derrière la magie d’Angular.&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2014/04/2014-04-comprendre-AngularJS-en-le-recodant-photo.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="angular-from-scratch-devoxx-france-2014"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/04/2014-04-comprendre-AngularJS-en-le-recodant-photo.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ce workshop a eu un beau succès : une salle comble 10 minutes avant son début et &lt;a href="https://twitter.com/Swiip/status/456721029897781248/photo/1"&gt;une place sur le podium des meilleures sessions de la matinée&lt;/a&gt;.
Pour coder les différents exercices sans avoir à se tourner régulièrement vers les solutions, de solides connaissances en JavaScript étaient nécessaires : héritage par prototype, constructeur, portée du this, couteau suisse underscore (each, clone, isEqual) …
Par ailleurs, pour apprécier la démarche, une connaissance minimaliste d’Angular me paraissait également indispensable.
Durant les 3 heures du Lab, nous avons pu implémenter 11 des 12 étapes prévues initialement (la dernière étant en bonus). Timing parfaitement respecté. Si vous n’avez pas eu la chance d’assister à cette présentation et si vous disposez de 3 heures devant vous, je vous conseille de tenter de le réaliser chez vous.
Les slides du workshop, le code source de départ, les solutions et les tests unitaires sous Jasmine sont disponibles dans le repo Github &lt;a href="https://github.com/zenika/angular-from-scratch"&gt;angular-from-scratch&lt;/a&gt; de Zenika.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="angular-from-scratch-devoxx-france-2014"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/04/2014-04-comprendre-AngularJS-en-le-recodant-photo.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Utilisez Hibernate 4.3 sous JBoss 5 avec Spring 4</title><link>https://javaetmoi.com/2014/04/hibernate4-sous-jboss5-avec-spring4/</link><pubDate>Thu, 10 Apr 2014 18:50:07 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1051</guid><description>&lt;p&gt;Dans mon &lt;a href="http://javaetmoi.com/2014/04/support-vfs2-jboss5-spring4/" title="Support du VFS 2 de JBoss 5 dans Spring 4"&gt;précédent billet&lt;/a&gt;, je vous expliquais comment réintroduire le support de VFS 2 abandonné dans &lt;strong&gt;Spring Framework 4.0&lt;/strong&gt;. Et ceci, dans l’optique de pouvoir déployer mon application dans le serveur d’application &lt;strong&gt;JBoss 5.1 EAP&lt;/strong&gt;.&lt;br&gt;Outre ce problème survenant lors de la détection de beans Spring dans le classpath, la montée de version de Spring 3.2 à Spring 4 a révélé un autre problème lié au format VFS de JBoss. Cette fois-ci, c’est le framework &lt;strong&gt;Hibernate 4.3&lt;/strong&gt; qui n’arrive pas à détecter les entités JPA du classpath.&lt;/p&gt;
&lt;p&gt;Certifié conforme à Java EE 5, JBoss 5.1 EAP utilise Hibernate 3.3 comme implémentation de JPA 1. Dans mon cas, Hibernate 4.3 est utilisé en mode standalone et est donc directement embarqué dans les librairies de mon EAR. La configuration &lt;strong&gt;JPA 2.1&lt;/strong&gt; est assurée par le support JPA offert par Spring, et plus particulièrement par la classe &lt;em&gt;&lt;a href="https://github.com/spring-projects/spring-framework/blob/v4.0.3.RELEASE/spring-orm/src/main/java/org/springframework/orm/jpa/LocalContainerEntityManagerFactoryBean.java"&gt;LocalContainerEntityManagerFactoryBean&lt;/a&gt;&lt;/em&gt;.&lt;br&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-hibernate"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/04/logo-hibernate.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Support du VFS 2 de JBoss 5 dans Spring 4</title><link>https://javaetmoi.com/2014/04/support-vfs2-jboss5-spring4/</link><pubDate>Tue, 01 Apr 2014 04:50:09 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1032</guid><description>&lt;p&gt;Ce billet solutionne un problème rencontré lors de la &lt;strong&gt;montée de version du famework Spring&lt;/strong&gt; de la version 3.2 à la &lt;strong&gt;version&lt;/strong&gt; &lt;strong&gt;4.0&lt;/strong&gt;. En effet, le déploiement d’une application sous &lt;strong&gt;JBoss 5.1 EAP&lt;/strong&gt; échouait dès l’initialisation du contexte Spring. Plus précisément, une exception était levée lorsque Spring scanne le classpath à la recherche de beans Spring annotés par les annotations @Repository, @Service, @Controller …&lt;br&gt;Comme le montre la pile d’appel complète ci-dessous, l’exception &lt;strong&gt;java.lang.ClassNotFoundException: org.jboss.vfs.VFS&lt;/strong&gt; est encapsulée dans l’exception &lt;strong&gt;java.lang.IllegalStateException: Could not detect JBoss VFS infrastructure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ce problème ne m’était initialement pas apparu lors des développements sous Eclipse avec le plugin JBoss Tools pour WTP : Spring n’a aucun mai à trouver les beans d’un WAR ou d’un EAR explosé. Cette erreur s’est manifestée lors du déploiement manuel de l’EAR dans le répertoire deploy de JBoss puis du démarrage du serveur par la commande run.bat.&lt;br&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-spring-framework"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/04/logo-spring-framework.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Plusieurs JBoss Messaging pour une même base</title><link>https://javaetmoi.com/2014/03/plusieurs-jboss-messaging-meme-base/</link><pubDate>Mon, 24 Mar 2014 18:26:20 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1019</guid><description>&lt;p&gt;Ce billet ne devrait intéresser que les développeurs Java ou administrateurs JBoss en charge de la configuration de &lt;strong&gt;JBoss Messaging&lt;/strong&gt;, le broker JMS intégré aux versions 4.3 et 5.x du serveur d’application JBoss EAP.
Pour fil conducteur, prenons l’exemple d’une application Java EE déployée dans un pseudo cluster JBoss où, par choix d’architecture technique, &lt;strong&gt;chaque serveur JBoss est autonome&lt;/strong&gt;. A ce titre, les sessions HTTP ne sont pas partagées entre les différents serveurs JBoss ; le répartiteur de charge fonctionne en affinité de session De plus, chaque serveur dispose de ses propres files JMS (clustering JBoss Messaging non mis en œuvre). Les &lt;strong&gt;messages JMS&lt;/strong&gt; sont &lt;strong&gt;persistés dans une base de données&lt;/strong&gt;, Oracle dans notre cas &lt;strong&gt;.&lt;/strong&gt; La persistance des messages peut se faire de 2 manières :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Utiliser un schéma Oracle différent pour chaque serveur JBoss du cluster&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Utiliser le même schéma pour tous les serveurs JBoss du cluster&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;JBoss Messaging supportant le &lt;strong&gt;multi-tenancy&lt;/strong&gt;, cet article explique comment mettre en œuvre la 2ième solution.&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2014/03/2014-04-jboss-messaging-meme-schema.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Architecture JBoss Messaging"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/03/2014-04-jboss-messaging-meme-schema.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Architecture JBoss Messaging"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/03/2014-04-jboss-messaging-meme-schema.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Tester le code JavaScript de vos webapp Java</title><link>https://javaetmoi.com/2014/03/tester-code-javascript-webapp-java/</link><pubDate>Tue, 04 Mar 2014 09:27:15 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=995</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2014/03/tester-code-javascript-webapp-logo.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="tester-code-javascript-webapp-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/03/tester-code-javascript-webapp-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Vous développez une &lt;strong&gt;application web&lt;/strong&gt; en &lt;strong&gt;Java&lt;/strong&gt;. Le couche présentation est assurée typiquement par un &lt;strong&gt;framework MVC&lt;/strong&gt; situé côté &lt;strong&gt;serveur&lt;/strong&gt; : Spring MVC, Struts 2, Tapestry ou bien encore JSF. Votre projet est parfaitement industrialisé : infrastructure de build sous maven, intégration continue, tests unitaires, tests Selenium, analyse qualimétrique via Sonar.&lt;/p&gt;
&lt;p&gt;A priori, vous n’avez rien à envier à la richesse grandissante de l’écosystème JavaScript, de l’outillage et des frameworks MV* côté clients. Et pourtant, quelque chose vous manque cruellement. En effet, depuis que RIA et Ajax se sont imposés, votre application Java contient davantage de code JavaScript qu’il y’a 10 ans. S’appuyant sur des librairies telles que jQuery ou Underscore, ce code JavaScript est typiquement embarqué dans votre &lt;strong&gt;WAR&lt;/strong&gt;. Pour le valider, les développeurs doivent démarrer leur conteneur web et accéder à l’écran sur lequel le code est utilisé. Firebug ou Chrome sont alors vos meilleurs amis pour la mise au point du script.&lt;/p&gt;
&lt;p&gt;Ce code JavaScript n’est généralement pas documenté. Le tester manuellement demande du temps. Les modifications sont sources d’erreur. Tout changement est donc périlleux. Si, à l’instar de vos tests JUnit pour vous classes Java, vous disposiez de &lt;strong&gt;tests JavaScript&lt;/strong&gt;, vous en seriez comblés. Or, c’est précisément ce qu’il vous manque. Et c’est là où &lt;strong&gt;Jasmine&lt;/strong&gt; et &lt;strong&gt;son plugin maven&lt;/strong&gt; viennent à votre rescousse.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="tester-code-javascript-webapp-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/03/tester-code-javascript-webapp-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Memory Leak du client CXF</title><link>https://javaetmoi.com/2014/02/memory-leak-client-cxf-attachment/</link><pubDate>Sat, 22 Feb 2014 09:28:31 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=977</guid><description>&lt;p&gt;Les tests de charge d’une nouvelle fonctionnalité m’a récemment permis de détecter un comportement inattendu de &lt;strong&gt;CXF&lt;/strong&gt; s’apparentant à une &lt;strong&gt;fuite mémoire&lt;/strong&gt;. Fusion de Celtix et de XFire, le &lt;a href="http://cxf.apache.org/"&gt;framework CXF&lt;/a&gt; propose une implémentation cliente et serveur de web services SOAP et REST. Le comportement suspect concerne la partie &lt;strong&gt;cliente&lt;/strong&gt; d’un &lt;strong&gt;web service SOAP&lt;/strong&gt; avec &lt;strong&gt;pièce-jointes&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Les symptômes ont été observés dans les conditions suivantes. Un tir de charge avec JMeter simule l’upload de fichiers de 4 Mo. Trente utilisateurs connectés simultanément uploadent des fichiers PDF. D’une durée de 5mn, le scénario fonctionnel mettant en jeu l’upload de fichiers est réitéré pendant 3h. A l’issu du tir, aucune erreur technique ou fonctionnelle n’est remontée. Par contre, l’analyse de l’empreinte mémoire est suspecte : non seulement cette nouvelle fonctionnalité a nécessité davantage de mémoire que lors des tirs précédents, mais surtout : &lt;strong&gt;la mémoire n’est jamais libérée&lt;/strong&gt;, même après l’expiration des sessions utilisateurs.&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2014/02/2014-02-cxf-attachments-memory-leak-2.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="2014-02-cxf-attachments-memory-leak-2"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/02/2014-02-cxf-attachments-memory-leak-2.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="2014-02-cxf-attachments-memory-leak-2"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/02/2014-02-cxf-attachments-memory-leak-2.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Développer et industrialiser une web app avec AngularJS</title><link>https://javaetmoi.com/2014/02/developper-industrialiser-web-app-recherche-angularjs/</link><pubDate>Sun, 09 Feb 2014 19:13:56 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=898</guid><description>&lt;p&gt;Au travers du billet &lt;a href="https://github.com/angular/angular-seed/blob/master/README.md"&gt;Elastifiez la base MusicBrainz sur OpenShift&lt;/a&gt;, je vous ai expliqué comment indexer dans &lt;strong&gt;Elasticsearch&lt;/strong&gt; et avec &lt;strong&gt;Spring Batch&lt;/strong&gt; l’encyclopédie musicale &lt;strong&gt;MusicBrainz.&lt;/strong&gt; L’index avait ensuite été déployé sur le Cloud &lt;strong&gt;OpenShift&lt;/strong&gt; de RedHat.&lt;br&gt;Une application HTML 5 était mise à disposition pour consulter les albums de musique ainsi indexés. Pour m’y aider, &lt;a href="https://twitter.com/lucianprecup"&gt;Lucian Precup&lt;/a&gt; m’avait autorisé à adapter l’application qu’il avait mise au point pour l’atelier &lt;a href="http://agenda2013.scrumday.fr/event/149"&gt;Construisons un moteur de recherche&lt;/a&gt; de la conférence Scrum Day 2013.&lt;br&gt;Afin d’approfondir mes connaissances de l’ &lt;strong&gt;écosystème JavaScript,&lt;/strong&gt; je me suis amusé à recoder cette &lt;strong&gt;application front-end&lt;/strong&gt; en partant de zéro. Ce fut l’occasion d’adopter les meilleures pratiques en vigueur : framework JavaScript MV*, outils de builds, tests, qualité du code, packaging …&lt;br&gt;Au travers de ce article, je vous présenterai comment :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Mettre en place un projet Anguler à l’aise d’ &lt;strong&gt;Angular Seed&lt;/strong&gt;, &lt;strong&gt;Node.js&lt;/strong&gt; et &lt;strong&gt;Bower&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Développer en full &lt;strong&gt;AngularJS&lt;/strong&gt; et &lt;strong&gt;Angular UI Bootstrap&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Utiliser le framework &lt;strong&gt;elasticsearch-js&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Internationaliser&lt;/strong&gt; une application Angular&lt;/li&gt;
&lt;li&gt;Tester unitairement et fonctionnellement une application JS avec &lt;strong&gt;Jasmine&lt;/strong&gt; et &lt;strong&gt;Karma&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Analyser du code source JavaScript avec &lt;strong&gt;jshint&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Packager avec &lt;strong&gt;Grunt&lt;/strong&gt; le livrable à déployer&lt;/li&gt;
&lt;li&gt;Utiliser l’ &lt;strong&gt;usine de développement&lt;/strong&gt; JavaScript disponible sur le Cloud : Travis CI, Coversall.io et David&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Le code source de l’application est bien entendu &lt;a href="https://github.com/arey/angular-musicbrainz"&gt;disponible sur GitHub&lt;/a&gt; et &lt;a href="http://angular-musicbrainz.javaetmoi.com/"&gt;testable en ligne&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Angular MusicBrainz web app screenshot"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/02/angular-musicbrainz-screenshot.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Retour d’expérience sur les problématiques Elasticsearch</title><link>https://javaetmoi.com/2013/12/retour-experience-problematiques-elasticsearch/</link><pubDate>Mon, 16 Dec 2013 14:23:37 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=879</guid><description>&lt;p&gt;&lt;em&gt;« Près de 2 ans passés chez un client en tant que référent technique d’un &lt;strong&gt;middle de recherche&lt;/strong&gt; basé sur le moteur de recherche &lt;a href="http://www.elasticsearch.org/"&gt;Elasticsearch&lt;/a&gt;, il me paraît aujourd’hui opportun de vous faire part des différentes &lt;strong&gt;problématiques&lt;/strong&gt; rencontrées au cours des &lt;strong&gt;développements&lt;/strong&gt; et de son &lt;strong&gt;exploitation&lt;/strong&gt;. »&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;En 2 versions majeures et une montée de version d’Elasticsearch, les problématiques abordées ont été nombreuses : occupation mémoire, ré-indexation sans interruption de service, Split Brain, IDF et partitionnement. Prêts pour ce retour d’expérience ? »&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Logo Elastisearch"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2013/12/logo-elastisearch.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Elastifiez la base MusicBrainz sur OpenShift</title><link>https://javaetmoi.com/2013/11/musicbrainz-elasticsearch-angularjs-openshift/</link><pubDate>Fri, 15 Nov 2013 19:35:01 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=782</guid><description>&lt;p&gt;Pour les besoins d’un workshop sur Elasticsearch, je me suis amusé à &lt;strong&gt;indexer une encyclopédie musicale&lt;/strong&gt; et à mettre en ligne une petite &lt;strong&gt;application HTML 5&lt;/strong&gt; permettant de réaliser des &lt;strong&gt;recherches&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Comme source de données musicale, j’ai opté pour &lt;strong&gt;&lt;a href="http://musicbrainz.org/" title="MusicBrainz Home"&gt;MusicBrainz&lt;/a&gt;&lt;/strong&gt; qui est une plateforme ouverte collectant des méta-données sur les artistes, leurs albums et leurs chansons puis les mettant à disposition du publique.&lt;/p&gt;
&lt;p&gt;Pour indexer les données depuis une base PostgreSQL, j’ai privilégié &lt;strong&gt;Spring Batch&lt;/strong&gt; au détriment d&amp;rsquo;une river. Pour l’IHM, j’ai adapté un prototype basé sur &lt;strong&gt;AngularJS&lt;/strong&gt;, jQuery et Bootstrap qu’avait réalisé &lt;a href="https://twitter.com/lucianprecup"&gt;Lucian Precup&lt;/a&gt; pour la &lt;a href="http://agenda2013.scrumday.fr/event/149"&gt;Scrum Day 2013&lt;/a&gt;. La mise en ligne de l’index Elasticsearch m’aura permis de tester la plateforme Cloud &lt;strong&gt;OpenShift&lt;/strong&gt; de Redhat.&lt;/p&gt;
&lt;p&gt;Cet article a pour objectif de décrire les différentes étapes qui m’ont été nécessaires pour réaliser ma démo et d’expliquer ce que j’ai librement rendu accessible sur &lt;a href="https://github.com/arey/musicbrainz-elasticsearch/blob/musicbrainz-elasticsearch-1.0.0/src/main/java/com/javaetmoi/core/batch/item/EsDocumentWriter.java"&gt;GitHub&lt;/a&gt; et &lt;a href="http://musicsearch.javaetmoi.com/"&gt;Internet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-musicbrainz"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2013/11/logo-musicbrainz.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>DbSetup, une alternative à DbUnit</title><link>https://javaetmoi.com/2013/09/dbsetup-spring-test-vs-dbunit/</link><pubDate>Fri, 06 Sep 2013 16:46:25 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=757</guid><description>&lt;p&gt;Lors du développement de &lt;strong&gt;tests d’intégration&lt;/strong&gt;, j’ai récemment eu besoin de charger une base de données à l’aide de jeux de données. Pour écrire mon premier test, j’ai simplement commencé par écrire un fichier SQL. En un appel de méthode (JdbcTestUtils::executeSqlScript) ou une ligne de déclaration XML (&amp;lt;jdbc:script location=&amp;quot;&amp;quot; /&amp;gt;), Spring m’aidait à charger mes données.&lt;br&gt;Pour tous ceux qui se sont déjà prêtés à l’exercice, maintenir des jeux de données est relativement fastidieux, qui plus en SQL. Cette solution n’était donc pas pérenne.&lt;/p&gt;
&lt;p&gt;Depuis une dizaine d’années, j’utilise régulièrement &lt;a href="http://www.dbunit.org/"&gt;DbUnit&lt;/a&gt; pour tester la couche de persistance des applications Java sur lesquelles j’interviens, qu’elle soit développée avec JDBC, Hibernate ou bien encore JPA. Cette librairie open source est également très appréciable pour tester unitairement des procédures stockées manipulant des données par lot. Pour mon besoin, j’aurais donc pu naturellement me tourner vers cet outil qui a fait ses preuves et dont je suis familier.&lt;/p&gt;
&lt;p&gt;Mais voilà, commençant à apprécier les avantages de la configuration en Java offerte par Spring et les &lt;strong&gt;APIs fluides&lt;/strong&gt; des frameworks FestAssert ou ElasticSearch utilisés sur l’application, l’idée d’ &lt;strong&gt;écrire des jeux de données en Java&lt;/strong&gt; me plaisait bien. Et justement, il y’a quelques temps, l’argumentaire de l’article &lt;a href="http://dbsetup.ninja-squad.com/approach.html"&gt;Why use DbSetup?&lt;/a&gt; ne m’avait pas laissé indifférent. C’était donc l’occasion d’utiliser cette jeune librairie développée par &lt;a href="http://ninja-squad.fr/team"&gt;les français de Ninja Squad&lt;/a&gt; et qui mérite de se faire connaitre, j’ai nommé &lt;strong&gt;&lt;a href="http://dbsetup.ninja-squad.com/"&gt;DbSetup&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Le &lt;a href="http://dbsetup.ninja-squad.com/user-guide.html"&gt;guide utilisateur de DbSetup&lt;/a&gt; étant particulièrement bien conçu, l&amp;rsquo;objectif de cet article n’est pas de vous en faire une simple traduction, mais de vous donner envie de l’essayer et de vous présenter la manière dont je l’ai mis en oeuvre. Celle-ci s’éloigne en effet quelque peu de celle présentée dans la documentation, la faute à mes vieux réflexes d’utilisateur de DbUnit et au bienheureux &lt;strong&gt;&lt;a href="http://xunitpatterns.com/Transaction%20Rollback%20Teardown.html"&gt;rollback pattern&lt;/a&gt;&lt;/strong&gt; de Spring.&lt;br&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="test-database"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2013/09/test-database.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Ecraser une branche par une autre avec Git</title><link>https://javaetmoi.com/2013/08/ecraser-une-branche-par-une-autre-avec-git/</link><pubDate>Thu, 01 Aug 2013 18:13:55 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=735</guid><description>&lt;a href="wp-content/uploads/2013/07/git-logo.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Logo du SCM GIT"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2013/07/git-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Dans le cycle de vie d’une application, il arrive parfois qu’ &lt;strong&gt;une branche prenne le pas sur une autre branche&lt;/strong&gt; et qu’il soit nécessaire d’écraser la seconde par la première. Prenons l’exemple d’une application où, par convention, le master (ou le trunk sous SVN) est considéré comme la branche de développement (axée vers le futur) et que l’utilisation du système de branches soit habituellement consacrée aux branches de maintenance. Dans certaines circonstances (ex : nouveaux développements à commencer pour la version N+2, migration technique à réaliser …), une branche peut prendre le dessus du master. Afin de retrouver la convention d’origine, une &lt;strong&gt;recopie de la branche sur le master&lt;/strong&gt; va, à termes, être nécessaire. Que ce soit avec Git ou git-svn, nous allons voir comment &lt;strong&gt;&lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/strong&gt; peut nous y aider en &lt;strong&gt;quelques lignes de commande&lt;/strong&gt;.</description></item><item><title>Orchestrez vos déploiements avec Jenkins</title><link>https://javaetmoi.com/2013/07/jenkins-release-deploy-plugins/</link><pubDate>Tue, 16 Jul 2013 16:37:26 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=721</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2013/07/jenkins-build-history.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="jenkins-build-history"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2013/07/jenkins-build-history.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; A Devoxx France, lorsqu’Axel Fontaine vante les mérites du &lt;strong&gt;Continuous Delivery&lt;/strong&gt; et que Ludovic Cinquin affirme que &lt;strong&gt;Facebook est mis en production 2 fois par jour&lt;/strong&gt;, avouez que cela a de quoi vous laisser rêveur ? En attendant de travailler un jour dans des structures ayant compris que des &lt;strong&gt;livraisons fréquentes&lt;/strong&gt; et &lt;strong&gt;automatisées&lt;/strong&gt; permettent de gagner en fiabilité, en agilité et de développer leur business, vous n’avez d’autres choix que de vous approprier les processus établis où vous intervenez et de les améliorer à votre niveau.&lt;/p&gt;
&lt;p&gt;Dans les grands comptes où je suis intervenu, la mouvance &lt;strong&gt;Devops&lt;/strong&gt; prônant de tels processus n’avait pas encore percé. Quelques &lt;strong&gt;outils&lt;/strong&gt; sont bien mis en place. Mais pour autant, &lt;strong&gt;MOE&lt;/strong&gt; et &lt;strong&gt;exploitation&lt;/strong&gt; sont 2 &lt;strong&gt;équipes&lt;/strong&gt; bien &lt;strong&gt;distinctes&lt;/strong&gt;. L’exploitation peut elle-même être scindée en 2 : production et intégration (hors-prod). C’est précisément dans ce contexte que s’inscrit cet article. Il montre comment utiliser un &lt;strong&gt;serveur d’intégration continue&lt;/strong&gt; pour releaser puis &lt;strong&gt;déployer une application&lt;/strong&gt; sur les environnements autorisés.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="jenkins-build-history"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2013/07/jenkins-build-history.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Rendez autonomes vos Selenium</title><link>https://javaetmoi.com/2013/06/selenium-robuste-car-autonome/</link><pubDate>Sat, 22 Jun 2013 13:29:03 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=707</guid><description>&lt;p&gt;De nos jours, l’utilisation d’un serveur d’ &lt;strong&gt;intégration continue&lt;/strong&gt; pour déployer son application puis exécuter ses &lt;strong&gt;tests &lt;a href="http://seleniumhq.org/"&gt;Selenium&lt;/a&gt;&lt;/strong&gt; s’est relativement démocratisée. Néanmoins, l’investissement réalisé pour l’écriture de ces tests peut rapidement être mis à mal par le coût associé à leur maintenance. En effet, les tests d’IHM sont de nature plus &lt;strong&gt;instables&lt;/strong&gt; que de simples tests unitaires. Outre des problématiques de rendu et de transversalité des fonctionnalités testées, l’une des principales difficultés réside dans la &lt;strong&gt;répétabilité des tests&lt;/strong&gt;. Les &lt;strong&gt;données de test&lt;/strong&gt; y jouent pour beaucoup. Cette difficulté est décuplée lorsque votre application repose sur une &lt;strong&gt;architecture SOA&lt;/strong&gt; dont les services SOAP, XML ou bien REST sont hébergés par des tiers : vous n’avez aucune maitrise sur les données de l’environnement testé, ni sur sa stabilité.
Des tests qui échouent régulièrement à cause de données ayant été modifiées rendent laborieuse la détection de véritables &lt;strong&gt;régressions&lt;/strong&gt;.
Cet article propose une solution appliquée depuis 2 ans sur une application de taille modeste (35 000 LOC pour 20 écrans).&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Automatisation de lexécition de tests Selenium autonomes"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2013/06/deploiement-tests-selenium-autonomes.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Mod_headers à la rescousse du jsessionid</title><link>https://javaetmoi.com/2013/05/mod_headers-rescousse-jsessionid-jboss/</link><pubDate>Thu, 23 May 2013 18:45:16 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=692</guid><description>Au cours de la migration d’une cinquantaine d’applications web de Websphere vers &lt;strong&gt;JBoss 5.1 EAP&lt;/strong&gt;, nous avons été confrontés à un problème de sécurité mis en évidence par l’infrastructure de pré-production : le firewall bloquait systématiquement toute requête comportant un &lt;strong&gt;jsessionid&lt;/strong&gt; dans l’ &lt;strong&gt;URL&lt;/strong&gt;.
Modifier les règles du firewall pour laisser passer ce type de requêtes aurait introduit une faille de sécurité exploitable par appropriation de session web. Cette faille nous a d’ailleurs été révélée en parallèle par l’outil d’audit de sécurité &lt;a href="http://www-03.ibm.com/software/products/us/en/appscan/"&gt;IBM AppScan&lt;/a&gt;.
Ce billet rappelle l’origine du problème et précise quelle solution a été employée pour le résoudre le plus rapidement possible.</description></item><item><title>AngularJS à Devoxx France 2013</title><link>https://javaetmoi.com/2013/04/angularjs-devoxx-france-2013/</link><pubDate>Tue, 02 Apr 2013 16:44:53 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=667</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2013/04/devoxxfr-2013-angularjs.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Université AngularJS ou le futur du développement Web à devoxxx France 2013"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2013/04/devoxxfr-2013-angularjs.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A deux semaines de sa première formation en entreprise sur &lt;strong&gt;AngularJS&lt;/strong&gt;, répétition générale pour Thierry Chatel devant 200 développeurs avides d’en apprendre un peu plus sur le dernier né des frameworks JavaScript de &lt;strong&gt;Google&lt;/strong&gt;. Développeur Java / Swing chez IBM au début des années 2000, Thierry s’est ensuite dirigé vers du conseil en architecture avant de découvrir AngularJS durant l’été 2011. Depuis, il y consacre beaucoup d’énergie et anime notamment le site &lt;a href="http://www.frangular.com/"&gt;FrAngular.com&lt;/a&gt;, premier blog francophone dédié à ce framework.
Assez parlé de sa personne, lui-même n’en serait que trop gêné.&lt;/p&gt;
&lt;p&gt;Comme de nombreux développeurs venus assister à cette conférence, j’étais curieux de découvrir à mon tour le framework qui avait fait autant parlé de lui lors de Devoxx World 2012. Et autant vous l’annoncer dès maintenant : je n’ai pas été déçu.&lt;/p&gt;
&lt;p&gt;D’une durée de 3h, cette Université intitulée &lt;strong&gt;&lt;a href="http://www.devoxx.com/display/FR13/AngularJS%2C&amp;#43;ou&amp;#43;le&amp;#43;futur&amp;#43;du&amp;#43;developpement&amp;#43;Web"&gt;AngularJS, ou le futur du développement Web&lt;/a&gt;&lt;/strong&gt; s’est décomposée en une première partie théorique suivie d’une seconde plus pratique basée sur différents types d’applications : &lt;a href="http://jsfiddle.net/tchatel/4FNeB/"&gt;Last Tweets&lt;/a&gt;, &lt;a href="http://plnkr.co/edit/gn1jVW?p=preview"&gt;directive Google Maps&lt;/a&gt; et &lt;a href="https://github.com/tchatel/angular-gamestore"&gt;Game Store&lt;/a&gt;. Live coding et démos furent au rendez-vous.
Pour la petite anecdote, &lt;a href="http://tchatel.github.com/slides-angularjs/"&gt;les slides de la présentation&lt;/a&gt; sont écrits avec la syntaxe Markdown et sont interprétés par l’outil &lt;a href="https://github.com/tchatel/angular-showoff"&gt;Angular Showoff&lt;/a&gt; reposant, vous l’aurez deviné, sur Angular. L’intérêt majeur est qu’ils peuvent embarquer du code Angular, pratique pour les démos in-slides telles que :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xhtml" data-lang="xhtml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Your name:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Hello {{me}}!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Université AngularJS ou le futur du développement Web à devoxxx France 2013"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2013/04/devoxxfr-2013-angularjs.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Promotion de code en continue avec git-svn</title><link>https://javaetmoi.com/2013/03/promotion-code-continue-merge-git-svn/</link><pubDate>Tue, 19 Mar 2013 19:48:16 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=626</guid><description>&lt;p&gt;Dans le cadre d’un important &lt;strong&gt;chantier&lt;/strong&gt; de &lt;strong&gt;migration technique&lt;/strong&gt; d’une &lt;strong&gt;application&lt;/strong&gt;, j’ai eu l’occasion de pratiquer ce que j’appellerais la &lt;strong&gt;promotion de code en continue&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pour resituer le contexte, ce chantier dura plus de 6 mois. Entre le début et la fin de la migration, l’application a été livrée plusieurs fois en production, embarquant à chaque fois de nombreuses évolutions fonctionnelles. Nous avons donc dû nous organiser pour migrer l’application sans pénaliser l’avancement du reste de l’équipe.
Les changements techniques étant bien trop transverses à l’application, la stratégie de &lt;a href="http://martinfowler.com/bliki/FeatureToggle.html"&gt;Feature Toggle&lt;/a&gt; ne pouvait s’appliquer. Nous nous sommes donc dirigés vers une technique assimilable au &lt;a href="http://martinfowler.com/bliki/FeatureBranch.html"&gt;Feature Branch&lt;/a&gt; ; notre migration technique n’étant rien d’autre qu’une feature comme une autre. Logiquement, une branche dédiée à la migration a été créée.&lt;/p&gt;
&lt;p&gt;Notre stratégie fut de &lt;strong&gt;merger régulièrement dans cette branche le code issu de la branche de développement&lt;/strong&gt;. Une fois la migration terminée, la branche de migration a été à son tour mergée dans la branche de développement.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Workflow de promotion en continue du trunk vers la branche"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2013/03/2013-03-promotion-continue-avec-git-svn.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Architecture d’un middle d’indexation</title><link>https://javaetmoi.com/2013/02/architecture-middle-indexation-elasticsearch/</link><pubDate>Tue, 26 Feb 2013 10:35:42 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=604</guid><description>Dans &lt;a href="http://javaetmoi.com/2012/12/parallelisation-de-traitements-batchs-spring-batch/" title="Parallélisation de traitements batchs"&gt;un précédent billet&lt;/a&gt;, je vous ai présenté les solutions mises en œuvre sur un projet pour paralléliser un batch d’indexation alimentant un moteur de recherche d’entreprise. Utilisée pour initialiser l’index de recherche puis le resynchroniser quotidiennement, la technique d’intégration par batch ne permet cependant pas d’indexer les données au fil de l’eau. Ce billet aborde précisément cet aspect. En effet, le fil de l’eau ou le quasi temps réel fut dès le départ une exigence forte du métier. Recherches instantanées et auto-complétion révolutionnent le traditionnel formulaire de recherche mettant plusieurs secondes à renvoyer les résultats. Mais au prix de faire des recherches sur des données pouvant dater de J-1 ? Ce n’était pas acceptable ! Un middle d’indexation fut la réponse apportée.</description></item><item><title>Une bien mystérieuse UnknownHostException</title><link>https://javaetmoi.com/2013/01/unknownhostexception-jvm-version/</link><pubDate>Sun, 27 Jan 2013 18:29:58 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=587</guid><description>Après un précédent billet relatant un bug lié à la version du driver Oracle utilisé, voici un nouveau billet portant sur &lt;strong&gt;bug&lt;/strong&gt; lié, cette fois ci, à la &lt;strong&gt;version de la JVM utilisée&lt;/strong&gt;. Ce bug nous a été révélé très tardivement dans le cycle de développement de l’application Java incriminée. En effet, PV de recette en poche, les tests de charge menés avec JMeter sur l’environnement de pré-production ne nous avaient rien révélé. Seuls les tests de robustesse nous ont alertés d’une mystérieuse &lt;strong&gt;&lt;em&gt;java.net.UnknownHostException&lt;/em&gt;&lt;/strong&gt; survenant 4 à 5 minutes après l’arrêt volontaire d’une application tierce.</description></item><item><title>Oracle : dis-moi quelle heure est-il ?</title><link>https://javaetmoi.com/2013/01/bug-date-heure-drivers-oracle-10g-9i/</link><pubDate>Sat, 19 Jan 2013 18:14:11 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=564</guid><description>&lt;p&gt;Récemment, je suis tombé sur un &lt;strong&gt;bug&lt;/strong&gt; lié à l’utilisation d’une &lt;strong&gt;version de driver&lt;/strong&gt; &lt;strong&gt;JDBC pour Oracle&lt;/strong&gt; plus récente que la version de la base Oracle attaquée en SQL via JDBC.&lt;/p&gt;
&lt;h1 id="les-symptômes"&gt;Les symptômes&lt;/h1&gt;
&lt;p&gt;Dans notre contexte applicatif, la date et l’heure des données lues en base sont utilisées pour détecter des conflits de version, d’une manière similaire au versioning Hibernate. Concrètement, cela nous permet d’éviter qu’une donnée traitée par batch quotidien écrase une donnée plus fraiche provenant d’un système tiers. Ce mécanisme permet notamment d’exécuter un batch sans interruption de service de l’application web associée. Le bug que je vais vous décrire nous a été révélé tardivement. Sous certaines conditions, nous avons en effet constaté que le batch ne rattrapait jamais des données. C’est &lt;strong&gt;comme si l’heure n’était jamais prise en compte&lt;/strong&gt; &lt;strong&gt;dans le code Java&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Isoler le classloader de son EAR sous JBoss</title><link>https://javaetmoi.com/2013/01/isoler-classloader-ear-jboss/</link><pubDate>Sat, 05 Jan 2013 09:41:40 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=520</guid><description>&lt;p&gt;Lors de la &lt;strong&gt;migration&lt;/strong&gt; d’une application d’un &lt;strong&gt;serveur d’application&lt;/strong&gt; vers un autre, il est fréquent d’être confronté à des problématiques de &lt;strong&gt;conflits de librairies&lt;/strong&gt;. C’est par exemple le cas lorsqu’une application initialement déployée sur un Websphere Application Server 6.1 doit migrer sur &lt;strong&gt;JBoss 5.1 EAP&lt;/strong&gt; (version commerciale de JBoss AS).
Pour rappel, WAS 6.1 implémente J2EE 1.4 et s’exécute donc sur Java 5. Quant à JBoss 5.1 EAP, il implémente la norme Java EE 5, embarque donc de nombreuses implémentations des standards tels que JPA 1, JSF 1.2 et JAX-WS 1, et tourne sur Java 6.&lt;/p&gt;
&lt;p&gt;Pour illustration, prenons une application s’appuyant sur Hibernate 3.6 pour sa couche de persistance et JAXB 2.2 pour le marshalling lors d’appel de web services. Ces 2 librairies sont embarquées dans le répertoire lib de son EAR et ne posent pas de problèmes particuliers à WAS 6.1.
Par contre, sur JBoss 5.1 EAP, c’est un tout autre problème. En effet, son implémentation JPA repose sur la version 3.3 d&amp;rsquo;Hibernate. Qui plus est, JAXB 2.1 a été intégrée dans Java 6.
Si vous tentez de déployer une telle application sur un JBoss installé avec la configuration par défaut, il y’a de fortes chances que vous tombiez sur l’une ou l’autre des exceptions suivantes : &lt;em&gt;ClassCastException&lt;/em&gt;, &lt;em&gt;NoSuchMethodException, IllegalAccessErrors&lt;/em&gt;, &lt;em&gt;VerifyError.&lt;/em&gt;
A ce que j’ai compris en parcourant la documentation mais également déduis de mes tests, différents mécanismes permettent d’expliquer ces comportements :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Par défaut, lors du chargement d’une classe, le classloader de l’EAR va commencer par demander à son classloader parent (en l’occurrence celui de JBoss) de trouver la classe. Ainsi, c’est par exemple la classe Session d’Hibernate 3.3 qui sera chargée et non celle de la version 3.6 comme attendu. Il s’agit du comportement standard d’un classloader. Et c’est ce qu’on appelle communément le « j2se classloading compliance ». Sous WAS, cette stratégie de chargement peut être changée en paramétrant le classloader en PARENT_LAST.&lt;/li&gt;
&lt;li&gt;Les classes chargées par d’autres applications déployées sur la même instance de JBoss peuvent être partagées par votre application. Par exemple, la console d’admin JBoss admin-console.war embarque sa propre version de Richfaces et de Seam et peut, malgré elle, vous en faire bénéficier.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="solutions-étudiées"&gt;&lt;em&gt;Solutions étudiées&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Pour mener à bien la migration, plusieurs pistes ont été étudiées :
&lt;strong&gt;Solutions&lt;strong&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt;&lt;/strong&gt;Avantages&lt;/strong&gt;1Downgrader les versions des frameworks pour utiliser celles embarquées dans JBoss 5.1Important travail de refactoring pour combler les fonctionnalités manquantes.
Bugs existants récupérés.Respect de la norme Java EE 5.
Support éditeur maximal.2Configurer sur mesure le répertoire d’installation de JBoss (ex : supprimer le support des EJB 3 et de JPA)Mutualisation du répertoire d’installation rendue caduque.
Main sur la production _._Un JBoss qui démarre plus vite.
Pas d’impact sur le code.3Isoler le déploiement de l’applicationLire la documentation JBoss.
Augmentation possible de la PermGen.Risque nul.
Simple configuration.
Configuration embarquée dans l’EAR.&lt;/p&gt;
&lt;h2 id="configurer-le-classloader-de-lapplication"&gt;Configurer le classloader de l’application&lt;/h2&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="@Copyright JBoss - Classe chargée en priorité depuis l&amp;amp;amp;rsquo;EAR:right"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2013/01/JBoss-ClassLoading-Scoped-Java2ParentDelegationOff-300x202.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Pour mettre en œuvre la solution n°3 concernant à « scoper » l’application, il est nécessaire de configurer le chargement des classes de JBoss . Une description détaillée de son fonctionnement est disponible sur la page &lt;a href="https://community.jboss.org/wiki/JBossClassLoadingUseCases"&gt;JBossClassLoadingUseCases&lt;/a&gt; du wiki de JBoss.
Dans notre cas, La configuration des classes loaders nécessaire est &lt;strong&gt;deployment scoped&lt;/strong&gt; et &lt;strong&gt;Java2ParentDelegation&lt;/strong&gt; &lt;strong&gt;désactivé&lt;/strong&gt;. Cette configuration est représentée par la figure ci-contre.&lt;/p&gt;
&lt;p&gt;Cette configuration présente les 2 avantages suivants :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Les JARs embarqués dans l&amp;rsquo;EAR priment sur celles fournies par JBoss 5.1 et le JRE.&lt;/li&gt;
&lt;li&gt;Chaque application déployée sur le même serveur possède son propre UnifiedLoaderRepository (ULR). Le chargement des classes est isolé et n&amp;rsquo;interfère pas. Elles sont également isolées du chargement des applications tierces (ex: jmx-console et admin-console).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;La configuration du fichier &lt;code&gt;jboss-app.xml&lt;/code&gt; à déposer dans le répertoire META-INF de l’EAR est décrite sur la page &lt;a href="https://community.jboss.org/wiki/ClassLoadingConfiguration"&gt;ClassLoadingConfiguration&lt;/a&gt; du wiki JBoss. En voici un exemple :
Lors de la &lt;strong&gt;migration&lt;/strong&gt; d’une application d’un &lt;strong&gt;serveur d’application&lt;/strong&gt; vers un autre, il est fréquent d’être confronté à des problématiques de &lt;strong&gt;conflits de librairies&lt;/strong&gt;. C’est par exemple le cas lorsqu’une application initialement déployée sur un Websphere Application Server 6.1 doit migrer sur &lt;strong&gt;JBoss 5.1 EAP&lt;/strong&gt; (version commerciale de JBoss AS).
Pour rappel, WAS 6.1 implémente J2EE 1.4 et s’exécute donc sur Java 5. Quant à JBoss 5.1 EAP, il implémente la norme Java EE 5, embarque donc de nombreuses implémentations des standards tels que JPA 1, JSF 1.2 et JAX-WS 1, et tourne sur Java 6.&lt;/p&gt;</description></item><item><title>Ma petite usine logicielle</title><link>https://javaetmoi.com/2012/12/ma-petite-usine-logicielle-github-cloudbees/</link><pubDate>Sat, 15 Dec 2012 09:08:10 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=436</guid><description>&lt;p&gt;Suite à &lt;a href="https://github.com/arey/maven-config-github-cloudbees/issues/1"&gt;une question&lt;/a&gt; qui m’a récemment été posée sur Github, j’ai réalisé que ce que j’avais mis en place pour des besoins personnels pouvait intéresser d’autres développeurs.&lt;/p&gt;
&lt;p&gt;Dans ce billet, je vais donc vous expliquer comment créer &lt;strong&gt;votre propre usine logicielle&lt;/strong&gt;. Déployée à cheval sur &lt;strong&gt;GitHub&lt;/strong&gt; et l’offre &lt;strong&gt;DEV@Cloud&lt;/strong&gt; de &lt;strong&gt;CloudBees&lt;/strong&gt;, vous y retrouverez les briques les plus classiques : SCM, intégration continue, dépôt de binaires, bug tracker, wiki …
Le gain : à chaque commit poussé dans GitHub, votre &lt;strong&gt;code&lt;/strong&gt; est &lt;strong&gt;compilé&lt;/strong&gt;, &lt;strong&gt;testé&lt;/strong&gt; unitairement puis &lt;strong&gt;déployé&lt;/strong&gt; dans un &lt;strong&gt;repository maven public&lt;/strong&gt; dédié aux Snapshots. Par ailleurs, vous pourrez effectuer des &lt;strong&gt;releases maven&lt;/strong&gt; en local depuis votre poste de développement ; les artefacts construits seront mis à disposition dans un repository maven dédié. Tout développeur pourra librement référencer l’un ou l’autre de ces repository et utiliser votre code.&lt;/p&gt;
&lt;p&gt;En bonus, si vous développez des projets open source, vous n’aurez même pas à sortir votre carte bancaire.
&lt;a href="wp-content/uploads/2012/12/cloudbees-github-jenkins.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="cloudbees-github-jenkins"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/12/cloudbees-github-jenkins.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="cloudbees-github-jenkins"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/12/cloudbees-github-jenkins.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Parallélisation de traitements batchs</title><link>https://javaetmoi.com/2012/12/parallelisation-de-traitements-batchs-spring-batch/</link><pubDate>Sat, 01 Dec 2012 17:54:55 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=368</guid><description>&lt;h2 id="contexte"&gt;Contexte&lt;/h2&gt;
&lt;p&gt;Récemment, j’ai participé au développement d’un batch capable d’indexer dans le moteur de recherche &lt;a href="http://www.elasticsearch.org/"&gt;Elasticsearch&lt;/a&gt; des données provenant d’une &lt;strong&gt;base de données&lt;/strong&gt; tierce. Développé en Java, ce batch s’appuie sur &lt;a href="http://static.springsource.org/spring-batch/"&gt;Spring Batch&lt;/a&gt;, le plus célèbre framework de traitements par lot de l’écosystème Java&lt;br&gt;Plus précisément, ce batch est décomposé en 2 jobs Spring Batch, très proches l’un de l’autre :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;le premier est capable d’initialiser à partir de zéro le moteur de recherche&lt;/li&gt;
&lt;li&gt;et le second traite uniquement les mouvements quotidiens de données.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="problématique"&gt;Problématique&lt;/h2&gt;
&lt;p&gt;Au cours du traitement batch, l’exécution de la requête par Oracle pour préparer son &lt;strong&gt;curseur&lt;/strong&gt; a été identifiée comme l’opération la plus couteuse, loin devant la lecture des enregistrements en &lt;strong&gt;streaming&lt;/strong&gt; à travers le réseau, leur traitement chargé de construire les documents Lucene à indexer ou leur &lt;strong&gt;écriture en mode&lt;/strong&gt; bulk dans ElasticSearch. A titre d’exemple, sur des volumétries de production, la préparation côté serveur Oracle d’une requête SQL ramenant 10 millions d’enregistrement peut mettre jusqu’à 1h30.&lt;/p&gt;
&lt;p&gt;Avec pour objectif que le batch passe &lt;strong&gt;sous le seuil de 2h&lt;/strong&gt; à moindre coût, 2 axes d’optimisations ont été étudiés : diminuer le temps d’exécution par Oracle et diminuer le temps de traitement.&lt;/p&gt;
&lt;h2 id="solutions-étudiées"&gt;Solutions étudiées&lt;/h2&gt;
&lt;p&gt;Les optimisations d’un DBA consistant à utiliser des &lt;strong&gt;tables temporaires&lt;/strong&gt; et des &lt;strong&gt;procédures stockées&lt;/strong&gt; n’ont pas été concluantes : trop peu de gains (10 à 20%) pour une réécriture partielle de notre batch, et avec le risque d’engendrer des régressions.&lt;/p&gt;
&lt;p&gt;Après mesures et calculs, l’utilisation de la &lt;strong&gt;pagination&lt;/strong&gt; sur des plages de 100, de 1 000 ou même de 10 000 enregistrements a également été écartée. Dans notre contexte, cela aurait dégradé les performances. Le choix de rester sur l’utilisation d’un &lt;strong&gt;curseur JDBC&lt;/strong&gt; a été maintenu.&lt;br&gt;A cette occasion, nous avons remarqué que les temps de mise en place d’un curseur Oracle pour préparer 1 millions ou 10 millions d’enregistrements étaient du même ordre de grandeur.&lt;/p&gt;
&lt;p&gt;Utilisant déjà l’une des techniques proposées par Spring Batch pour paralléliser notre traitement batch, pourquoi ne pas refaire appel à ses loyaux services ?&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Modèle physique de données des tables MASTERPIECE, MUSIC_ALBUM et MOVIE"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/11/Parall%C3%A9lisationTraitementsBatch_MPD.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Enterprise Spring Integration Certification Mock Exam</title><link>https://javaetmoi.com/2012/10/enterprise-spring-integration-certification-mock-exam/</link><pubDate>Sat, 27 Oct 2012 17:29:57 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=324</guid><description>&lt;p&gt;Last month, I passed the &lt;a href="http://mylearn.vmware.com/mgrReg/plan.cfm?plan=31113&amp;amp;ui=www_cert"&gt;Enterprise Integration with Spring&lt;/a&gt; exam (EIwS 1.x) with a score of 90%. This test is also known as Certified Enterprise Integration Specialist exam. Before passing this exam, you have to attend &lt;a href="http://mylearn.vmware.com/mgrreg/courses.cfm?ui=www_edu&amp;amp;a=one&amp;amp;id_subject=17833"&gt;Enterprise Integration with Spring training&lt;/a&gt; from SpringSource or a Certified Partner.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/09/CertifiedSpring_EnterpriseIntegrationSpecialist.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;In my last blog entry, I have published a &lt;a href="http://javaetmoi.com/2012/09/certified-spring-enterprise-integration-specialist-study-notes/"&gt;french study guide / notes&lt;/a&gt; to the exam. Since, I received a few emails asking me some materials in English.&lt;/p&gt;
&lt;p&gt;Opposed to the Spring Core Certification, I didn’t find any mock exams for the . So I decided to create a mock exam like I did in my &lt;a href="http://javaetmoi.com/2012/02/core-spring-3-0-certification-mock-exam/"&gt;Core Spring 3.0 Certification Mock Exam blog entry&lt;/a&gt;. The questions are close to the real Enterprise Integration with Spring exam and I hope will help you in practicing for the test or to test your Spring Integration proficiently. I have tried to keep my exam accurate, based on my real exam-experience.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Enterprise Spring Integration Certification Mock Exam"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/09/CertifiedSpring_EnterpriseIntegrationSpecialist.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Certified Spring Enterprise Integration Specialist Study Notes</title><link>https://javaetmoi.com/2012/09/certified-spring-enterprise-integration-specialist-study-notes/</link><pubDate>Sat, 29 Sep 2012 11:18:22 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=230</guid><description>&lt;p&gt;En l’espace de 8 mois, me voici doté d’une deuxième certification Spring. Après la certification Spring Core dont je vous ai fait écho dans mon tout &lt;a href="http://javaetmoi.com/2012/02/core-spring-3-0-certification-mock-exam/" title="Core Spring 3.0 Certification Mock Exam"&gt;premier billet&lt;/a&gt;, j’ai eu l’opportunité de préparer la certification Spring Integration Specialist.&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2012/09/CertifiedSpring_EnterpriseIntegrationSpecialist.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/09/CertifiedSpring_EnterpriseIntegrationSpecialist.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Comme à l’accoutumée avec les certifications Spring, la &lt;a href="http://www.zenika.com/formation_enterprise_integration_avec_spring.html" title="Formation Enterprise Integration avec Spring"&gt;formation officielle Spring Enterprise Integration&lt;/a&gt; est pré-requise. Elaborée par SpringSource et dispensée par Zenika, cette formation couvre de nombreux sujets basés sur Spring Framework 3 et différents projets du Portfolio Spring :&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Certified Spring Enterprise Integration Specialist Study Notes"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/09/CertifiedSpring_EnterpriseIntegrationSpecialist.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Délimiteurs de filtre maven sur plusieurs caractères</title><link>https://javaetmoi.com/2012/07/delimiteurs-de-filtre-maven-sur-plusieurs-caracteres/</link><pubDate>Sun, 22 Jul 2012 16:24:28 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=205</guid><description>&lt;h2 id="contexte"&gt;Contexte&lt;/h2&gt;
&lt;p&gt;Chez mon client, les &lt;strong&gt;fichiers de configuration&lt;/strong&gt; sont &lt;strong&gt;variabilisés&lt;/strong&gt; (ex : fichiers de configuration logback, hosts des différents référentiels et back office, paramétrage applicatif, configuration ehcache …). Cette technique permet d’avoir le &lt;strong&gt;même gabarit quel que soit l’environnement&lt;/strong&gt; sur lequel est déployée l’application (ex : intégration, recette, production). Charge à l’outil de déploiement de générer le fichier de configuration final à partir du gabarit et du fichier de variables spécifiques à l’environnement cible sur lequel le déploiement s’effectue.&lt;/p&gt;
&lt;p&gt;Peu souple, l’ &lt;strong&gt;outil de déploiement délimite&lt;/strong&gt; les variables du gabarit par un &lt;strong&gt;double caractère @&lt;/strong&gt; qu’il n’est pas possible de redéfinir. Exemple : @@PROJECT_LOG_DIRECTORY@@
En développement, sur un environnement Windows, la variable PROJECT_LOG_DIRECTORY peut prendre par exemple la valeur c:\temp\log\myapp alors qu’en production, sur un serveur Linux, elle aura la valeur /app/log/myapp&lt;/p&gt;
&lt;p&gt;Comme vous pouvez vous en douter, l’outil de déploiement n’est pas utilisé en développement pour déployer son application depuis Eclipse. Cependant, les gabarits des fichiers de configuration sont réutilisés (et donc testés). Utilisé pour les tâches de build, c’est tout naturellement &lt;strong&gt;maven&lt;/strong&gt; qui a la responsabilité de substituer les variables par leurs valeurs. Le répertoire contenant les fichiers de configuration générés est ajouté au classpath de l’application.&lt;/p&gt;
&lt;h2 id="le-maven-resources-plugin-en-action"&gt;Le maven resources plugin en action&lt;/h2&gt;
&lt;p&gt;Nativement, maven est capable de filtrer des ressources. La &lt;strong&gt;balise &lt;em&gt;&lt;resources&gt;&lt;/em&gt;&lt;/strong&gt; spécifiée dans la XSD 4.0.0 de maven permet de déclarer une liste de répertoire contenant les ressources (dont les fichiers de configuration font parties). La &lt;strong&gt;balise &lt;filters&gt;&lt;/strong&gt; permet quant à elle de lister les fichiers filtres qui seront utilisés pendant la phase &lt;em&gt;process-resources&lt;/em&gt; de maven, cette dernière étant chargée de copier et filtrer les fichiers de ressources vers le répertoire cible.&lt;/p&gt;
&lt;p&gt;En interne, ce mécanisme repose sur le plugin &lt;a href="http://maven.apache.org/plugins/maven-resources-plugin/"&gt;maven-resources-plugin&lt;/a&gt;. Deux délimiteurs sont positionnés par défaut :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xhtml" data-lang="xhtml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;delimiters&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;delimiter&lt;/span&gt;&amp;gt;${*}&amp;lt;/&lt;span style="color:#f92672"&gt;delimiter&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;delimiter&lt;/span&gt;&amp;gt;@&amp;lt;/&lt;span style="color:#f92672"&gt;delimiter&lt;/span&gt;&amp;gt; &lt;span style="color:#75715e"&gt;&amp;lt;!-- equivalent à @*@ --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;delimiters&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Depuis la version 2.4 du plugin, il est possible de redéfinir les délimiteurs. La syntaxe à utiliser est la suivante : &lt;strong&gt;&lt;em&gt;&amp;lsquo;beginToken*endToken&amp;rsquo;&lt;/em&gt;&lt;/strong&gt;. Lorsque les tokens de début et de fin sont identiques, la syntaxe est simplifiée : &lt;em&gt;&amp;rsquo;token&amp;rsquo;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Certain d’être sur la bonne piste, j’ai tenté de redéfinir le délimiteur pour coller à mon besoin. Hélas, la déclaration d’un délimiteur @@*@@ ne fonctionne pas. Le plugin semble limité à la définition d’un seul caractère pour le token de fin.&lt;/p&gt;
&lt;p&gt;Qu’à cela ne tienne, un svn checkout &lt;a href="http://svn.apache.org/viewvc/maven/shared/tags/maven-filtering-1.0"&gt;http://svn.apache.org/viewvc/maven/shared/tags/maven-filtering-1.0&lt;/a&gt; et me voilà rapidement entrainé dans les méandres de la classe &lt;em&gt;org.apache.maven.shared.filtering.MultiDelimiterInterpolatorFilterReaderLineEnding&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Si j’avais eu plus de temps devant moi, j’aurais pu tenter d’améliorer son fonctionnement, voire proposer un patch à la communauté. Seulement, il m’aurait été difficile de déployer une version de maven patchée sur l’ensemble des postes de développement et encore moins sur la plateforme d’intégration continue. Il me fallait une solution plus facile à mettre en œuvre et bien plus rapide à déployer.&lt;/p&gt;
&lt;h2 id="le-plugin-maven-replacer-à-la-rescousse"&gt;Le plugin maven replacer à la rescousse&lt;/h2&gt;
&lt;p&gt;Changeons de stratégie : au lieu de demander au &lt;a href="http://maven.apache.org/plugins/maven-resources-plugin/"&gt;maven-resources-plugin&lt;/a&gt; d’accepter le délimiteur @@, autant lui fournir directement un fichier qu’il saura nativement consommer avec un simple @ pour délimiteur.
C’est dans ces moments que l’on est heureux d’utiliser un outil ayant un écosystème aussi riche. L’opération recherchée est précisément la fonction du &lt;a href="http://code.google.com/p/maven-replacer-plugin/"&gt;maven-replacer-plugin&lt;/a&gt; hébergé sur Google Code.&lt;/p&gt;
&lt;p&gt;Afin d’être exécuté avant l’opération de filtrage, le goal replace du &lt;a href="http://code.google.com/p/maven-replacer-plugin/"&gt;maven-replacer-plugin&lt;/a&gt; est associé à la phase &lt;em&gt;generate-resources&lt;/em&gt; de maven. Le plugin est configuré pour substituer les caractères @@ en @. Les fichiers sont générés dans le répertoire target/generated-resources. Ce dernier sera utilisé en entrée du &lt;a href="http://maven.apache.org/plugins/maven-resources-plugin/"&gt;maven-resources-plugin&lt;/a&gt; pour filtrer et copier les ressources dans le répertoire target/classes lors de la phase &lt;em&gt;process-resources&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Voici un exemple concret de configuration maven :&lt;/p&gt;
&lt;h2 id="contexte-1"&gt;Contexte&lt;/h2&gt;
&lt;p&gt;Chez mon client, les &lt;strong&gt;fichiers de configuration&lt;/strong&gt; sont &lt;strong&gt;variabilisés&lt;/strong&gt; (ex : fichiers de configuration logback, hosts des différents référentiels et back office, paramétrage applicatif, configuration ehcache …). Cette technique permet d’avoir le &lt;strong&gt;même gabarit quel que soit l’environnement&lt;/strong&gt; sur lequel est déployée l’application (ex : intégration, recette, production). Charge à l’outil de déploiement de générer le fichier de configuration final à partir du gabarit et du fichier de variables spécifiques à l’environnement cible sur lequel le déploiement s’effectue.&lt;/p&gt;</description></item><item><title>Spring Batch s'auto-nettoie</title><link>https://javaetmoi.com/2012/06/sprint-batch-sauto-nettoie/</link><pubDate>Tue, 26 Jun 2012 18:49:09 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=187</guid><description>&lt;p&gt;Lorsque vous mettez en œuvre &lt;strong&gt;&lt;a href="http://static.springsource.org/spring-batch/" title="Page d&amp;#39;accueil du projet Spring Batch"&gt;Spring Batch&lt;/a&gt;&lt;/strong&gt; pour réaliser des traitements par lots, vous avez le choix d’utiliser &lt;strong&gt;une implémentation de &lt;em&gt;JobRepository&lt;/em&gt;&lt;/strong&gt; soit &lt;strong&gt;en mémoire&lt;/strong&gt; soit &lt;strong&gt;persistante&lt;/strong&gt;. L’avantage de cette dernière est triple :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Conserver un &lt;strong&gt;historique des différentes exécutions&lt;/strong&gt; de vos instances de jobs.&lt;/li&gt;
&lt;li&gt;Pouvoir &lt;strong&gt;suivre en temps réel le déroulement de votre batch&lt;/strong&gt; via, par exemple, l’excellent &lt;a href="http://static.springsource.org/spring-batch-admin/" title="Page d&amp;#39;accueil du projet Spring Batch Admin"&gt;Spring Batch Admin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Avoir la possibilité de &lt;strong&gt;reprendre un batch&lt;/strong&gt; là où il s’était arrêté en erreur.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;La contrepartie d’utiliser un JobRepository persistant est de devoir faire reposer le batch sur une &lt;strong&gt;base de données&lt;/strong&gt; relationnelles. Le schéma sur lequel s’appuie Spring Bath est composé de &lt;strong&gt;6 tables&lt;/strong&gt;. Leur MPD est disponible dans l’ &lt;a href="http://static.springsource.org/spring-batch/reference/html/metaDataSchema.html" title="Appendix B. Spring Batch Meta-Data Schema"&gt;annexe B. Meta-Data Schema&lt;/a&gt; du &lt;a href="http://static.springsource.org/spring-batch/reference/html/" title="Manuel de référence de Spring Batch au format HTML"&gt;manuel de référence de Spring Batch&lt;/a&gt;. SpringSource faisant bien les choses, les scripts DDL de différentes solutions du marché (ex : MySQL, Oracle, DB2, SQL Server, Postgres, H2 …) sont disponibles dans le package org.springframework.batch.core du JAR spring-batch-core-xxx.jar&lt;br&gt;Qui dit base de données, dit &lt;strong&gt;dimensionnement&lt;/strong&gt; de cette dernière. L’ &lt;strong&gt;espace disque requis&lt;/strong&gt; est alors &lt;strong&gt;fonction&lt;/strong&gt; du &lt;strong&gt;nombre d’exécutions&lt;/strong&gt; estimé, de la &lt;strong&gt;nature des informations contextuelles persistées&lt;/strong&gt; et de la &lt;strong&gt;durée de rétention&lt;/strong&gt; des données. Cette démarche prend tout son sens lorsqu’une instance de base de données est dédiée au schéma de Spring Batch. En faisant quelques hypothèses (ex : sur le taux d’échec) et en mesurant le volume occupé sur plusieurs exécutions des batchs, il est possible de prévoir assez finement l’espace occupé par les données.&lt;/p&gt;
&lt;p&gt;A moins de disposer de ressources infinies ou de n’avoir qu’un seul batch annuel, il est fréquent de fixer une durée de rétention de l’historique. Première option : demander à l’équipe d’exploitation de régulièrement lancer un script SQL de purge. Deuxième option : &lt;strong&gt;utiliser Spring Batch pour purger ses propres données&lt;/strong&gt; !!&lt;/p&gt;</description></item><item><title>Générer des tests JMeter à partir de Selenium</title><link>https://javaetmoi.com/2012/05/generer-tests-jmeter-selenium/</link><pubDate>Sat, 26 May 2012 18:51:06 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=166</guid><description>&lt;p&gt;Chez mon client, des &lt;strong&gt;tests de stress&lt;/strong&gt; sont réalisés sur toute nouvelle version d’une application. Outre le fait de &lt;strong&gt;qualifier techniquement&lt;/strong&gt; l’environnement de pré-production, ces tirs permettent de &lt;strong&gt;détecter toute&lt;/strong&gt; &lt;strong&gt;dégradation&lt;/strong&gt; des performances et de &lt;strong&gt;prévenir toute montée en charge&lt;/strong&gt; induite, par exemple, par une nouvelle fonctionnalité. Plus encore, ils permettent de mesurer les gains apportés par d’éventuelles optimisations. Ces tests de stress sont réalisés à l’aide de l’outil &lt;a href="http://jmeter.apache.org/"&gt;Apache JMeter&lt;/a&gt; [1].&lt;/p&gt;
&lt;p&gt;Afin de pouvoir &lt;strong&gt;comparer des mesures&lt;/strong&gt;, les cas fonctionnels utilisés lors des tests doivent, dans la mesure du possible, être identiques aux précédents tirs, sachant que ces derniers peuvent dater de plusieurs mois. Entre temps, nombre d’évolutions ont été susceptibles de casser vos tests JMeter. A priori, vous avez donc 2 choix : soit vous les réécrivez, soit vous les maintenez à jour. Si vous en avez déjà écrit, vous vous doutez bien que maintenir dans la durée des tests JMeter a un cout non négligeable. Une 3ième solution présentée ici consiste à la générer !&lt;/p&gt;
&lt;p&gt;J’ai la chance de travailler dans une équipe ou l’outil &lt;a href="https://selenium.dev/"&gt;Selenium&lt;/a&gt; [2] de tests IHM est rentré dans les mœurs. L’automatisation de leur exécution y joue un rôle indéniable. Notre hiérarchie s’est fortement impliquée ; elle a investi de l’énergie et du budget. Un DSL a été mis au point pour faciliter leur écriture et leur maintenance. Alors quand on peut les rentabiliser encore davantage, autant le faire. J’ai donc proposé de ne maintenir que les tests Selenium et de &lt;strong&gt;générer les tests JMeter à partir de tests Selenium&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Cet article a pour objectif de vous présenter la démarche adoptée. Si vous êtes intéressés, vous pourrez librement l’adapter en fonction de votre contexte projet.&lt;/p&gt;
&lt;h2 id="les-outils-à-disposition"&gt;Les outils à disposition&lt;/h2&gt;
&lt;h3 id="serveur-proxy-http-de-jmeter"&gt;Serveur Proxy HTTP de JMeter&lt;/h3&gt;
&lt;p&gt;Le client lourd JMeter offre la possibilité d&amp;rsquo; &lt;strong&gt;enregistrer toutes les requêtes HTTP&lt;/strong&gt; transitant entre le navigateur et l’application web à tester. Techniquement, il utilise le mécanisme de &lt;strong&gt;proxy HTTP&lt;/strong&gt;. Le navigateur est configuré pour utiliser le Serveur Proxy HTTP créé dans le Plan de Travail JMeter. Couplé à un &lt;strong&gt;Contrôleur Enregistreur&lt;/strong&gt;, le proxy enregistre les appels avant de les router vers le serveur d’application cible.&lt;/p&gt;
&lt;p&gt;Le tutoriel &lt;a href="http://jakarta.apache.org/jmeter/usermanual/jmeter_proxy_step_by_step.pdf"&gt;Proxy step by step&lt;/a&gt; [3] proposé sur le site de JMeter fournit toutes les étapes nécessaires pour configuration JMeter.&lt;/p&gt;
&lt;h3 id="du-code-source"&gt;Du code source&lt;/h3&gt;
&lt;p&gt;Le fichier .jmx généré lors de l’enregistrement va devoir être manipulé en Java (bien oui, vous êtes sur le blog d’un développeur java). Premier soulagement : il est au format XML et peut donc être aisément parsé une fois son schéma appréhendé. Mails là où il est intéressant d’avoir opté pour un outil open source, c’est que nous allons pouvoir utiliser son API Java pour manipuler les fichiers .jmx de description de plan de tests. Et pour mieux cerner l’API, l’accès au code source est précieux.&lt;/p&gt;
&lt;p&gt;Lors de la mise au point du générateur, les artefacts maven de la version 2.5.1 n’étaient pas disponibles sur le repo central maven, chose révolue depuis la version 2.6. JMeter est découpé en plusieurs modules. Dans le cadre du générateur, les modules Core, HTTP set Components ont été nécessaires. Sans oublier &lt;strong&gt;jorphan&lt;/strong&gt;, dont le package &lt;em&gt;collections&lt;/em&gt; offre toutes les API nécessaires pour naviguer dans l’arbre du Plan de Tests.&lt;/p&gt;
&lt;p&gt;Par transitivité, il est possible de récupérer tous les artefacts nécessaires en déclarant les dépendances maven suivantes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xhtml" data-lang="xhtml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;dependency&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;groupId&lt;/span&gt;&amp;gt;org.apache.jmeter&amp;lt;/&lt;span style="color:#f92672"&gt;groupId&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;artifactId&lt;/span&gt;&amp;gt;ApacheJMeter_http&amp;lt;/&lt;span style="color:#f92672"&gt;artifactId&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;&amp;gt;2.6&amp;lt;/&lt;span style="color:#f92672"&gt;version&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;dependency&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;dependency&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;groupId&lt;/span&gt;&amp;gt;org.apache.jmeter&amp;lt;/&lt;span style="color:#f92672"&gt;groupId&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;artifactId&lt;/span&gt;&amp;gt;jorphan&amp;lt;/&lt;span style="color:#f92672"&gt;artifactId&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;&amp;gt;2.6&amp;lt;/&lt;span style="color:#f92672"&gt;version&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;dependency&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="mise-en-œuvre"&gt;Mise en œuvre&lt;/h2&gt;
&lt;p&gt;Afin de pouvoir être rejoué, &lt;strong&gt;un scénario de test Selenium enregistré à l’état brut&lt;/strong&gt; par le proxy JMeter &lt;strong&gt;doit être épuré&lt;/strong&gt;, &lt;strong&gt;retravaillé&lt;/strong&gt; et &lt;strong&gt;variabilisé&lt;/strong&gt;. C’est d’ailleurs toute la plus-value apportée par le générateur.&lt;/p&gt;
&lt;h3 id="template-de-test"&gt;Template de test&lt;/h3&gt;
&lt;p&gt;Une première étape consiste à insérer le contenu du « fichier brut » (c’est-à-dire tous les éléments de tests enregistrés sous le &lt;em&gt;Contrôleur Enregistreur&lt;/em&gt;) dans ce que j’appellerai un &lt;strong&gt;template de test&lt;/strong&gt;.
Réutilisable, ce template contient toutes les caractéristiques d’un test de stress type. Voici quelques-unes de ses composantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Contrôleur de Transaction&lt;/em&gt; dans lequel insérer par programmation tous les éléments de tests enregistrés&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Variables pré-définies&lt;/em&gt; : host et port de l’environnement à tester, délai de réflexion, durée maximum attendue de chargement d’une page&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Gestionnaire d’entêtes HTTP&lt;/em&gt;, par exemple avec le user-agent d’IE 8 si ce dernier est cible&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Gestionnaires de Cookies&lt;/em&gt; http&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Gestionnaire de&lt;/em&gt; &lt;em&gt;Cache HTTP&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Chargement des comptes utilisateurs (par exemple à partir d’un fichier CSV)&lt;/li&gt;
&lt;li&gt;Logique du test de stress, par exemple à l’aide d’un &lt;em&gt;Groupes d’Unités&lt;/em&gt; configuré pour un test aux limites&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Compteur de temps fixe&lt;/em&gt; pour simuler le « Think Time » des utilisateurs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="traitement-des-données-brutes"&gt;Traitement des données brutes&lt;/h3&gt;
&lt;p&gt;La seconde étape consiste à implémenter les « &lt;strong&gt;processeurs&lt;/strong&gt; » chargés de traiter les éléments de tests enregistrés par le proxy JMeter.
A titre d’exemples, voici les traitements effectués par le générateur mis en œuvre dans le cadre d’une application JSF / RichFaces :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Variabilise le paramètre javax.faces.ViewState renvoyé dans les pages JSF&lt;/li&gt;
&lt;li&gt;Retire le nom et l&amp;rsquo;adresse IP du serveur web de chaque requête HTTP&lt;/li&gt;
&lt;li&gt;Supprime toutes les URL contenant des ressources vers selenium-server (ex:&lt;/li&gt;
&lt;li&gt;http://localhost:3333/selenium-server/core/selenium.css)&lt;/li&gt;
&lt;li&gt;Variabilise les paramètres d’authentification SSO&lt;/li&gt;
&lt;li&gt;Supprime tous les gestionnaires d&amp;rsquo;en-tête HTTP enregistrés par le proxy JMeter afin d’utiliser le gestionnaire global déclaré dans le template de test&lt;/li&gt;
&lt;li&gt;Regroupe tous les appels vers la même page JSF dans même un sous-contrôleur de transaction&lt;/li&gt;
&lt;li&gt;Supprime tous les appels vers des sites externes (ex : Google Analytics)&lt;/li&gt;
&lt;li&gt;Améliore la lisibilité des éléments de tests en les renommant&lt;/li&gt;
&lt;li&gt;Ajoute une assertion sur le temps d&amp;rsquo;exécution d&amp;rsquo;une requête&lt;/li&gt;
&lt;li&gt;Ajoute une assertion faisant échouer le test JMeter lorsque l&amp;rsquo;utilisateur est redirigé sur une page d&amp;rsquo;erreur technique de l’application&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Afin d’illustrer cet article et de le rendre plus concret, voici un exemple de processeur :&lt;/p&gt;
&lt;p&gt;Chez mon client, des &lt;strong&gt;tests de stress&lt;/strong&gt; sont réalisés sur toute nouvelle version d’une application. Outre le fait de &lt;strong&gt;qualifier techniquement&lt;/strong&gt; l’environnement de pré-production, ces tirs permettent de &lt;strong&gt;détecter toute&lt;/strong&gt; &lt;strong&gt;dégradation&lt;/strong&gt; des performances et de &lt;strong&gt;prévenir toute montée en charge&lt;/strong&gt; induite, par exemple, par une nouvelle fonctionnalité. Plus encore, ils permettent de mesurer les gains apportés par d’éventuelles optimisations. Ces tests de stress sont réalisés à l’aide de l’outil &lt;a href="http://jmeter.apache.org/"&gt;Apache JMeter&lt;/a&gt; [1].&lt;/p&gt;
&lt;p&gt;Afin de pouvoir &lt;strong&gt;comparer des mesures&lt;/strong&gt;, les cas fonctionnels utilisés lors des tests doivent, dans la mesure du possible, être identiques aux précédents tirs, sachant que ces derniers peuvent dater de plusieurs mois. Entre temps, nombre d’évolutions ont été susceptibles de casser vos tests JMeter. A priori, vous avez donc 2 choix : soit vous les réécrivez, soit vous les maintenez à jour. Si vous en avez déjà écrit, vous vous doutez bien que maintenir dans la durée des tests JMeter a un cout non négligeable. Une 3ième solution présentée ici consiste à la générer !&lt;/p&gt;
&lt;p&gt;J’ai la chance de travailler dans une équipe ou l’outil &lt;a href="https://selenium.dev/"&gt;Selenium&lt;/a&gt; [2] de tests IHM est rentré dans les mœurs. L’automatisation de leur exécution y joue un rôle indéniable. Notre hiérarchie s’est fortement impliquée ; elle a investi de l’énergie et du budget. Un DSL a été mis au point pour faciliter leur écriture et leur maintenance. Alors quand on peut les rentabiliser encore davantage, autant le faire. J’ai donc proposé de ne maintenir que les tests Selenium et de &lt;strong&gt;générer les tests JMeter à partir de tests Selenium&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Cet article a pour objectif de vous présenter la démarche adoptée. Si vous êtes intéressés, vous pourrez librement l’adapter en fonction de votre contexte projet.&lt;/p&gt;</description></item><item><title>Initiation à Google App Engine</title><link>https://javaetmoi.com/2012/04/devoxx-initiation-google-app-engine/</link><pubDate>Fri, 20 Apr 2012 20:17:10 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=148</guid><description>&lt;p&gt;Au cours de la première matinée de &lt;strong&gt;Devoxx France&lt;/strong&gt;, j’ai pu assister à un &lt;strong&gt;Lands-on-Lab&lt;/strong&gt; permettant de &lt;strong&gt;s’initier au SDK&lt;/strong&gt; et à la plateforme &lt;strong&gt;Google App Engine&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Nommé « &lt;a href="http://www.devoxx.com/pages/viewpage.action?pageId=6128177"&gt;Le Président est …&lt;/a&gt;» [1], ce code labs fut co-animé par &lt;a href="http://www.devoxx.com/display/FR12/Didier&amp;#43;Girard"&gt;Didier Girard&lt;/a&gt; (SFEIR), &lt;a href="http://www.devoxx.com/display/FR12/Ludovic&amp;#43;Champenois"&gt;Ludovic Champenois&lt;/a&gt; (Google), &lt;a href="http://www.devoxx.com/display/FR12/Martin&amp;#43;Gorner"&gt;Martin Görner&lt;/a&gt; (Google) et &lt;a href="https://twitter.com/#!/patoudss"&gt;Patrice de Saint Steban&lt;/a&gt; (SFEIR). Il consistait à développer en 3h un site web visant à annoncer au soir du 6 mai 2012 le nom du nouveau Président. Une seule contrainte : accueillir un trafic potentiel de 50 millions d’utilisateurs et pouvoir tenir &lt;strong&gt;un pic de charge de 2 millions d’utilisateurs&lt;/strong&gt; aux alentours de 20h. En guise d’exemple, une &lt;a href="http://electionfr2012.appspot.com/"&gt;application démo&lt;/a&gt; [2] était déjà disponible en ligne.&lt;/p&gt;
&lt;p&gt;D’actualités et évoquant des chiffres qui exciteraient tout architecte, ce code labs fut la parfaite occasion de m’initier à Google App Engine. Au cours de ce billet, je vous relaterai ce que j’y ai appris et vous donnerai accès au code source que vous pourrez à votre tour déployer sur le PaaS de Google.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Hands-on-Lab Le Président est &amp;amp;amp;hellip; de Devoxx France 2012"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/04/2012-04-18-11.56.37.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Release Maven sous Windows d’un projet GitHub déployé sur CloudBees</title><link>https://javaetmoi.com/2012/04/release-maven-windows-github-deploy-cloudbees/</link><pubDate>Thu, 12 Apr 2012 19:42:24 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=81</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2012/04/logo_github.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo_github"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/04/logo_github.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Habitué aux releases maven avec SVN, j’ai rencontré quelques difficultés pour effectuer la première release du projet &lt;a href="https://github.com/arey/hibernate-hydrate"&gt;Hibernate Hydrate&lt;/a&gt; [1] hébergé sur GitHub et présenté dans un &lt;a href="http://javaetmoi.com/2012/03/hibernate-dites-adieu-aux-lazy-initialization-exception/"&gt;précédent billet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour rappel, lors d’une release, le plugin maven accède au gestionnaire de code source pour commiter les modifications effectuées sur les pom.xml et créer un tag. Il déploie ensuite les artefacts sur le repo maven distant.&lt;/p&gt;
&lt;p&gt;Mes contraintess techniques étaient les suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Plateforme de développement : &lt;strong&gt;Windows&lt;/strong&gt; 7, JDK 6, &lt;strong&gt;mSysGit&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Code source Java &lt;strong&gt;mavenisé&lt;/strong&gt; et hébergé sur &lt;strong&gt;GitHub&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Le repo maven sur lequel déployer les artefacts maven est hébergé par &lt;strong&gt;CloudBees&lt;/strong&gt; et accessible par le protocople &lt;a href="http://fr.wikipedia.org/wiki/WebDAV"&gt;Webdav&lt;/a&gt; [2]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les réponses apportées par ce billet sont :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Configuration maven pour GitHub&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problème de passphrase SSH spécifique à Windows&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;**Configuration maven du repo CloudBees&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo_github"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/04/logo_github.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Dites adieu aux LazyInitializationException</title><link>https://javaetmoi.com/2012/03/hibernate-dites-adieu-aux-lazy-initialization-exception/</link><pubDate>Fri, 30 Mar 2012 20:39:43 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=54</guid><description>Dans ce deuxième ticket, j’aimerais vous parler du projet &lt;a href="https://github.com/arey/hibernate-hydrate"&gt;&lt;strong&gt;Hibernate Hydrate&lt;/strong&gt;&lt;/a&gt; [1] que j’ai récemment publié sur GitHub. Au cœur de ce projet : une seule classe Java proposant &lt;strong&gt;une unique fonctionnalité&lt;/strong&gt;. En quelques années, c’est la seconde fois que j’ai eu besoin de coder ce genre de fonctionnalité. Aussi, je me suis dit qu’il serait pratique de l’avoir sous le coude pour une prochaine fois et, au passage, vous en faire profiter.</description></item><item><title>Core Spring 3.0 Certification Mock Exam</title><link>https://javaetmoi.com/2012/02/core-spring-3-0-certification-mock-exam/</link><pubDate>Sun, 26 Feb 2012 16:22:40 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=18</guid><description>&lt;p&gt;Le &lt;strong&gt;framework Spring&lt;/strong&gt; est à l’honneur dans le premier article de ce tout jeune blog. En effet, début février j’ai eu l’opportunité de passer la &lt;strong&gt;&lt;a href="http://www.springsource.com/training/certification/springprofessional" title="SpringSource Certified Spring Professionnal"&gt;Certification Core Spring 3.0&lt;/a&gt;&lt;/strong&gt;. Et par ce billet, je tenais faire part de mon &lt;strong&gt;retour d’expérience&lt;/strong&gt; mais surtout vous offrir librement un &lt;strong&gt;examen blanc&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Comme pré-requis pour passer la certification, sachez tout d’abord qu’il est nécessaire de suivre la &lt;strong&gt;formation officielle de 4 jours&lt;/strong&gt; estampillée SpringSource. En France, elle est exclusivement assurée par le cabinet d’architecture Zenika. Mon formateur fut l’un de co-auteurs du très bon livre Spring par la Pratique.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Core Spring 3.0 Certification Mock Exam"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/02/CertitfiedSpring_Professional.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item></channel></rss>