<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hoani CROSS</title>
    <description>The latest articles on DEV Community by Hoani CROSS (@hcross).</description>
    <link>https://dev.to/hcross</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1020623%2F7ccb669e-77b7-4be1-8c78-c1493b5fabd6.jpeg</url>
      <title>DEV Community: Hoani CROSS</title>
      <link>https://dev.to/hcross</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hcross"/>
    <language>en</language>
    <item>
      <title>Changer son environnement fullstack en un clin d'oeil : partie 2 avec Maven</title>
      <dc:creator>Hoani CROSS</dc:creator>
      <pubDate>Sun, 12 Feb 2023 23:16:44 +0000</pubDate>
      <link>https://dev.to/hcross/changer-son-environnement-fullstack-en-un-clin-doeil-partie-2-avec-maven-16k2</link>
      <guid>https://dev.to/hcross/changer-son-environnement-fullstack-en-un-clin-doeil-partie-2-avec-maven-16k2</guid>
      <description>&lt;p&gt;Vous êtes développeur consultant et vous travaillez pour plusieurs clients ? Vous travaillez aussi sur des projets Open Source ?&lt;/p&gt;

&lt;p&gt;Vous avez certainement été confronté au problème de changement de contexte lorsque vous devez passer d'un projet à un autre : changement de version de Java, de Node.js, de configuration Git ou de signature GnuPG...&lt;/p&gt;

&lt;p&gt;J'ai commencé une série d'articles sur ce sujet avec &lt;a href="https://dev.to/hcross/changer-son-environnement-fullstack-en-un-clin-doeil-partie-1-avec-java-3j50"&gt;un premier article au sujet du changement de version de Java&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Je continue ici cette série et j'aimerais aborder la capacité de Maven à changer de contexte de développement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ma façon préférée d'installer Maven
&lt;/h2&gt;

&lt;p&gt;Pour installer Maven, vous pouvez le faire de multiples façons... Passer par le gestionnaire de paquets de votre distribution Linux, utiliser &lt;a href="https://brew.sh"&gt;brew&lt;/a&gt; sur MacOS, utiliser &lt;a href="https://chocolatey.ort"&gt;Chocolatey&lt;/a&gt; sous Windows, voire &lt;a href="https://maven.apache.org/download.cgi"&gt;télécharger directement le Zip du projet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Me concernant, je préfère utiliser &lt;a href="https://dev.to/hcross/changer-son-environnement-fullstack-en-un-clin-doeil-partie-1-avec-java-3j50"&gt;l'outil dont je vous ai parlé dans mon premier article&lt;/a&gt; : &lt;a href="https://sdkman.io/"&gt;SDKMan&lt;/a&gt; !&lt;/p&gt;

&lt;p&gt;Avec SDKMan, pour installer Maven, rien de plus simple, il suffit de taper la commande suivante dans votre terminal :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~❯ sdk &lt;span class="nb"&gt;install &lt;/span&gt;maven
Downloading: maven 3.9.0
In progress...
&lt;span class="c"&gt;########################################################################## 100,0%&lt;/span&gt;
Installing: maven 3.9.0
Done installing!
Do you want maven 3.9.0 to be &lt;span class="nb"&gt;set &lt;/span&gt;as default? &lt;span class="o"&gt;(&lt;/span&gt;Y/n&lt;span class="o"&gt;)&lt;/span&gt;: 
Setting maven 3.9.0 as default.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Durant l'installation, SDKMan vous demandera si vous désirez définir la version de Maven téléchargée comme étant le version à utiliser par défaut. Vous pourrez répondre par l'affirmative en appuyant simplement sur la touche 'Entrée'.&lt;/p&gt;

&lt;p&gt;On pourra vérifier la bonne installation de Maven à l'aide de la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~❯ mvn &lt;span class="nt"&gt;-version&lt;/span&gt;
Apache Maven 3.9.0 &lt;span class="o"&gt;(&lt;/span&gt;9b58d2bad23a66be161c4664ef21ce219c2c8584&lt;span class="o"&gt;)&lt;/span&gt;
Maven home: /Users/hoanicross/.sdkman/candidates/maven/current
Java version: 19.0.2, vendor: Oracle Corporation, runtime: /Users/hoanicross/.sdkman/candidates/java/19.0.2-open
Default locale: fr_FR, platform encoding: UTF-8
OS name: &lt;span class="s2"&gt;"mac os x"&lt;/span&gt;, version: &lt;span class="s2"&gt;"13.2"&lt;/span&gt;, &lt;span class="nb"&gt;arch&lt;/span&gt;: &lt;span class="s2"&gt;"aarch64"&lt;/span&gt;, family: &lt;span class="s2"&gt;"mac"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comme vous pouvez le remarquer, j'utilise un Mac avec une puce ARM d'Apple 😊, en l'occurrence il s'agit d'un Macbook Air M2 !&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment Maven gère les environnements de développement
&lt;/h2&gt;

&lt;p&gt;Maven intègre en son sein un moyen assez efficace de gérer les différents environnements de développement avec les &lt;strong&gt;profils&lt;/strong&gt; !&lt;/p&gt;

&lt;p&gt;Il peuvent s'activer de diverses manières : présence d'une variable d'environnement, détection du type de l'OS ou encore présence d'un fichier...&lt;/p&gt;

&lt;p&gt;Cependant, en y regardant de plus près, on remarque que les profils ont surtout été créés pour gérer les différents environnements d'exécution (&lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;prod&lt;/code&gt; ou &lt;code&gt;preprod&lt;/code&gt; par exemple) mais pas vraiment les &lt;em&gt;environnements de développement&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Typiquement, ce qu'on va chercher à changer dans le fichier de configuration de Maven pour passer d'un contexte de développement à un autre, c'est :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;l'éventuel proxy utilisé dans votre mission&lt;/li&gt;
&lt;li&gt;l'éventuel mirroir utilisé dans votre mission&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ces deux parties sont configurables sous la forme d'un élément respectivement &lt;code&gt;&amp;lt;proxy&amp;gt;&lt;/code&gt; ou &lt;code&gt;&amp;lt;mirror&amp;gt;&lt;/code&gt; que l'on retrouvera dans des éléments &lt;code&gt;&amp;lt;proxies&amp;gt;&lt;/code&gt; ou &lt;code&gt;&amp;lt;mirrors&amp;gt;&lt;/code&gt; juste sous l'élément racine &lt;code&gt;&amp;lt;settings&amp;gt;&lt;/code&gt; du fichier &lt;code&gt;settings.xml&lt;/code&gt; de Maven.&lt;/p&gt;

&lt;p&gt;En l'occurrence, dans la mission où je travaille à l'heure où j'écris ces lignes, nous devons utiliser un référentiel interne mirroir de tous les référentiels Maven.&lt;/p&gt;

&lt;p&gt;Dans le fichier &lt;code&gt;settings.xml&lt;/code&gt;, cela se présente de la façon suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;settings&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://maven.apache.org/SETTINGS/1.0.0"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;xmlns:xsi=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span class="s"&gt;"http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          
    &lt;span class="c"&gt;&amp;lt;!-- Miroir pour la gestion des dépendances--&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;mirrors&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;mirror&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;nexus&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;mirrorOf&amp;gt;&lt;/span&gt;*&lt;span class="nt"&gt;&amp;lt;/mirrorOf&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://nexus.domaine-interne-de-mon-client.com/repo/maven/&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/mirror&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/mirrors&amp;gt;&lt;/span&gt;
    
&lt;span class="nt"&gt;&amp;lt;/settings&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dès qu'une dépendance doit être téléchargée de quelque référentiel Maven que ce soit, c'est le serveur Nexus de mon client qui sera interrogé via l'URL &lt;code&gt;https://nexus.domaine-interne-de-mon-client.com/repo/maven/&lt;/code&gt; qui n'est accessible &lt;strong&gt;QUE&lt;/strong&gt; lorsque le VPN est activé...&lt;/p&gt;

