<?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>Maven on Java &amp; Moi</title><link>https://javaetmoi.com/categories/maven/</link><description>Recent content in Maven on Java &amp; Moi</description><generator>Hugo</generator><language>fr</language><lastBuildDate>Sat, 05 Jul 2025 17:06:00 +0000</lastBuildDate><atom:link href="https://javaetmoi.com/categories/maven/feed.xml" rel="self" type="application/rss+xml"/><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>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>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>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>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>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>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>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>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>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></channel></rss>