&lt;p&gt;Clairement, si je ne suis plus connecté au VPN du client et que je souhaite travailler sur un projet Java open source perso avec Maven, ça ne va plus marcher : les dépendances vont être téléchargées depuis le Nexus qui est indisponible (le VPN n'est pas monté) et la construction va échouer.&lt;/p&gt;

&lt;p&gt;Pour continuer à travailler sur ce projet, il me faudrait éditer le fichier &lt;code&gt;~/.m2/settings.xml&lt;/code&gt;, et mettre en commentaire le bloc &lt;code&gt;&amp;lt;mirrors&amp;gt;...&amp;lt;/mirrors&amp;gt;&lt;/code&gt; à chaque fois...&lt;/p&gt;

&lt;p&gt;Et la même opération devra être réalisée lorsque je devrais à nouveau travailler sur un projet de mon client.&lt;/p&gt;

&lt;p&gt;Une vraie purge ☹️&lt;/p&gt;

&lt;p&gt;Il me fallait donc &lt;strong&gt;absolument&lt;/strong&gt; trouver une solution pour que cette bascule se fasse automatiquement !&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment ChatGPT m'a mis sur la voie
&lt;/h2&gt;

&lt;p&gt;Dans cette quête de pouvoir obtenir mon mécanisme de changement de contexte de développement, je me suis dit que &lt;a href="https://chat.openai.com/"&gt;ChatGPT&lt;/a&gt; pouvait peut-être m'aider.&lt;/p&gt;

&lt;p&gt;Voici la requête que je lui ai soumis :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hello, I would like to activate the ability of maven settings to setup a local repository to be the mirror of all existing repository, especially the public ones, only when I am connected to their network. For all other situation, I want this mirroring property to be deactivated. Do you have a solution for my problem ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ici, je lui ai demandé de pouvoir activer automatiquement la notion de référentiel local en tant que mirroir de toutes les autres, seulement lorsque je suis connecté au réseau du client.&lt;/p&gt;

&lt;p&gt;Dans sa réponse, il fait justement référence à la notion de profil dont je vous ai parlé précédemment :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Yes, you can configure your Maven settings to mirror remote repositories when you are connected to a specific network, and to not mirror them when you are not connected to that network. To do this, you will need to create two separate profiles in your settings.xml file: one for the scenario where you are connected to the network, and one for when you are not.&lt;/p&gt;

&lt;p&gt;In the profile for when you are connected to the network, you can specify a mirror that points to the local repository, and include a &lt;code&gt;&amp;lt;mirrorOf&amp;gt;*&amp;lt;/mirrorOf&amp;gt;&lt;/code&gt; element to indicate that all remote repositories should be mirrored to the local repository.&lt;/p&gt;

&lt;p&gt;In the profile for when you are not connected to the network, you can remove the mirror from the profile, and instead include the remote repositories that you want to use directly in the &lt;code&gt;&amp;lt;repositories&amp;gt;&lt;/code&gt; element.&lt;/p&gt;

&lt;p&gt;You can use &lt;code&gt;&amp;lt;activeByDefault&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;activation&amp;gt;&lt;/code&gt; elements to specify which profile is active depending on your network state.&lt;/p&gt;

&lt;p&gt;It is important to note that, if you want to use this feature, you need to have a local repository already configured, and you should consider the amount of space that the repository will need.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ah mais c'est super ça 😃 ! Je vais donc pouvoir utiliser les profils pour activer ou non les mirroirs des référentiel Maven... Il fallait que j'en sache plus et j'ai donc demandé à ChatGPT :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can you provide me an example of a settings.xml maven file that implements those needs ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Et voici le fichier exemple qu'il m'a fournit :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;settings&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;mirrors&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;mirror&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;mirror-local-repo&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;mirrorOf&amp;gt;&lt;/span&gt;*&lt;span class="nt"&gt;&amp;lt;/mirrorOf&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;file:///path/to/local/repo&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/mirror&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/mirrors&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;profiles&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;profile&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;on-corporate-network&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;activation&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;property&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;onCorporateNetwork&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/activation&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;repositories&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;repository&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;central&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;http://central&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;releases&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;enabled&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/enabled&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;updatePolicy&amp;gt;&lt;/span&gt;always&lt;span class="nt"&gt;&amp;lt;/updatePolicy&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/releases&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/repository&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/repositories&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/profile&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;profile&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;off-corporate-network&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;activation&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;property&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;onCorporateNetwork&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;false&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/activation&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;repositories&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;repository&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;central&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;http://central&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;releases&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;enabled&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/enabled&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;updatePolicy&amp;gt;&lt;/span&gt;always&lt;span class="nt"&gt;&amp;lt;/updatePolicy&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/releases&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/repository&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;repository&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;other-repo&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;http://other-repo&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;releases&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;enabled&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/enabled&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;updatePolicy&amp;gt;&lt;/span&gt;always&lt;span class="nt"&gt;&amp;lt;/updatePolicy&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/releases&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/repository&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/repositories&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/profile&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/profiles&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/settings&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Euuuh 🧐 le bloc &lt;code&gt;&amp;lt;proxies&amp;gt;&lt;/code&gt; n'est pas inclus où même associé à la partie concernant les différents profils et je m'empresse d'en faire mention à ChatGTP :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;However, in the example you provided, the mirror functionnality will be activated for both profiles since it is not part of the definition of the &lt;code&gt;&amp;lt;profile&amp;gt;&lt;/code&gt; element. I really want the mirror to be deactivated when the &lt;code&gt;off-corporate-network&lt;/code&gt; is active.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Et admirez ce que ChatGPT me propose comme fichier &lt;code&gt;settings.xml&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;settings&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;profiles&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;profile&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;on-corporate-network&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;activation&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;property&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;onCorporateNetwork&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/activation&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;mirrors&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;mirror&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;mirror-local-repo&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;mirrorOf&amp;gt;&lt;/span&gt;*&lt;span class="nt"&gt;&amp;lt;/mirrorOf&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;file:///path/to/local/repo&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/mirror&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/mirrors&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;repositories&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;repository&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;central&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;http://central&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;releases&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;enabled&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/enabled&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;updatePolicy&amp;gt;&lt;/span&gt;always&lt;span class="nt"&gt;&amp;lt;/updatePolicy&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/releases&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/repository&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/repositories&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/profile&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;profile&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;off-corporate-network&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;activation&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;property&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;onCorporateNetwork&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;false&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/activation&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;repositories&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;repository&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;central&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;http://central&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;releases&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;enabled&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/enabled&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;updatePolicy&amp;gt;&lt;/span&gt;always&lt;span class="nt"&gt;&amp;lt;/updatePolicy&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/releases&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/repository&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;repository&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;other-repo&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;http://other-repo&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;releases&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;enabled&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/enabled&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;updatePolicy&amp;gt;&lt;/span&gt;always&lt;span class="nt"&gt;&amp;lt;/updatePolicy&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/releases&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/repository&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/repositories&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/profile&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/profiles&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/settings&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eh bien voilà !  C'était tellement simple... Mais je voulais quand même en avoir le coeur net car la documentation de Maven ne mentionne &lt;strong&gt;pas du tout cette possibilité&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Voici ce que j'ai dit à ChatGPT :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Reading the version 1.0.0 of the Maven settings XSD, the &lt;code&gt;&amp;lt;profile&amp;gt;&lt;/code&gt; element can only contain direct child elements of type &lt;code&gt;&amp;lt;id&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;activation&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;repositories&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;pluginRepositories&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;properties&amp;gt;&lt;/code&gt;. It cannot contain a &lt;code&gt;&amp;lt;mirrors&amp;gt;&lt;/code&gt; child element.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Et vous savez quoi ? Il a admi son erreur et il est revenu sur sa première proposition qui ne permettait pas de conditionner l'activation des mirroirs selon les profils... On se marche sur la tête 🤨&lt;/p&gt;

&lt;p&gt;C'est alors que je me suis dit que si le fonctionnement interne de Maven ne permettait pas d'activer ou non dynamiquement la notion de mirroir, il se pourrait qu'un outil externe puisse le faire à la place de Maven.&lt;/p&gt;

&lt;p&gt;J'ai commencé à rédiger ma requête pour ChatGPT quand je me suis dit : "je peux le faire moi-même, sans l'aide de ChatGPT".&lt;/p&gt;

&lt;p&gt;Ainsi, en me faisant tourner en bourrique, ChatGPT m'a ouvert sur une possibilité externe à Maven : jongler avec plusieurs fichiers de configuration !&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoir plusieurs fichiers de configuration
&lt;/h2&gt;

&lt;p&gt;Par défaut, Maven va chercher sa configuration dans :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;le fichier &lt;code&gt;pom.xml&lt;/code&gt; du projet courant&lt;/li&gt;
&lt;li&gt;le fichier &lt;code&gt;~/.m2/settings.xml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;le fichier &lt;code&gt;conf/settings.xml&lt;/code&gt; du répertoire d'installation de Maven&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cela ne laisse pas beaucoup de place pour insérer quelque chose...&lt;/p&gt;

&lt;p&gt;Si on tape &lt;code&gt;mvn --help&lt;/code&gt; dans un terminal, on peut lire cette option de maven :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; -s,--settings &amp;lt;arg&amp;gt;                    Alternate path for the user
                                        settings file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;C'est exactement ce dont j'avais besoin !&lt;/p&gt;

&lt;p&gt;Lorsque je travaille sur un projet d'un client, on va dire &lt;em&gt;lambda&lt;/em&gt;, je veux utiliser le fichier de configuration &lt;code&gt;~/.m2/settings-lambda.xml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pour les autres projets Open Source perso, le fichier &lt;code&gt;~/.m2/settings.xml&lt;/code&gt; d'origine fera très bien l'affaire !&lt;/p&gt;

&lt;p&gt;Pour un projet Open Source sur lequel je travail, je peux utiliser la commande &lt;code&gt;mvn&lt;/code&gt; comme à l'accoutumée.&lt;/p&gt;

&lt;p&gt;Pour un projet de mon client &lt;em&gt;lambda&lt;/em&gt;, par contre, je vais donc devoir faire :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~❯ mvn &lt;span class="nt"&gt;-s&lt;/span&gt; ~/.m2/settings-lambda.xml clean &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bon on va dire que c'est mieux que d'éditer le fichier &lt;code&gt;settings.xml&lt;/code&gt; de Maven mais ça ne me convient toujours pas ! Moi ce que j'aimerais c'est de trouver un moyen de configurer ça automatiquement pour toute une arborescence !&lt;/p&gt;

&lt;h2&gt;
  
  
  Un &lt;em&gt;wrapper&lt;/em&gt; magique pour &lt;code&gt;mvn&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Ma solution idéale voudrait que j'ai juste à utiliser la commande &lt;code&gt;mvn&lt;/code&gt; comme j'ai l'habitude de le faire et que le fichier de configuration spécifique soit ajouté à la commande à l'aide de l'option &lt;code&gt;-s&lt;/code&gt;, uniquement quand c'est nécessaire.&lt;/p&gt;

&lt;p&gt;Dans mon cas, je veux que ça soit activé lorsque je suis dans mon répertoire parent de tous les projets de mon client &lt;em&gt;lambda&lt;/em&gt;, à savoir &lt;code&gt;~/devel/lambda&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Retrouver le nom du fichier de configuration spécifique
&lt;/h3&gt;

&lt;p&gt;Par convention, j'ai donc décidé de dire que lorsqu'un fichier nommé &lt;code&gt;.m2_settings&lt;/code&gt; était trouvé dans le répertoire courant ou dans un de ses répertoires parents, son contenu sera lu et considédé comme le chemin d'un fichier de configuration spécifique à prendre en compte au lancement de la commande &lt;code&gt;mvn&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;En simple langage &lt;em&gt;shell&lt;/em&gt;, j'en suis arrivé au code suivant pour obtenir le contenu de ce fameux fichier &lt;code&gt;.m2_settings&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Find the given file going up in the parent directories&lt;/span&gt;
&lt;span class="c"&gt;# until found, return "" either&lt;/span&gt;
find_up&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;pth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$pth&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$pth&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="nv"&gt;pth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;pth&lt;/span&gt;&lt;span class="p"&gt;%/*&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;done&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$pth&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt; 

&lt;span class="nv"&gt;M2_SETTINGS_CONFIG_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;.m2_settings

check_mvn_settings&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;MVN_SETTINGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.m2/settings.xml
  &lt;span class="nv"&gt;fnd_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;find_up &lt;span class="nv"&gt;$M2_SETTINGS_CONFIG_NAME&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$fnd_dir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nv"&gt;MVN_SETTINGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="nv"&gt;$fnd_dir&lt;/span&gt;/&lt;span class="nv"&gt;$M2_SETTINGS_CONFIG_NAME&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;fi&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MVN_SETTINGS&lt;/span&gt;&lt;span class="p"&gt;/#\~/&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La fonction &lt;code&gt;find_up()&lt;/code&gt; trouve un fichier dont le nom est passé en paramètres dans le répertoire courant et ses répertoires parents jusqu'à ce qu'il soit trouvé, et dans le cas où ce fichier serait introuvable, une chaîne vide sera retournée.&lt;/p&gt;

&lt;p&gt;La fonction &lt;code&gt;check_mvn_settings()&lt;/code&gt; retournera :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;le nom du fichier de configuration sécifique trouvé dans le fichier &lt;code&gt;.m2_settings&lt;/code&gt; s'il est trouvé&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$HOME/.m2/settings.xml&lt;/code&gt; sinon&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notez que l'expression &lt;code&gt;${MVN_SETTINGS/#\~/$HOME}&lt;/code&gt; permet de remplacer toute occurence de &lt;code&gt;~&lt;/code&gt; par &lt;code&gt;$HOME&lt;/code&gt; dans la variable d'environnement &lt;code&gt;MVN_SETTINGS&lt;/code&gt; avant de la retourner car sans cela ça générait des problèmes d'interprétation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trouver le binaire &lt;code&gt;mvn&lt;/code&gt; d'origine
&lt;/h3&gt;

&lt;p&gt;Mon &lt;em&gt;wrapper&lt;/em&gt; sera intitulé &lt;code&gt;mvn&lt;/code&gt; comme la commande d'origine. Je ne veux pas changer mes habitudes.&lt;/p&gt;

&lt;p&gt;Le chemin vers ce dernier sera d'ailleurs prioritaire au chemin du binaire &lt;code&gt;mvn&lt;/code&gt; d'origine pour qu'il puisse faire cette action &lt;em&gt;magique&lt;/em&gt; d'ajout automatique du fichier de configuration spécifique...&lt;/p&gt;

&lt;p&gt;Seulement voilà : je ne voulais pas avoir à préciser dans ce dernier l'emplacement du binaire de Maven d'origine.&lt;/p&gt;

&lt;p&gt;Je voulais que mon script le trouve tout seul.&lt;/p&gt;

&lt;p&gt;Voici le bout de code &lt;em&gt;shell&lt;/em&gt; qui réalise cette opération :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;get_mvn_bin&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;directory_to_remove&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dirname&lt;/span&gt; &lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;:&lt;span class="nv"&gt;$PATH&lt;/span&gt;:
  &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;:&lt;span class="nv"&gt;$directory_to_remove&lt;/span&gt;:/:&lt;span class="k"&gt;}&lt;/span&gt;
  &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="p"&gt;#&lt;/span&gt;:&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="p"&gt;%&lt;/span&gt;:&lt;span class="k"&gt;}&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;whereis mvn | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print$2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Je sais, c'est &lt;em&gt;magique&lt;/em&gt;. Et en plus ça marche 😝&lt;/p&gt;

&lt;p&gt;Pour résumer le fonctionnement de ce code, ce dernier :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;récupère le répertoire du &lt;em&gt;wrapper&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;retire ce répertoire de la variable d'environnement &lt;code&gt;PATH&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;appelle la commande &lt;code&gt;whereis&lt;/code&gt; pour trouver le chemin de la commande &lt;code&gt;mvn&lt;/code&gt; d'origine (le &lt;em&gt;wrapper&lt;/em&gt; n'étant plus trouvable ici)&lt;/li&gt;
&lt;li&gt;retourne ce chemin à l'appelant&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Le corps principal du &lt;em&gt;wrapper&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Il ne reste plus qu'a appeler toutes ces fonctions et gérer le cas où Maven n'est pas trouvé :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;MVN_CMD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;get_mvn_bin&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MVN_CMD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2 &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"mvn command not found in PATH variable !"&lt;/span&gt;
  &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;
&lt;span class="k"&gt;fi
&lt;/span&gt;&lt;span class="nv"&gt;MVN_SETTINGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;check_mvn_settings&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;$MVN_CMD&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nv"&gt;$MVN_SETTINGS&lt;/span&gt; &lt;span class="nv"&gt;$@&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Et voilà !&lt;/p&gt;

&lt;h3&gt;
  
  
  Le script complet
&lt;/h3&gt;

&lt;p&gt;Voici le code du script complet :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="c"&gt;# Find the given file going up in the parent directories&lt;/span&gt;
&lt;span class="c"&gt;# until found, return "" either&lt;/span&gt;
find_up&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;pth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$pth&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$pth&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="nv"&gt;pth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;pth&lt;/span&gt;&lt;span class="p"&gt;%/*&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;done&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$pth&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt; 

&lt;span class="nv"&gt;M2_SETTINGS_CONFIG_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;.m2_settings

check_mvn_settings&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;MVN_SETTINGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.m2/settings.xml
  &lt;span class="nv"&gt;fnd_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;find_up &lt;span class="nv"&gt;$M2_SETTINGS_CONFIG_NAME&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$fnd_dir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nv"&gt;MVN_SETTINGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="nv"&gt;$fnd_dir&lt;/span&gt;/&lt;span class="nv"&gt;$M2_SETTINGS_CONFIG_NAME&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;fi&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MVN_SETTINGS&lt;/span&gt;&lt;span class="p"&gt;/#\~/&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

get_mvn_bin&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;directory_to_remove&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dirname&lt;/span&gt; &lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;:&lt;span class="nv"&gt;$PATH&lt;/span&gt;:
  &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;:&lt;span class="nv"&gt;$directory_to_remove&lt;/span&gt;:/:&lt;span class="k"&gt;}&lt;/span&gt;
  &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="p"&gt;#&lt;/span&gt;:&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="p"&gt;%&lt;/span&gt;:&lt;span class="k"&gt;}&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;whereis mvn | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print$2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;MVN_CMD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;get_mvn_bin&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MVN_CMD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2 &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"mvn command not found in PATH variable !"&lt;/span&gt;
  &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;
&lt;span class="k"&gt;fi
&lt;/span&gt;&lt;span class="nv"&gt;MVN_SETTINGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;check_mvn_settings&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;$MVN_CMD&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nv"&gt;$MVN_SETTINGS&lt;/span&gt; &lt;span class="nv"&gt;$@&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Faire un &lt;em&gt;wrapper&lt;/em&gt; vraiment complet
&lt;/h2&gt;

&lt;p&gt;Rediriger la commande &lt;code&gt;mvn&lt;/code&gt; ne me semblait pas suffisant.&lt;/p&gt;

&lt;p&gt;En effet, je voulais notamment que cette commande se retrouve dans un répertoire dont la structure est identique à celle d'une installation de Maven classique.&lt;/p&gt;

&lt;p&gt;J'ai opté pour la convention suivante :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;le répertoire d'installation de mon wrapper sera &lt;code&gt;~/.wrapper/maven&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;tout sont contenu sera un lien symbolique du répertoire d'installation de la version courante de Maven dans le répertoire de SDKMan&lt;/li&gt;
&lt;li&gt;à l'exception du répertoire &lt;code&gt;bin&lt;/code&gt; qui contiendra mon &lt;em&gt;wrapper&lt;/em&gt; magique et des liens symboliques vers les autres binaires&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voilà ce que ça donne :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~❯ &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lah&lt;/span&gt; .wrapper/maven
total 0
drwxr-xr-x  9 hoanicross  staff   288B 26 jan 08:07 &lt;span class="nb"&gt;.&lt;/span&gt;
drwxr-xr-x  3 hoanicross  staff    96B 26 jan 08:04 ..
lrwxr-xr-x  1 hoanicross  staff    58B 26 jan 08:06 LICENSE -&amp;gt; /Users/hoanicross/.sdkman/candidates/maven/current/LICENSE
lrwxr-xr-x  1 hoanicross  staff    57B 26 jan 08:06 NOTICE -&amp;gt; /Users/hoanicross/.sdkman/candidates/maven/current/NOTICE
lrwxr-xr-x  1 hoanicross  staff    61B 26 jan 08:07 README.txt -&amp;gt; /Users/hoanicross/.sdkman/candidates/maven/current/README.txt
drwxr-xr-x  8 hoanicross  staff   256B 12 fév 23:33 bin
lrwxr-xr-x  1 hoanicross  staff    55B 26 jan 08:06 boot -&amp;gt; /Users/hoanicross/.sdkman/candidates/maven/current/boot
lrwxr-xr-x  1 hoanicross  staff    55B 26 jan 08:06 conf -&amp;gt; /Users/hoanicross/.sdkman/candidates/maven/current/conf
lrwxr-xr-x  1 hoanicross  staff    54B 26 jan 08:06 lib -&amp;gt; /Users/hoanicross/.sdkman/candidates/maven/current/lib

~❯ &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lah&lt;/span&gt; .wrapper/maven/bin
total 8
drwxr-xr-x  8 hoanicross  staff   256B 12 fév 23:33 &lt;span class="nb"&gt;.&lt;/span&gt;
drwxr-xr-x  9 hoanicross  staff   288B 26 jan 08:07 ..
lrwxr-xr-x  1 hoanicross  staff    62B 26 jan 08:08 m2.conf -&amp;gt; /Users/hoanicross/.sdkman/candidates/maven/current/bin/m2.conf
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt;@ 1 hoanicross  staff   876B  6 fév 11:14 mvn
lrwxr-xr-x  1 hoanicross  staff    62B 26 jan 08:07 mvn.cmd -&amp;gt; /Users/hoanicross/.sdkman/candidates/maven/current/bin/mvn.cmd
lrwxr-xr-x  1 hoanicross  staff    63B 26 jan 08:07 mvnDebug -&amp;gt; /Users/hoanicross/.sdkman/candidates/maven/current/bin/mvnDebug
lrwxr-xr-x  1 hoanicross  staff    67B 26 jan 08:08 mvnDebug.cmd -&amp;gt; /Users/hoanicross/.sdkman/candidates/maven/current/bin/mvnDebug.cmd
lrwxr-xr-x  1 hoanicross  staff    61B 26 jan 08:08 mvnyjp -&amp;gt; /Users/hoanicross/.sdkman/candidates/maven/current/bin/mvnyjp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comme vous pouvez le voir, j'ai donc utilisé la commande &lt;code&gt;ln -s&lt;/code&gt; à outrance pour arriver à mes fins !&lt;/p&gt;

&lt;h2&gt;
  
  
  Rendre le &lt;em&gt;wrapper&lt;/em&gt; disponible dans la variable d'environnement &lt;code&gt;PATH&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Il ne reste plus maintenant qu'à rendre ce merveilleux &lt;em&gt;wrapper&lt;/em&gt; disponible dans la variable d'environnement &lt;code&gt;PATH&lt;/code&gt; en priorité.&lt;/p&gt;

&lt;p&gt;On pourra notamment créer une variable d'environnement &lt;code&gt;MAVEN_HOME&lt;/code&gt; pointant vers le répertoire d'installation du &lt;em&gt;wrapper&lt;/em&gt; et  on ajoutera &lt;code&gt;$MAVEN_HOME/bin&lt;/code&gt; au tout début de la variable d'environnement &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cela pourra notamment être rendu possible en ajoutant les lignes suivantes à la fin de votre script d'initialisation de votre interpréteur de commande (&lt;code&gt;~/.bashrc&lt;/code&gt; si vous utilisez bash ou &lt;code&gt;~/.zshrc&lt;/code&gt; si vous utilisez zsh) :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;MAVEN_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.wrapper/maven
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$MAVEN_HOME&lt;/span&gt;/bin&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Relancez votre terminal et vous voilà paré pour changer d'environnement de développement à la volée avec Maven 🤤 en utilisant la commande &lt;code&gt;mvn&lt;/code&gt; comme à l'accoutumée...&lt;/p&gt;

&lt;h2&gt;
  
  
  Limite de ce procédé dans les IDE
&lt;/h2&gt;

&lt;p&gt;Ce &lt;em&gt;wrapper&lt;/em&gt; est surtout magique en ligne de commande.&lt;/p&gt;

&lt;p&gt;Dans votre IDE, cela ne marchera pas de façon transparente.&lt;/p&gt;

&lt;p&gt;J'ai notamment pu constater que dans IntelliJ IDEA, étant donné que ce dernier utilise une installation de Maven embarquée par défaut, le changement de fichier de configuration ne se fait pas automatiquement.&lt;/p&gt;

&lt;p&gt;Néanmoins, il reste possible de configurer le fichier de configuration à prendre en considération pour le projet en cours, ce qui nécessite une manipulation à faire une seule fois pour chaque projet. Pour moi cette contrainte est largement acceptable !&lt;/p&gt;

&lt;p&gt;J'en profite aussi pour définir, dans le champ consacré à cet effet, le répertoire d'installation de Maven comme étant le répertoire d'installation de mon &lt;em&gt;wrapper&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Et la suite ?
&lt;/h2&gt;

&lt;p&gt;Dans mon prochain article, je vous expliquerais comment j'ai réussi à jongler avec mes identités et signatures Git en fonction des projets sur lesquels je travaile !&lt;/p&gt;

&lt;p&gt;Si vous voulez savoir quand je sortirais un nouvel article, suivez-moi sur &lt;a href="https://www.linkedin.com/in/hoanicross/"&gt;LinkedIn&lt;/a&gt; ou Dev.to !&lt;/p&gt;

&lt;p&gt;J'aimerais aussi terminer en vous expliquant rapidement qui je suis 😄&lt;/p&gt;

&lt;p&gt;Je m'appelle Hoani CROSS. Je suis originaire de Polynésie Française.&lt;/p&gt;

&lt;p&gt;Passionné d'informatique depuis toujours (j'ai commencé à développer en CP, il y a environ 40 ans), j'ai évolué dans beaucoup d'environnements et occupé de nombreux poste, jusqu'à celui de DSI...&lt;/p&gt;

&lt;p&gt;Aujourd'hui je suis manager et backend architect chez &lt;a href="https://sfeir.com"&gt;SFEIR&lt;/a&gt;, une Néo-ESN française. Une des particularités de SFEIR, c'est que les managers sont également des exécutants en mission chez des clients. On comprends ce que font les employés qu'on manage et croyez-moi, ça fait une sacré différence ! Et enfin, ce qui nous relie tous chez SFEIR, c'est la passion pour l'informatique... Étant donné qu'elle me suit depuis 40 ans, autant vous dire que je suis tombé au bon endroit !..&lt;/p&gt;

&lt;p&gt;D'ailleurs, si vous êtes passionné comme moi, il y certainement une mission de rêve qui vous attends chez SFEIR alors &lt;a href="https://www.linkedin.com/in/hoanicross/"&gt;n'hésitez pas à me contacter&lt;/a&gt; si vous voulez changer d'horizon.&lt;/p&gt;

&lt;p&gt;Enfin, je suis aussi le propriétaire du blog &lt;a href="https://geeketrentable.fr"&gt;Geek &amp;amp; Rentable&lt;/a&gt;, que je vous invite à aller découvrir.&lt;/p&gt;

&lt;p&gt;Dans ce blog, je souhaite accompagner les développeurs/développeuses ou autre acteurs/actrices de la tech, passionné.e.s mais malheureusement incompris.es, de manière à ce qu'ils ou elles puissent évoluer vers de bien meilleurs conditions de travail.&lt;/p&gt;

&lt;p&gt;À très bientôt.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.deviantart.com/ang3llor3/art/a-juggler-321507830"&gt;Illustration par Ang3llor3 sur DeviantArt&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>maven</category>
      <category>fullstack</category>
      <category>environnement</category>
      <category>french</category>
    </item>
    <item>
      <title>Changer son environnement fullstack en un clin d'oeil : partie 1 avec Java</title>
      <dc:creator>Hoani CROSS</dc:creator>
      <pubDate>Sun, 05 Feb 2023 08:44:15 +0000</pubDate>
      <link>https://dev.to/hcross/changer-son-environnement-fullstack-en-un-clin-doeil-partie-1-avec-java-3j50</link>
      <guid>https://dev.to/hcross/changer-son-environnement-fullstack-en-un-clin-doeil-partie-1-avec-java-3j50</guid>
      <description>&lt;p&gt;Vous êtes un développeur consultant. Vous travaillez pour plusieurs clients. Ou tout simplement, vous travaillez à la fois pour votre employeur et pour un ou plusieurs projets open source, durant votre temps libre.&lt;/p&gt;

&lt;p&gt;Lorsque vous passez d'un projet de développement à un autre, vous avez certainement dû changer tous vos outils et identifiants...&lt;/p&gt;

&lt;p&gt;Changement de votre identifiant Git, de votre signature GnuPG, de vos clés SSH... Sans parler des versions des outils que vous utilisez : version de Java, de NodeJS ou de Python.&lt;/p&gt;

&lt;p&gt;Il y a même les configurations des outils de constructions qui doivent changer comme celles de Maven ou de NPM.&lt;/p&gt;

&lt;p&gt;Pas simple pour passer d'un contexte à l'autre.&lt;/p&gt;

&lt;p&gt;Bonne nouvelle : j'ai déjà expérimenté plusieurs solutions pour répondre à ces besoins et je voudrais partager avec vous le résultat de mes recherches !&lt;/p&gt;

&lt;p&gt;Je vous propose d'aborder cela sous la forme de plusieurs petits articles ciblés sur chaque astuce trouvée.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gérer vos versions de Java
&lt;/h2&gt;

&lt;p&gt;Commençons par aborder le fait de devoir gérer plusieurs versions de Java.&lt;/p&gt;

&lt;p&gt;Attention on ne prendra pas en compte les versions de Java antérieures à la version 8.&lt;/p&gt;

&lt;p&gt;Si vous êtes sous Linux Debian ou un de ses dérivés (notamment Ubuntu), il existe des outils assez pratiques répondant à la problématique comme &lt;code&gt;update-alternatives&lt;/code&gt; voire &lt;code&gt;update-java-alternatives&lt;/code&gt;. Néanmoins, ces solutions se cantonent à un seul système et je voulais dans mes recherches trouver un outil &lt;em&gt;cross-platform&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;En fait il existe pas mal d'outils pour gérer ses différentes versions de Java : &lt;a href="https://www.jenv.be/" rel="noopener noreferrer"&gt;jEnv&lt;/a&gt; ou encore &lt;a href="https://github.com/shyiko/jabba" rel="noopener noreferrer"&gt;Jabba&lt;/a&gt;. Pour ma part, j'ai souhaité me concentrer sur un outil plutôt plébicité pour ce besoin : &lt;a href="https://sdkman.io/" rel="noopener noreferrer"&gt;SDKMan&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;SDKMan est un logiciel open source sous licence Apache 2.0. C'est un projet &lt;a href="https://github.com/sdkman/sdkman-cli" rel="noopener noreferrer"&gt;très actif sur GitHub&lt;/a&gt;. Il est également possible de soutenir le projet financièrement via &lt;a href="https://opencollective.com/sdkman" rel="noopener noreferrer"&gt;le site Open Collective&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;SDKMan est centré sur la gestion des différentes versions de Java mais aussi des outils et autres technologies liées.&lt;/p&gt;

&lt;p&gt;On pourra aussi gérer ses différentes version de Maven ou de Kotlin avec SDKMan (ce que je fais à titre personnel).&lt;/p&gt;

&lt;h3&gt;
  
  
  Installer SDKMan
&lt;/h3&gt;

&lt;p&gt;Pour utiliser SDKMan, vous devez disposer d'un système Linux, Windows (via WSL) ou MacOS. Il est également possible de l'installer sur FreeBSD voire Solaris !&lt;/p&gt;

&lt;p&gt;SDKMan étant un outil en ligne de commande, il a besoin d'interagir avec votre interpréteur de ligne de commande préféré. En l'occurrence, il gère Bash et Zsh.&lt;/p&gt;

&lt;p&gt;Pour installer SDKMan, ouvrez un terminal et tapez la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://get.sdkman.io"&lt;/span&gt; | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Petit &lt;em&gt;disclaimer&lt;/em&gt; sur ce type d'installation quand même, je vous invite à télécharger et à consulter le contenu de &lt;code&gt;https://get.sdkman.io&lt;/code&gt; pour savoir ce que fait le script avant de confier ça à &lt;code&gt;bash&lt;/code&gt; aveuglément ! Vous êtes prévenus 😄&lt;/p&gt;

&lt;p&gt;En fonction de l'interpréteur de ligne de commande que vous utilisez, votre fichier &lt;code&gt;.bashrc&lt;/code&gt; ou &lt;code&gt;.zshrc&lt;/code&gt; sera modifié en conséquence pour ajouter la commande &lt;code&gt;sdk&lt;/code&gt; de SDKMan.&lt;/p&gt;

&lt;p&gt;Notez aussi que SDKMan va créer un répertoire &lt;code&gt;.sdkman&lt;/code&gt; à la racine de votre répertoire utilisateur dans lequel on retrouvera non seulement l'outil &lt;code&gt;sdk&lt;/code&gt; mais aussi toutes les installations de Java, Maven ou Kotlin.&lt;/p&gt;

&lt;h3&gt;
  
  
  Téléchargez votre version de Java par défaut
&lt;/h3&gt;

&lt;p&gt;Maintenant que SDKMan est installé, on va l'utiliser pour installer votre version de Java par défaut.&lt;/p&gt;

&lt;p&gt;Pour obtenir la liste des versions de Java disponibles avec SDKMan, vous devez taper la commande suivante dans un terminal :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; sdk list java
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SDKMan pour fournira une liste des distributions disponibles pour votre architecture matérielle (vous pouvez voir les architectures matérielles supportées &lt;a href="https://sdkman.io/vendors" rel="noopener noreferrer"&gt;ici&lt;/a&gt; au chapitre &lt;em&gt;Multi-platform binary distributions&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Personnellement j'aime bien prendre la dernière version stable, par forcément LTS, celle d'OpenJDK de Java.net.&lt;/p&gt;

&lt;p&gt;À l'heure où sont écrites ces lignes, il s'agit de la version &lt;code&gt;19.0.2-open&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Si vous voulez installer cette version, il vous suffira de taper la commande suivante dans un terminal :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; sdk &lt;span class="nb"&gt;install &lt;/span&gt;java 19.0.2-open
Downloading: java 19.0.2-open
In progress...
&lt;span class="c"&gt;######################################################################### 100,0%&lt;/span&gt;
Repackaging Java 19.0.2-open...
Done repackaging...
Cleaning up residual files...
Installing: java 19.0.2-open
Done installing!
Do you want java 19.0.2-open to be &lt;span class="nb"&gt;set &lt;/span&gt;as default? &lt;span class="o"&gt;(&lt;/span&gt;Y/n&lt;span class="o"&gt;)&lt;/span&gt;: Y
Setting java 19.0.2-open as default.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comme illustré ci-dessus, SDKMan vous demandera si vous désirez définir cette nouvelle version téléchargée comme votre version de Java par défaut : répondez &lt;code&gt;Y&lt;/code&gt; pour donner votre accord.&lt;/p&gt;

&lt;p&gt;Vous pourrez valider que vous avez bien ce que vous désirez avec les commandes suivantes :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; java &lt;span class="nt"&gt;-version&lt;/span&gt;
openjdk version &lt;span class="s2"&gt;"19.0.2"&lt;/span&gt; 2023-01-17
OpenJDK Runtime Environment &lt;span class="o"&gt;(&lt;/span&gt;build 19.0.2+7-44&lt;span class="o"&gt;)&lt;/span&gt;
OpenJDK 64-Bit Server VM &lt;span class="o"&gt;(&lt;/span&gt;build 19.0.2+7-44, mixed mode, sharing&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Installer d'autres versions de Java
&lt;/h3&gt;

&lt;p&gt;Bon pour l'instant et d'après ce que je vous ai montré, SDKMan n'apporte rien par rapport à une bonne vieille installation manuelle de Java.&lt;/p&gt;

&lt;p&gt;Justement, nous allons maintenant voir le gros avantage de cet outil : la capacité à installer plusieurs versions de Java et à passer d'une version à une autre.&lt;/p&gt;

&lt;p&gt;Pour lister la liste des versions de Java disponibles, faites comme dans le chapitre suivant et tapez la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; sdk list java
&lt;span class="o"&gt;================================================================================&lt;/span&gt;
Available Java Versions &lt;span class="k"&gt;for &lt;/span&gt;macOS ARM 64bit
&lt;span class="o"&gt;================================================================================&lt;/span&gt;
 Vendor        | Use | Version      | Dist    | Status     | Identifier
&lt;span class="nt"&gt;--------------------------------------------------------------------------------&lt;/span&gt;
 Corretto      |     | 19.0.2       | amzn    |            | 19.0.2-amzn         
               |     | 19.0.1       | amzn    |            | 19.0.1-amzn         
               |     | 17.0.6       | amzn    |            | 17.0.6-amzn         
               |     | 17.0.5       | amzn    |            | 17.0.5-amzn         
               |     | 11.0.18      | amzn    |            | 11.0.18-amzn        
               |     | 11.0.17      | amzn    |            | 11.0.17-amzn        
               |     | 8.0.362      | amzn    |            | 8.0.362-amzn        
               |     | 8.0.352      | amzn    |            | 8.0.352-amzn        
 Gluon         |     | 22.1.0.1.r17 | gln     |            | 22.1.0.1.r17-gln    
               |     | 22.1.0.1.r11 | gln     |            | 22.1.0.1.r11-gln    
 GraalVM       |     | 22.3.r19     | grl     |            | 22.3.r19-grl        
               |     | 22.3.r17     | grl     |            | 22.3.r17-grl        
               |     | 22.3.r11     | grl     |            | 22.3.r11-grl        
               |     | 22.3.1.r19   | grl     |            | 22.3.1.r19-grl      
               |     | 22.3.1.r17   | grl     |            | 22.3.1.r17-grl      
               |     | 22.3.1.r11   | grl     |            | 22.3.1.r11-grl      
               |     | 22.2.r17     | grl     |            | 22.2.r17-grl        
               |     | 22.2.r11     | grl     |            | 22.2.r11-grl        
               |     | 22.1.0.r17   | grl     |            | 22.1.0.r17-grl      
               |     | 22.1.0.r11   | grl     |            | 22.1.0.r11-grl      
 Java.net      |     | 21.ea.8      | open    |            | 21.ea.8-open        
               |     | 21.ea.7      | open    |            | 21.ea.7-open        
               |     | 21.ea.6      | open    |            | 21.ea.6-open        
               |     | 21.ea.5      | open    |            | 21.ea.5-open        
               |     | 21.ea.4      | open    |            | 21.ea.4-open        
               |     | 20.ea.34     | open    |            | 20.ea.34-open       
               |     | 20.ea.33     | open    |            | 20.ea.33-open       
               |     | 20.ea.32     | open    |            | 20.ea.32-open       
               |     | 20.ea.31     | open    |            | 20.ea.31-open       
               |     | 20.ea.30     | open    |            | 20.ea.30-open       
               | &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; | 19.0.2       | open    | installed  | 19.0.2-open         
               |     | 19.0.1       | open    |            | 19.0.1-open         
 Liberica      |     | 19.0.2.fx    | librca  |            | 19.0.2.fx-librca    
               |     | 19.0.2       | librca  |            | 19.0.2-librca       
               |     | 19.0.1.fx    | librca  |            | 19.0.1.fx-librca    
               |     | 19.0.1       | librca  |            | 19.0.1-librca       
               |     | 17.0.6.fx    | librca  |            | 17.0.6.fx-librca    
               |     | 17.0.6       | librca  |            | 17.0.6-librca       
               |     | 17.0.5.fx    | librca  |            | 17.0.5.fx-librca    
               |     | 17.0.5       | librca  |            | 17.0.5-librca       
               |     | 11.0.18.fx   | librca  |            | 11.0.18.fx-librca   
               |     | 11.0.18      | librca  |            | 11.0.18-librca      
               |     | 11.0.17.fx   | librca  |            | 11.0.17.fx-librca   
               |     | 11.0.17      | librca  |            | 11.0.17-librca      
               |     | 8.0.362.fx   | librca  |            | 8.0.362.fx-librca   
               |     | 8.0.362      | librca  |            | 8.0.362-librca      
               |     | 8.0.352.fx   | librca  |            | 8.0.352.fx-librca   
               |     | 8.0.352      | librca  |            | 8.0.352-librca      
 Liberica NIK  |     | 22.3.r17     | nik     |            | 22.3.r17-nik        
               |     | 22.3.r11     | nik     |            | 22.3.r11-nik        
               |     | 22.3.1.r17   | nik     |            | 22.3.1.r17-nik      
               |     | 22.3.1.r11   | nik     |            | 22.3.1.r11-nik      
               |     | 22.2.r17     | nik     |            | 22.2.r17-nik        
               |     | 22.2.r11     | nik     |            | 22.2.r11-nik
 Microsoft     |     | 17.0.6       | ms      |            | 17.0.6-ms           
               |     | 17.0.5       | ms      |            | 17.0.5-ms           
               |     | 11.0.18      | ms      |            | 11.0.18-ms          
               |     | 11.0.17      | ms      |            | 11.0.17-ms          
 Oracle        |     | 19.0.2       | oracle  |            | 19.0.2-oracle       
               |     | 19.0.1       | oracle  |            | 19.0.1-oracle       
               |     | 17.0.6       | oracle  |            | 17.0.6-oracle       
               |     | 17.0.5       | oracle  |            | 17.0.5-oracle       
 SapMachine    |     | 19.0.2       | sapmchn |            | 19.0.2-sapmchn      
               |     | 19.0.1       | sapmchn |            | 19.0.1-sapmchn      
               |     | 17.0.6       | sapmchn |            | 17.0.6-sapmchn      
               |     | 17.0.5       | sapmchn |            | 17.0.5-sapmchn      
               |     | 11.0.18      | sapmchn |            | 11.0.18-sapmchn     
               |     | 11.0.17      | sapmchn |            | 11.0.17-sapmchn     
 Semeru        |     | 18.0.2       | sem     |            | 18.0.2-sem          
               |     | 17.0.5       | sem     |            | 17.0.5-sem          
               |     | 17.0.4.1     | sem     |            | 17.0.4.1-sem        
               |     | 11.0.17      | sem     |            | 11.0.17-sem         
               |     | 11.0.16.1    | sem     |            | 11.0.16.1-sem       
 Temurin       |     | 19.0.2       | tem     |            | 19.0.2-tem          
               |     | 19.0.1       | tem     |            | 19.0.1-tem          
               |     | 17.0.6       | tem     |            | 17.0.6-tem          
               |     | 17.0.5       | tem     |            | 17.0.5-tem          
               |     | 11.0.18      | tem     |            | 11.0.18-tem         
               |     | 11.0.17      | tem     |            | 11.0.17-tem         
 Zulu          |     | 19.0.2       | zulu    |            | 19.0.2-zulu         
               |     | 19.0.2.fx    | zulu    |            | 19.0.2.fx-zulu      
               |     | 19.0.1       | zulu    |            | 19.0.1-zulu         
               |     | 19.0.1.fx    | zulu    |            | 19.0.1.fx-zulu      
               |     | 17.0.6       | zulu    |            | 17.0.6-zulu         
               |     | 17.0.6.fx    | zulu    |            | 17.0.6.fx-zulu      
               |     | 17.0.5       | zulu    |            | 17.0.5-zulu         
               |     | 17.0.5.fx    | zulu    |            | 17.0.5.fx-zulu      
               |     | 11.0.18      | zulu    |            | 11.0.18-zulu        
               |     | 11.0.18.fx   | zulu    |            | 11.0.18.fx-zulu     
               |     | 11.0.17      | zulu    |            | 11.0.17-zulu        
               |     | 11.0.17.fx   | zulu    |            | 11.0.17.fx-zulu     
               |     | 8.0.362      | zulu    |            | 8.0.362-zulu        
               |     | 8.0.362.fx   | zulu    |            | 8.0.362.fx-zulu     
               |     | 8.0.352      | zulu    |            | 8.0.352-zulu        
               |     | 8.0.352.fx   | zulu    |            | 8.0.352.fx-zulu     
&lt;span class="o"&gt;================================================================================&lt;/span&gt;
Omit Identifier to &lt;span class="nb"&gt;install &lt;/span&gt;default version 17.0.6-tem:
    &lt;span class="nv"&gt;$ &lt;/span&gt;sdk &lt;span class="nb"&gt;install &lt;/span&gt;java
Use TAB completion to discover available versions
    &lt;span class="nv"&gt;$ &lt;/span&gt;sdk &lt;span class="nb"&gt;install &lt;/span&gt;java &lt;span class="o"&gt;[&lt;/span&gt;TAB]
Or &lt;span class="nb"&gt;install &lt;/span&gt;a specific version by Identifier:
    &lt;span class="nv"&gt;$ &lt;/span&gt;sdk &lt;span class="nb"&gt;install &lt;/span&gt;java 17.0.6-tem
Hit Q to &lt;span class="nb"&gt;exit &lt;/span&gt;this list view
&lt;span class="o"&gt;================================================================================&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;END&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comme vous pouvez éventuellement le remarquer, il s'agit des version disponibles pour l'architecture ARM 64bits de MacOS (j'utilise actuellement un MacBook Air M2)... Et il y en a &lt;strong&gt;beaucoup&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Je ne vous ferais pas aujourd'hui un comparatif des différentes déclinaisons de Java selon les différents fournisseurs (ça fera peut-être partie d'un futur article ?) mais de mon côté, j'utilise pour mes versions &lt;em&gt;non bleeding edge&lt;/em&gt;, celles de Zulu.&lt;/p&gt;

&lt;p&gt;En l'occurrence, ce qui me plait dans les versions de Zulu sont le &lt;a href="https://llvm.org/devmtg/2017-10/slides/Reames-FalconKeynote.pdf" rel="noopener noreferrer"&gt;compilateur JIT Falcon basé sur LLVM&lt;/a&gt;et le &lt;a href="https://www.azul.com/c4-white-paper/" rel="noopener noreferrer"&gt;&lt;em&gt;garbage collector&lt;/em&gt; C4&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Chez le client pour lequel je travaille, on retrouve des projets développés pour Java 8, 11 et plus récemment 17.&lt;/p&gt;

&lt;p&gt;J'ai donc installé la version &lt;code&gt;17.0.6-zulu&lt;/code&gt;, à l'aide de la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; sdk &lt;span class="nb"&gt;install &lt;/span&gt;java 17.0.6-zulu
Downloading: java 17.0.6-zulu
In progress...
&lt;span class="c"&gt;########################################################################## 100,0%&lt;/span&gt;
Repackaging Java 17.0.6-zulu...
Done repackaging...
Installing: java 17.0.6-zulu
Done installing!
Do you want java 17.0.6-zulu to be &lt;span class="nb"&gt;set &lt;/span&gt;as default? &lt;span class="o"&gt;(&lt;/span&gt;Y/n&lt;span class="o"&gt;)&lt;/span&gt;: n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Et cette fois, contrairement à la première fois, j'ai préféré ne pas changer la version par défaut avec cette version de Java.&lt;/p&gt;

&lt;p&gt;La démarche n'est pas très différente pour les versions  &lt;code&gt;11.0.18-zulu&lt;/code&gt; et &lt;code&gt;8.0.362-zulu&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; sdk &lt;span class="nb"&gt;install &lt;/span&gt;java 11.0.18-zulu
&lt;span class="o"&gt;(&lt;/span&gt;...&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; sdk &lt;span class="nb"&gt;install &lt;/span&gt;java 8.0.362-zulu
&lt;span class="o"&gt;(&lt;/span&gt;...&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Et vous voilà avec les trois dernières versions LTS de Java d'installées sur votre poste !&lt;/p&gt;

&lt;h3&gt;
  
  
  Passer d'une version de Java à une autre
&lt;/h3&gt;

&lt;p&gt;Pour changer la version en cours de Java, vous devrez utiliser la commande suivante (ici illustrée avec la version &lt;code&gt;17.0.6-zulu&lt;/code&gt;) :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; sdk use java 17.0.6-zulu

Using java version 17.0.6-zulu &lt;span class="k"&gt;in &lt;/span&gt;this shell.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Une petite vérification de la version en cours permet de confirmer le bon fonctionnement de l'opération :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; java &lt;span class="nt"&gt;-version&lt;/span&gt;
openjdk version &lt;span class="s2"&gt;"17.0.6"&lt;/span&gt; 2023-01-17 LTS
OpenJDK Runtime Environment Zulu17.40+19-CA &lt;span class="o"&gt;(&lt;/span&gt;build 17.0.6+10-LTS&lt;span class="o"&gt;)&lt;/span&gt;
OpenJDK 64-Bit Server VM Zulu17.40+19-CA &lt;span class="o"&gt;(&lt;/span&gt;build 17.0.6+10-LTS, mixed mode, sharing&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Changement automatique de la version de Java
&lt;/h3&gt;

&lt;p&gt;Il est possible, à l'aide de SDKMan d'enregistrer la version en cours d'utilisation de Java pour un projet en particulier.&lt;/p&gt;

&lt;p&gt;Imaginons que vous avez un projet &lt;em&gt;legacy&lt;/em&gt; de votre client qui utilise encore du Java 8.&lt;/p&gt;

&lt;p&gt;Pour associer cette version de java avec ledit projet, il vous faudra vous rendre dans ce projet, changer la version de java et lancer la commande &lt;code&gt;sdk env init&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~ &lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;devel/mon_client/projet_java8
~/devel/mon_client/projet_java8 &lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; sdk use java 8.0.362-zulu
Using java version 8.0.362-zulu &lt;span class="k"&gt;in &lt;/span&gt;this shell.
~/devel/mon_client/projet_java8 &lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; sdk &lt;span class="nb"&gt;env &lt;/span&gt;init
.sdkmanrc created.
~/devel/mon_client/projet_java8 &lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; java &lt;span class="nt"&gt;-version&lt;/span&gt;
openjdk version &lt;span class="s2"&gt;"1.8.0_362"&lt;/span&gt;
OpenJDK Runtime Environment &lt;span class="o"&gt;(&lt;/span&gt;Zulu 8.68.0.19-CA-macos-aarch64&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;build 1.8.0_362-b08&lt;span class="o"&gt;)&lt;/span&gt;
OpenJDK 64-Bit Server VM &lt;span class="o"&gt;(&lt;/span&gt;Zulu 8.68.0.19-CA-macos-aarch64&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;build 25.362-b08, mixed mode&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Maintenant, avec cette configuration, il suffira de lancer la commande &lt;code&gt;sdk env&lt;/code&gt; au sein du répertoire configuré pour que la version correcte de Java soit sélectionnée !&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~ &lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;devel/mon_client/projet_java8
~/devel/mon_client/projet_java8 &lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; sdk &lt;span class="nb"&gt;env
&lt;/span&gt;Using java version 8.0.362-zulu &lt;span class="k"&gt;in &lt;/span&gt;this shell.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Maintenant encore mieux : il est possible de faire en sorte que la version de Java change &lt;strong&gt;automatiquement&lt;/strong&gt; lorsque vous entrez dans le répertoire dudit projet configuré !&lt;/p&gt;

&lt;p&gt;Pour cela, vous allez devoir modifier la configuration de SDKMan en éditant le fichier &lt;code&gt;~/.sdkman/etc/config&lt;/code&gt; et assigner la variable de configuration &lt;code&gt;sdkman_auto_env&lt;/code&gt; à &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Il est possible de le faire en une ligne sur MacOS à l'aide de la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/sdkman_auto_env=false/sdkman_auto_env=true/g'&lt;/span&gt; ~/.sdkman/etc/config &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/sdkman-cfg &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cat&lt;/span&gt; /tmp/sdkman-cfg &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.sdkman/etc/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sous GNU Linux, c'est plus simple :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/sdkman_auto_env=false/sdkman_auto_env=true/g'&lt;/span&gt; ~/.sdkman/etc/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Maintenant, un petit tour dans le répertoire de votre projet en Java 8 et le changement est automatique (attention il faut ouvrir un nouveau terminal pour que ça soit effectif) :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~ &lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;devel/mon_client/projet_java8
Using java version 8.0.362-zulu &lt;span class="k"&gt;in &lt;/span&gt;this shell.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Gérer vos versions de Maven et de Kotlin
&lt;/h2&gt;

&lt;p&gt;En réalité, je n'utilise pas vraiment SDKMan pour jongler entre plusieurs versions de Maven ou Kotlin mais il s'agit surtout d'un outil très pratique pour les installer facilement et rapidement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation de Maven
&lt;/h3&gt;

&lt;p&gt;Si comme moi, vous ne vous souciez pas plus que ça de la version de Maven que vous aller récupérer à partir du moment que c'est la dernière en date, tapez juste la commande suivante dans un terminal :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; sdk &lt;span class="nb"&gt;install &lt;/span&gt;maven
Downloading: maven 3.8.7
In progress...
&lt;span class="c"&gt;########################################################################## 100,0%&lt;/span&gt;
Installing: maven 3.8.7
Done installing!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Installation de Kotlin
&lt;/h3&gt;

&lt;p&gt;Pour Kotlin c'est un peu différent.&lt;/p&gt;

&lt;p&gt;Ce langage est assez récent pour que la chance (ou la malchance) de devoir gérer plusieurs version de Kotlin est faible.&lt;/p&gt;

&lt;p&gt;Cependant, vous pourrez, comme java, connaître les différentes version de Kotlin disponibles avec la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; sdk list kotlin
&lt;span class="o"&gt;================================================================================&lt;/span&gt;
Available Kotlin Versions
&lt;span class="o"&gt;================================================================================&lt;/span&gt;
 &amp;gt; &lt;span class="k"&gt;*&lt;/span&gt; 1.8.0               1.4.0               1.2.60              1.1.3          
     1.7.21              1.3.72              1.2.51              1.1.2-5        
     1.7.20              1.3.71              1.2.50              1.1.2-2        
     1.7.10              1.3.70              1.2.41              1.1.2          
     1.7.0               1.3.61              1.2.40              1.1.1          
     1.6.21              1.3.60              1.2.31              1.1            
     1.6.20              1.3.50              1.2.30              1.0.7          
     1.6.10              1.3.41              1.2.21              1.0.6          
     1.6.0               1.3.40              1.2.20              1.0.5-2        
     1.5.31              1.3.31              1.2.10              1.0.5          
     1.5.30              1.3.30              1.2.0               1.0.4          
     1.5.21              1.3.21              1.1.61              1.0.3          
     1.5.10              1.3.20              1.1.60              1.0.2          
     1.5.0               1.3.11              1.1.51              1.0.1-2        
     1.4.31              1.3.10              1.1.50              1.0.1-1        
     1.4.30              1.3.0               1.1.4-3             1.0.1          
     1.4.21              1.2.71              1.1.4-2             1.0.0          
     1.4.20              1.2.70              1.1.4                              
     1.4.10              1.2.61              1.1.3-2                            

&lt;span class="o"&gt;================================================================================&lt;/span&gt;
+ - &lt;span class="nb"&gt;local &lt;/span&gt;version
&lt;span class="k"&gt;*&lt;/span&gt; - installed
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; - currently &lt;span class="k"&gt;in &lt;/span&gt;use
&lt;span class="o"&gt;================================================================================&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;END&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vous remarquerez d'ailleurs que j'ai déjà installé la dernière version (&lt;code&gt;1.8.0&lt;/code&gt; à l'heure où sont écrites ces lignes) sur mon poste.&lt;/p&gt;

&lt;p&gt;Pour installer Kotlin dans sa dernière version, il vous suffira de taper en ligne de commande :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; sdk &lt;span class="nb"&gt;install &lt;/span&gt;kotlin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pour avoir une version spécifique comme la version &lt;code&gt;1.2.71&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; sdk &lt;span class="nb"&gt;install &lt;/span&gt;kotlin 1.2.71
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pour passer d'une version à une autre, c'est identique à ce que l'on a appris avec Java.&lt;/p&gt;

&lt;h2&gt;
  
  
  Et la suite ?
&lt;/h2&gt;

&lt;p&gt;Dans mon prochain article, je vous expliquerais comment j'ai réussi à changer &lt;strong&gt;complètement&lt;/strong&gt; de configuration Maven en fonction du répertoire où je me trouve...&lt;/p&gt;

&lt;p&gt;Si ça vous intéresse, demandez-moi en contact ou suivez-moi sur LinkedIn !&lt;/p&gt;

&lt;p&gt;J'aimerais aussi terminer en vous expliquer rapidement qui je suis 😄&lt;/p&gt;

&lt;p&gt;Je m'appelle Hoani CROSS. Je suis originaire de Polynésie Française.&lt;/p&gt;

&lt;p&gt;Passionné d'informatique depuis toujours (j'ai commencé à développer en CP, il y a environ 40 ans), j'ai évolué dans beaucoup d'environnements et occupé de nombreux poste, jusqu'à celui de DSI...&lt;/p&gt;

&lt;p&gt;Aujourd'hui je suis manager et backend architect chez &lt;a href="https://sfeir.com" rel="noopener noreferrer"&gt;SFEIR&lt;/a&gt;, une Néo-ESN française. Une des particularités de SFEIR, c'est que les managers sont également des exécutants en mission chez des clients. On comprend ce que font les employés qu'on manage et croyez-moi, ça fait une sacré différence ! Et enfin, ce qui nous relie tous chez SFEIR, c'est la passion pour l'informatique... Étant donné qu'elle me suit depuis 40 ans, autant vous dire que je suis tombé au bon endroit !..&lt;/p&gt;

&lt;p&gt;D'ailleurs, si vous êtes passionné.e comme moi, il y certainement une mission de rêve qui vous attend chez SFEIR alors n'hésitez pas à me contacter si vous voulez changer d'horizon.&lt;/p&gt;

&lt;p&gt;Enfin, je suis aussi le propriétaire du blog &lt;a href="https://geeketrentable.fr" rel="noopener noreferrer"&gt;Geek &amp;amp; Rentable&lt;/a&gt;, dont je vous conseille la visite. Avec ce blog, je souhaite aider les développeurs ou autre acteurs de la tech, passionnés mais malheureusement incompris, afin de faire évoluer leur condition de travail voire leur carrière.&lt;/p&gt;

&lt;p&gt;À très bientôt.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
