<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Jean-Christophe Gay</title><link>https://jeanchristophegay.com/en/</link><description>Recent content on Jean-Christophe Gay</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><copyright>© 2026 Jean-Christophe Gay</copyright><lastBuildDate>Sun, 22 Sep 2019 00:02:45 +0200</lastBuildDate><atom:link href="https://jeanchristophegay.com/en/index.xml" rel="self" type="application/rss+xml"/><item><title>Use a unique property to set Maven version</title><link>https://jeanchristophegay.com/en/posts/maven-unique-version-multi-modules-build/</link><pubDate>Fri, 02 Sep 2016 20:49:00 +0200</pubDate><guid>https://jeanchristophegay.com/en/posts/maven-unique-version-multi-modules-build/</guid><description>&lt;p&gt;When working with a Maven multi-module (dozens of them) project on multiple branches, I always end up with merge conflicts on my &lt;code&gt;pom.xml&lt;/code&gt; &lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt; elements.&lt;br&gt;
Here is a solution I use to remove all the &lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt; element duplication.&lt;/p&gt;
&lt;p&gt;Our example project is made of two modules:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── pom.xml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── submodule-1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   └── pom.xml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── submodule-2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    └── pom.xml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Parent project &lt;code&gt;pom.xml&lt;/code&gt; looks like:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;project&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.github.jcgay.example.version&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;parent-pom&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;packaging&amp;gt;&lt;/span&gt;pom&lt;span class="nt"&gt;&amp;lt;/packaging&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;modules&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;module&amp;gt;&lt;/span&gt;submodule-1&lt;span class="nt"&gt;&amp;lt;/module&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;module&amp;gt;&lt;/span&gt;submodule-2&lt;span class="nt"&gt;&amp;lt;/module&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/modules&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;and the ones for modules:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;project&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;parent&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.github.jcgay.example.version&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;parent-pom&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/parent&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;submodule-1&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Project version is duplicated in each module&amp;rsquo;s &lt;code&gt;pom.xml&lt;/code&gt;, it&amp;rsquo;s easy to change them with the &lt;a href="http://www.mojohaus.org/versions-maven-plugin/" target="_blank" rel="noreferrer"&gt;Versions&lt;/a&gt; plugin. But merges between branches are a pain, conflicts are happening and we just can&amp;rsquo;t keep the changes from one of the branch 😓.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Define the version with a property
 &lt;div id="define-the-version-with-a-property" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#define-the-version-with-a-property" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;First try, extract the version is a Maven property.
Our parent pom becomes:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;project&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.github.jcgay.example.version&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;parent-pom&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${my-version}&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;packaging&amp;gt;&lt;/span&gt;pom&lt;span class="nt"&gt;&amp;lt;/packaging&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;properties&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;my-version&amp;gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span class="nt"&gt;&amp;lt;/my-version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/properties&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;modules&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;module&amp;gt;&lt;/span&gt;submodule-1&lt;span class="nt"&gt;&amp;lt;/module&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;module&amp;gt;&lt;/span&gt;submodule-2&lt;span class="nt"&gt;&amp;lt;/module&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/modules&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;and the module use the same &lt;code&gt;${my-version}&lt;/code&gt; property to designate its parent:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;project&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;parent&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.github.jcgay.example.version&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;parent-pom&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${my-version}&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/parent&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;submodule-2&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Surprisingly it works 😲&lt;br&gt;
Only downside is that warning messages are displayed by Maven.&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Some problems were encountered while building the effective model for com.github.jcgay.example.version:submodule-1:jar:1.0-SNAPSHOT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#39;version&amp;#39; contains an expression but should be a constant. @ com.github.jcgay.example.version:parent-pom:${my-version}, /Users/jcgay/dev/toolbox-examples/unique-maven-version/pom.xml, line 7, column 14
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Some problems were encountered while building the effective model for com.github.jcgay.example.version:submodule-2:jar:1.0-SNAPSHOT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#39;version&amp;#39; contains an expression but should be a constant. @ com.github.jcgay.example.version:parent-pom:${my-version}, /Users/jcgay/dev/toolbox-examples/unique-maven-version/pom.xml, line 7, column 14
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Some problems were encountered while building the effective model for com.github.jcgay.example.version:parent-pom:pom:1.0-SNAPSHOT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#39;version&amp;#39; contains an expression but should be a constant. @ com.github.jcgay.example.version:parent-pom:${my-version}, /Users/jcgay/dev/toolbox-examples/unique-maven-version/pom.xml, line 7, column 14
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;It is highly recommended to fix these problems because they threaten the stability of your build.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;For this reason, future Maven versions might no longer support building such malformed projects.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;So we can&amp;rsquo;t just really use that, and there is also a much bigger problem but we will discover it later.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Continuous delivery friendly version
 &lt;div id="continuous-delivery-friendly-version" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#continuous-delivery-friendly-version" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;Since &lt;a href="https://maven.apache.org/docs/3.2.1/release-notes.html" target="_blank" rel="noreferrer"&gt;Maven 3.2.1&lt;/a&gt; we can use registered properties to hide the previous warning messages.&lt;/p&gt;
&lt;p&gt;Replacing the property &lt;code&gt;my-version&lt;/code&gt; by &lt;code&gt;revision&lt;/code&gt; will do the trick 🎆.&lt;/p&gt;
&lt;p&gt;But the real problem is showing now&amp;hellip; When Maven install (or deploy) ours artifacts, &lt;code&gt;pom.xml&lt;/code&gt; are copied without modification (&lt;code&gt;${revision}&lt;/code&gt; properties are not replaced by their resolved value). If you try to depend on one of these artifacts it will fail because &lt;code&gt;${revision}&lt;/code&gt; will not be set in this outside project.&lt;/p&gt;
&lt;p&gt;Example with this simple project which is not built within &lt;code&gt;parent-pom&lt;/code&gt; reactor:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;project&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.github.jcgay.example.version&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;independant-project&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.github.jcgay.example.version&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;submodule-1&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;When we launch a build:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$&amp;gt; mvn test
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Scanning for projects...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Using the MultiThreadedBuilder implementation with a thread count of 4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Building independant-project 1.0-SNAPSHOT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Downloading: https://repo.maven.apache.org/maven2/com/github/jcgay/example/version/parent-pom/$%7Brevision%7D/parent-pom-$%7Brevision%7D.pom
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BUILD FAILURE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Total time: 0.882 s (Wall Clock)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Finished at: 2016-08-09T15:26:09+02:00
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Final Memory: 12M/193M
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Failed to execute goal on project independant-project: Could not resolve dependencies for project com.github.jcgay.example.version:independant-project:jar:1.0-SNAPSHOT: Failed to collect dependencies at com.github.jcgay.example.version:submodule-1:jar:1.0-SNAPSHOT: Failed to read artifact descriptor for com.github.jcgay.example.version:submodule-1:jar:1.0-SNAPSHOT: Could not find artifact com.github.jcgay.example.version:parent-pom:pom:${revision} in central (https://repo.maven.apache.org/maven2) -&amp;gt; [Help 1]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;In fact the &lt;code&gt;pom.xml&lt;/code&gt; available in the local repository still defines &lt;code&gt;${revision}&lt;/code&gt; as a &lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt; for the &lt;code&gt;pom-parent&lt;/code&gt;.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Filtering pom at installation/deployment
 &lt;div id="filtering-pom-at-installationdeployment" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#filtering-pom-at-installationdeployment" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;These non filtered properties remind me an old &lt;a href="https://axelfontaine.com/blog/maven-releases-steroids-2.html" target="_blank" rel="noreferrer"&gt;blog post&lt;/a&gt;. The author was filtering (with &lt;code&gt;maven-resources-plugin&lt;/code&gt;) its &lt;code&gt;pom.xml&lt;/code&gt; to install them instead of the originals. I was wondering if this could be achieved by a Maven extension (the amount of necessary XML and the &lt;em&gt;hacky&lt;/em&gt; feeling of the solution just discourage me&amp;hellip;). This is doable with &lt;a href="http://www.eclipse.org/aether/" target="_blank" rel="noreferrer"&gt;Aether&lt;/a&gt; (used by Maven 3) by implementing a &lt;a href="http://download.eclipse.org/aether/aether-core/1.0.1/apidocs/index.html?org/eclipse/aether/impl/MetadataGenerator.html" target="_blank" rel="noreferrer"&gt;&lt;code&gt;org.eclipse.aether.impl.MetadataGenerator&lt;/code&gt;&lt;/a&gt;. We can code our &lt;em&gt;hack&lt;/em&gt; 🤔.&lt;/p&gt;
&lt;p&gt;Code is available at &lt;a href="https://github.com/jcgay/unique-revision-maven-filtering" target="_blank" rel="noreferrer"&gt;GitHub&lt;/a&gt;. This a Maven extension which will &lt;em&gt;transform&lt;/em&gt; &lt;code&gt;pom&lt;/code&gt; artifacts when installing and deploying. Each &lt;code&gt;${revision}&lt;/code&gt; occurrence is replaced by the artifact&amp;rsquo;s resolved version. Problem solved!&lt;/p&gt;
&lt;p&gt;Activate it using the &lt;a href="http://takari.io/2015/03/19/core-extensions.html" target="_blank" rel="noreferrer"&gt;core extensions configuration mechanism&lt;/a&gt; by creating a &lt;code&gt;${maven.multiModuleProjectDirectory}/.mvn/extensions.xml&lt;/code&gt; file with:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;extensions&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;extension&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;fr.jcgay.maven.extension&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;unique-revision-maven-filtering&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;[latest-version]&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/extension&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/extensions&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;or by copying &lt;a href="https://bintray.com/jcgay/maven/unique-revision-maven-filtering" target="_blank" rel="noreferrer"&gt;jar&lt;/a&gt; to &lt;code&gt;%M2_HOME%/lib/ext&lt;/code&gt;.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Conclusion
 &lt;div id="conclusion" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#conclusion" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;We can now use a unique property to set version across all modules in a multi-modules project. This does not seems to play by the rules of the continuous delivery friendly version but merges can now be done without resolving multiple conflicts on &lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt; XML elements!&lt;br&gt;
I may have totally missed a simpler way to do this ? (in that case I&amp;rsquo;d really like to know it 😉).&lt;/p&gt;</description></item><item><title>Deploy Maven SNAPSHOT with Travis CI</title><link>https://jeanchristophegay.com/en/posts/deploy-snapshot-travis-ci/</link><pubDate>Wed, 29 Jul 2015 21:23:00 +0200</pubDate><guid>https://jeanchristophegay.com/en/posts/deploy-snapshot-travis-ci/</guid><description>&lt;p&gt;Guide to deploy SNAPSHOT binaries on &lt;a href="https://oss.sonatype.org" target="_blank" rel="noreferrer"&gt;OSS sonatype&lt;/a&gt; repository with &lt;a href="http://travis-ci.org/" target="_blank" rel="noreferrer"&gt;Travis CI&lt;/a&gt;.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Maven configuration
 &lt;div id="maven-configuration" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#maven-configuration" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;Maven must be setup to use your personal account to access sonatype repository.
Create a &lt;code&gt;etc/deploy-settings.xml&lt;/code&gt; file and use variables to set username and password:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;settings&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;servers&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;server&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;ossrh&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;username&amp;gt;&lt;/span&gt;${env.OSSRH_USER}&lt;span class="nt"&gt;&amp;lt;/username&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;password&amp;gt;&lt;/span&gt;${env.OSSRH_PASS}&lt;span class="nt"&gt;&amp;lt;/password&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/server&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/servers&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/settings&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This file will be passed to &lt;code&gt;mvn&lt;/code&gt; with the option &lt;code&gt;--settings&lt;/code&gt;.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Identification
 &lt;div id="identification" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#identification" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;We have two solutions to store ours username and password for Travis CI.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Repository settings
 &lt;div id="repository-settings" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#repository-settings" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;In Travis CI repository settings &lt;code&gt;https://travis-ci.org/user/repository/settings&lt;/code&gt;, we can define &lt;a href="https://docs.travis-ci.com/user/environment-variables/#Defining-Variables-in-Repository-Settings" target="_blank" rel="noreferrer"&gt;environment variables&lt;/a&gt; &lt;code&gt;OSSRH_USER&lt;/code&gt; and &lt;code&gt;OSSRH_PASS&lt;/code&gt;. They will be hidden in logs by default.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Encrypt username and password
 &lt;div id="encrypt-username-and-password" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#encrypt-username-and-password" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Obviously we don&amp;rsquo;t want to store our sensible data in clear text, &lt;a href="http://docs.travis-ci.com/user/encryption-keys/" target="_blank" rel="noreferrer"&gt;Travis CI&lt;/a&gt; allow us to encrypt data.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gem install travis
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And here comes Ruby&amp;hellip; if you&amp;rsquo;re not a ruby developper, things can go wrong from here (at least with OS X).&lt;br&gt;
In my case I faced the error:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; gem install travis 
Fetching: multipart-post-2.0.0.gem (100%)
ERROR: While executing gem ... (Gem::FilePermissionError)
 You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The problem comes from the bundled version installed by Apple, Ruby users are certainly using &lt;code&gt;rvm&lt;/code&gt;, &lt;code&gt;rbenv&lt;/code&gt; or some other tool. But for others who don&amp;rsquo;t want to waste time trying to figure out the Ruby ecosystem, just:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install ruby
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Relaunch a shell and &lt;code&gt;travis&lt;/code&gt; gem installation should succeed&amp;hellip;&lt;/p&gt;
&lt;p&gt;We can finally ask &lt;code&gt;travis&lt;/code&gt; to encrypt our username and password:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;travis encrypt --add -r jcgay/send-notification &amp;quot;OSSRH_USER='toto'&amp;quot;
travis encrypt --add -r jcgay/send-notification &amp;quot;OSSRH_PASS='s3cret&amp;amp;'&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If commands are executed from the project folder, option &lt;code&gt;-r&lt;/code&gt; is not necessary and you can use &lt;code&gt;--add&lt;/code&gt; to automatically write encrypted keys in &lt;code&gt;.travis.yml&lt;/code&gt;.
&lt;code&gt;jcgay/send-notification&lt;/code&gt; is the project you want to encrypt keys for.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Configuration de Travis CI
 &lt;div id="configuration-de-travis-ci" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#configuration-de-travis-ci" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;We don&amp;rsquo;t want to deploy SNAPSHOT when Travis is building a pull-request. We can read &lt;code&gt;${TRAVIS_PULL_REQUEST}&lt;/code&gt; variable to skip deployment when its value equals &lt;code&gt;false&lt;/code&gt;.
Same goes when Travis is building a release, as they are made outside Travis in my case, I don&amp;rsquo;t want a deployment when &lt;code&gt;${TRAVIS_TAG}&lt;/code&gt; variable is not empty.&lt;/p&gt;
&lt;p&gt;So our &lt;code&gt;.travis.yml&lt;/code&gt; contains:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;env:
 global:
 - secure: GT8Hi5kgx2cLAGzh2ggZNTgiLm8J5fd64SYG3bkhgwZGbV/HRD8r8a1SYv1iQ72JqrDhlHQ7q8h17nDBFLjy99h/XKN4MacBu9CZhnPO7lXpuRefD3W/db6zWSk17a5DAKAt+1UOeyfohEkzx+JHcTfbvMg6hy+3DEPaVMUtV04=
 - secure: fQ4bSOcHWEURfsDQVhWA152GCiezQfh9YC45a2zae8oOk+6bIrHmrkJSyVYpUCLGdqO3Df+JTy6bfoqyJEsX7PkzGPZ10odSHw5qDqfTIolt7UympKtUvUNi6h5G6virGhBWjjs5REGjrgWdTlqKjNT2Ax/VlzNRskqaVAhEhl0=
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and one more step as &lt;code&gt;after_success:&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;after_success:
 - &amp;quot;[[ ${TRAVIS_PULL_REQUEST} == 'false' ]] &amp;amp;&amp;amp; [[ ${TRAVIS_TAG} == '' ]] &amp;amp;&amp;amp; mvn deploy -DskipTests --settings etc/deploy-settings.xml&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enjoy fresh deployed SNAPSHOT !&lt;/p&gt;</description></item><item><title>Desktop notifications for Gradle</title><link>https://jeanchristophegay.com/en/posts/gradle-desktop-notification/</link><pubDate>Wed, 13 May 2015 17:35:00 +0200</pubDate><guid>https://jeanchristophegay.com/en/posts/gradle-desktop-notification/</guid><description>&lt;p&gt;When building projects, time can pass slowly&amp;hellip; Most of the time they run as background tasks and I like to have a notification when they have finished.&lt;br&gt;
There is a built-in plugin for Gradle to send notifications but we&amp;rsquo;ll see how to get more possible notifiers !&lt;/p&gt;

&lt;h1 class="relative group"&gt;Gradle Build Announcements
 &lt;div id="gradle-build-announcements" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#gradle-build-announcements" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;This is the built-in &lt;a href="https://gradle.org/docs/current/userguide/build_announcements_plugin.html" target="_blank" rel="noreferrer"&gt;plugin&lt;/a&gt; distributed with Gradle. It relies on &lt;a href="https://gradle.org/docs/current/userguide/announce_plugin.html" target="_blank" rel="noreferrer"&gt;Announce&lt;/a&gt; plugin, which allow sending custom notifications during a build.&lt;br&gt;
It comes with four possible implementations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;twitter&lt;/li&gt;
&lt;li&gt;notify-send&lt;/li&gt;
&lt;li&gt;Snarl&lt;/li&gt;
&lt;li&gt;Growl&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="growl.success"
 src="https://jeanchristophegay.com/images/gradle.announce.growl.success.thumbnail.png"
 &gt;&lt;/figure&gt;

&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="growl.failure"
 src="https://jeanchristophegay.com/images/gradle.announce.growl.failure.png"
 &gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;It is easy to activate, just add in your &lt;code&gt;build.gradle&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apply plugin: 'build-announcements'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or use it in &lt;code&gt;$HOME/.gradle/init.gradle&lt;/code&gt; to have the plugin running by default for all your Gradle projects:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rootProject {
 apply plugin: 'build-announcements'
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It is really nice to have this functionality available without extra installation&amp;hellip; But there is not so much tools available and sent notifications lack of visual distinction (icon is always the same whatever the build result).&lt;/p&gt;

&lt;h1 class="relative group"&gt;Gradle notifier
 &lt;div id="gradle-notifier" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#gradle-notifier" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;As I already have written my own notifications for Maven with &lt;a href="https://github.com/jcgay/maven-notifier" target="_blank" rel="noreferrer"&gt;maven-notifier&lt;/a&gt;, I have just migrated them to run with Gradle in &lt;a href="https://github.com/jcgay/gradle-notifier" target="_blank" rel="noreferrer"&gt;gradle-notifier&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;It comes with support for:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: center"&gt;Notifier&lt;/th&gt;
					&lt;th&gt;Screenshot&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;Growl&lt;/strong&gt;, for &lt;a href="http://www.growlforwindows.com/gfw/" target="_blank" rel="noreferrer"&gt;Windows&lt;/a&gt; and &lt;a href="http://growl.info/" target="_blank" rel="noreferrer"&gt;OS X&lt;/a&gt;.&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Growl"
 src="https://jeanchristophegay.com/images/gradle.notifier.growl.thumbnail.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;&lt;a href="http://snarl.fullphat.net/" target="_blank" rel="noreferrer"&gt;Snarl&lt;/a&gt;&lt;/strong&gt;, for Windows&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Snarl"
 src="https://jeanchristophegay.com/images/gradle.notifier.snarl.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;&lt;a href="https://github.com/alloy/terminal-notifier" target="_blank" rel="noreferrer"&gt;terminal-notifier&lt;/a&gt;&lt;/strong&gt;, OS X&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="terminal-notifier"
 src="https://jeanchristophegay.com/images/gradle.notifier.notificationcenter.thumbnail.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;notification center&lt;/strong&gt; OS X (since Mavericks)&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="notification-center"
 src="https://jeanchristophegay.com/images/notifier.simplenc.thumbnail.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;notify-send&lt;/strong&gt; for Linux&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="notify-send"
 src="https://jeanchristophegay.com/images/gradle.notifier.notifysend.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;SystemTray&lt;/strong&gt; since Java 6&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="System Tray"
 src="https://jeanchristophegay.com/images/notifier.system.tray_.success.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;&lt;a href="https://www.pushbullet.com/" target="_blank" rel="noreferrer"&gt;Pushbullet&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="pushbullet"
 src="https://jeanchristophegay.com/images/gradle.notifier.pushbullet.thumbnail.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;Kdialog&lt;/strong&gt; for KDE&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Kdialog"
 src="https://jeanchristophegay.com/images/gradle.notifier.kdialog.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;&lt;a href="http://www.paralint.com/projects/notifu/index.html" target="_blank" rel="noreferrer"&gt;notifu&lt;/a&gt;&lt;/strong&gt; for Windows&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="notifu"
 src="https://jeanchristophegay.com/images/gradle.notifier.notifu.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;AnyBar&lt;/strong&gt; for &lt;a href="https://github.com/tonsky/AnyBar" target="_blank" rel="noreferrer"&gt;OS X&lt;/a&gt; and &lt;a href="https://github.com/limpbrains/somebar" target="_blank" rel="noreferrer"&gt;Linux&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="anybar"
 src="https://jeanchristophegay.com/images/gradle.notifier.anybar.thumbnail.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;&lt;a href="https://github.com/nels-o/toaster" target="_blank" rel="noreferrer"&gt;Toaster&lt;/a&gt;&lt;/strong&gt; for Windows 8&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Toaster"
 src="https://jeanchristophegay.com/images/gradle.notifier.toaster.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;&lt;a href="https://github.com/dorkbox/Notify" target="_blank" rel="noreferrer"&gt;Notify&lt;/a&gt;&lt;/strong&gt; since Java 6&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Notify"
 src="https://jeanchristophegay.com/images/notifier.notify.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;&lt;a href="https://github.com/Windos/BurntToast" target="_blank" rel="noreferrer"&gt;BurntToast&lt;/a&gt;&lt;/strong&gt; for Windows 10&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="BurntToast"
 src="https://jeanchristophegay.com/images/notifier.burnttoast.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;&lt;a href="https://slack.com" target="_blank" rel="noreferrer"&gt;Slack&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Slack"
 src="https://jeanchristophegay.com/images/slack-success.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 class="relative group"&gt;Installation
 &lt;div id="installation" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#installation" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Plugin can be configured in an &lt;a href="http://gradle.org/docs/current/userguide/init_scripts.html" target="_blank" rel="noreferrer"&gt;initialization script&lt;/a&gt; or directly in a &lt;a href="https://gradle.org/docs/current/userguide/plugins.html" target="_blank" rel="noreferrer"&gt;build script&lt;/a&gt;.&lt;/p&gt;

&lt;h3 class="relative group"&gt;Initialization script
 &lt;div id="initialization-script" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#initialization-script" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;Create (or edit) file &lt;code&gt;$HOME/.gradle/init.gradle&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;initscript {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; repositories {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mavenCentral()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dependencies {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; classpath group: &amp;#39;fr.jcgay&amp;#39;, name: &amp;#39;gradle-notifier&amp;#39;, version: &amp;#39;1.1.0&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rootProject {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; apply plugin: fr.jcgay.gradle.notifier.GradleNotifierPlugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 class="relative group"&gt;Build script
 &lt;div id="build-script" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#build-script" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;In your &lt;code&gt;build.gradle&lt;/code&gt;, add:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;buildscript {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; repositories {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mavenCentral()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dependencies {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; classpath group: &amp;#39;fr.jcgay&amp;#39;, name: &amp;#39;gradle-notifier&amp;#39;, version: &amp;#39;1.1.0&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apply plugin: &amp;#39;fr.jcgay.gradle-notifier&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;or by using the plugin mechanism introduced in Gradle 2.1:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;plugins {
 id &amp;quot;fr.jcgay.gradle-notifier&amp;quot; version &amp;quot;1.1.0&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 class="relative group"&gt;Configuration
 &lt;div id="configuration" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#configuration" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;It relies on &lt;a href="https://github.com/jcgay/send-notification" target="_blank" rel="noreferrer"&gt;send-notification&lt;/a&gt;, notifiers configuration and which notifier to use can be set in &lt;code&gt;$HOME/.send-notification&lt;/code&gt; (See available parameters in current &lt;a href="https://github.com/jcgay/send-notification/wiki" target="_blank" rel="noreferrer"&gt;documentation&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Or the plugin can be configured using Gradle extension in targeted script:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;notifier {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; implementation = &amp;#39;notificationcenter&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; threshold {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; time = 10
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; unit = java.util.concurrent.TimeUnit.SECONDS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; growl {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; port = 23053
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; host = &amp;#39;localhost&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; password = &amp;#39;azerty123&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Here it is! No more excuses to forgot your ran a build somewhere!&lt;/p&gt;</description></item><item><title>Profile Maven build</title><link>https://jeanchristophegay.com/en/posts/maven-profiler/</link><pubDate>Sun, 01 Feb 2015 22:33:00 +0200</pubDate><guid>https://jeanchristophegay.com/en/posts/maven-profiler/</guid><description>&lt;p&gt;Tools to measure time spent in your Maven builds.&lt;/p&gt;
&lt;p&gt;By default Maven measure and display per module and total build time without further details.
Hopefully you can use third party tools to profile each executions within your build.&lt;/p&gt;

&lt;h1 class="relative group"&gt;maven-profiler
 &lt;div id="maven-profiler" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#maven-profiler" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;A tool I wrote some time ago because I didn&amp;rsquo;t find what I want. I use it to find which step is consuming most of the time and try to reduce the execution time.&lt;/p&gt;
&lt;p&gt;It can generate a report (HTML or JSON) written in the &lt;code&gt;.profiler&lt;/code&gt; folder inside the project.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jeanchristophegay.com/images/maven-profiler.png" &gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="maven-profiler"
 src="https://jeanchristophegay.com/images/maven-profiler-resize.png"
 &gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To install it follow &lt;a href="https://github.com/jcgay/maven-profiler#installation" target="_blank" rel="noreferrer"&gt;instructions&lt;/a&gt; available on &lt;a href="https://github.com/jcgay/maven-profiler" target="_blank" rel="noreferrer"&gt;github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The report is created when we launch a build with the system property &lt;code&gt;profile&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mvn install -Dprofile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By default, the HTML report is used, to switch for the JSON one:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mvn install -Dprofile -DprofileFormat=JSON
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Report example:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;maven-profiler&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;goals&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;clean install&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;date&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2015/01/17 15:28:49&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nt"&gt;&amp;#34;parameters&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{profile=true, profileFormat=JSON}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;projects&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 &lt;span class="nt"&gt;&amp;#34;project&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;maven-profiler&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;6.793 s&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 	&lt;span class="nt"&gt;&amp;#34;mojos&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 	&lt;span class="nt"&gt;&amp;#34;mojo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.apache.maven.plugins:maven-surefire-plugin:2.18:test {execution: default-test}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		 &lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2.512 s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 		&lt;span class="nt"&gt;&amp;#34;mojo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.apache.maven.plugins:maven-shade-plugin:2.3:shade {execution: default}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 	&lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1.458 s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 		&lt;span class="nt"&gt;&amp;#34;mojo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.codehaus.gmavenplus:gmavenplus-plugin:1.2:testCompile {execution: default}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 	&lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;818.3 ms&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 		&lt;span class="nt"&gt;&amp;#34;mojo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.apache.maven.plugins:maven-compiler-plugin:3.2:compile {execution: default-compile}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 	&lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;538.7 ms&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 		&lt;span class="nt"&gt;&amp;#34;mojo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.apache.maven.plugins:maven-source-plugin:2.4:jar-no-fork {execution: attach-sources}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 	&lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;248.5 ms&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 		&lt;span class="nt"&gt;&amp;#34;mojo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.apache.maven.plugins:maven-jar-plugin:2.5:jar {execution: default-jar}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 	&lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;238.2 ms&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 		&lt;span class="nt"&gt;&amp;#34;mojo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.apache.maven.plugins:maven-resources-plugin:2.7:resources {execution: default-resources}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 	&lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;171.7 ms&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 		&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 		&lt;span class="nt"&gt;&amp;#34;mojo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.codehaus.plexus:plexus-component-metadata:1.6:generate-metadata {execution: default}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 	&lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;170.5 ms&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 		&lt;span class="nt"&gt;&amp;#34;mojo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.apache.maven.plugins:maven-enforcer-plugin:1.2:enforce {execution: enforce-maven}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 	&lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;126.0 ms&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 		&lt;span class="nt"&gt;&amp;#34;mojo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.apache.maven.plugins:maven-clean-plugin:2.6.1:clean {execution: default-clean}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 	&lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;76.11 ms&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 		&lt;span class="nt"&gt;&amp;#34;mojo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.apache.maven.plugins:maven-install-plugin:2.5.2:install {execution: default-install}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 	&lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;53.95 ms&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 		&lt;span class="nt"&gt;&amp;#34;mojo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.apache.maven.plugins:maven-compiler-plugin:3.2:testCompile {execution: default-testCompile}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 	&lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2.850 ms&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 		&lt;span class="nt"&gt;&amp;#34;mojo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.apache.maven.plugins:maven-resources-plugin:2.7:testResources {execution: default-testResources}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 	&lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2.518 ms&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 class="relative group"&gt;maven-timeline
 &lt;div id="maven-timeline" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#maven-timeline" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;This plugin construct a timeline with execution times. Formely developed by &lt;a href="http://blog.javabien.net/2014/04/22/maven-timeline-plugin/" target="_blank" rel="noreferrer"&gt;David Gageot&lt;/a&gt;, it is now maintained by the &lt;a href="https://github.com/takari/maven-timeline" target="_blank" rel="noreferrer"&gt;takari&lt;/a&gt; team.&lt;/p&gt;
&lt;p&gt;To use it add the following extension in your &lt;code&gt;pom.xml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;extension&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.takari.maven&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-timeline&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.6&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/extension&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Two reports are generated, HTML and JSON.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jeanchristophegay.com/images/maven-timeline.png" &gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="maven-timeline"
 src="https://jeanchristophegay.com/images/maven-timeline-resize.png"
 &gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2015-02-01T19:18:18.738Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2015-02-01T19:18:21.770Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;dateTimeFormat&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;iso8601&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;events&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2015-02-01T19:18:20.940Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2015-02-01T19:18:21.095Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;duration&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2380&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;com.github.jcgay.maven.color:maven-color-logback:package:jar:default-jar (2380 ms)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;trackNum&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;blue&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;durationEvent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2015-02-01T19:18:19.136Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2015-02-01T19:18:19.545Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;duration&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;830&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;com.github.jcgay.maven.color:maven-color-core:compile:compile:default-compile (830 ms)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;trackNum&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;blue&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;durationEvent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2015-02-01T19:18:19.562Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2015-02-01T19:18:19.564Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;duration&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;849&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;com.github.jcgay.maven.color:maven-color-agent:test-compile:testCompile:default-testCompile (849 ms)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;trackNum&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;blue&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;durationEvent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2015-02-01T19:18:19.677Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2015-02-01T19:18:19.818Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;duration&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1103&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;com.github.jcgay.maven.color:maven-color-agent:package:jar:default-jar (1103 ms)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;trackNum&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;blue&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;durationEvent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2015-02-01T19:18:20.801Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2015-02-01T19:18:21.549Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;duration&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2834&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;com.github.jcgay.maven.color:maven-color-log4j2:package:single:make-assembly (2834 ms)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;trackNum&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;blue&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;durationEvent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 class="relative group"&gt;tesla-profiler
 &lt;div id="tesla-profiler" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#tesla-profiler" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;Another &lt;a href="https://github.com/takari/maven-profiler" target="_blank" rel="noreferrer"&gt;profiler&lt;/a&gt; displaying build times in the console output.&lt;/p&gt;
&lt;p&gt;The report is displayed when we launch the build with the system property &lt;code&gt;maven.profile&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mvn install -Dmaven.profile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Result example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;com.github.jcgay.maven:maven-profiler:2.2-SNAPSHOT

 clean 81ms
 org.apache.maven.plugins:maven-clean-plugin:2.6.1 (default-clean) 80ms

 validate 145ms
 org.apache.maven.plugins:maven-enforcer-plugin:1.2 (enforce-maven) 145ms

 process-resources 198ms
 org.apache.maven.plugins:maven-resources-plugin:2.7 (default-resources) 198ms

 compile 588ms
 org.apache.maven.plugins:maven-compiler-plugin:3.2 (default-compile) 588ms

 process-classes 209ms
 org.codehaus.plexus:plexus-component-metadata:1.6 (default) 209ms

 process-test-resources 3ms
 org.apache.maven.plugins:maven-resources-plugin:2.7 (default-testResources) 3ms

 test-compile 1s 2ms
 org.apache.maven.plugins:maven-compiler-plugin:3.2 (default-testCompile) 3ms
 org.codehaus.gmavenplus:gmavenplus-plugin:1.2 (default) 998ms

 test 2s 670ms
 org.apache.maven.plugins:maven-surefire-plugin:2.18 (default-test) 2s 669ms

 package 2s 778ms
 org.apache.maven.plugins:maven-jar-plugin:2.5 (default-jar) 250ms
 org.apache.maven.plugins:maven-source-plugin:2.4 (attach-sources) 270ms
 org.apache.maven.plugins:maven-shade-plugin:2.3 (default) 2s 258ms
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Happy profiling !&lt;/p&gt;</description></item><item><title>Color and desktop notifications for Maven</title><link>https://jeanchristophegay.com/en/posts/maven-completion-couleurs-et-notifications/</link><pubDate>Sun, 04 May 2014 17:58:00 +0200</pubDate><guid>https://jeanchristophegay.com/en/posts/maven-completion-couleurs-et-notifications/</guid><description>&lt;p&gt;Maven, is not the sexiest tool available out there&amp;hellip; Used within your IDE, it will be hidden but it deserve better inside your preferred shell.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Completion
 &lt;div id="completion" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#completion" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;There are a couple of bash completion scripts for Maven:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/juven/maven-bash-completion" target="_blank" rel="noreferrer"&gt;maven-bash-completion&lt;/a&gt; is a static list of plugins/goals/options. It is great, but each plugin must be described in the script to have auto completion suggestion.&lt;/li&gt;
&lt;li&gt;Another one is available as a &lt;a href="http://packages.ubuntu.com/quantal/maven" target="_blank" rel="noreferrer"&gt;ubuntu package&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;rsquo;re a &lt;code&gt;zsh&lt;/code&gt; user:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;with &lt;a href="https://github.com/robbyrussell/oh-my-zsh" target="_blank" rel="noreferrer"&gt;oh-my-zsh&lt;/a&gt; framework, the &lt;code&gt;mvn&lt;/code&gt; plugin handle auto completion and you get a bunch of aliases with it too.&lt;/li&gt;
&lt;li&gt;in &lt;a href="https://github.com/zsh-users/zsh-completions" target="_blank" rel="noreferrer"&gt;zsh-completions&lt;/a&gt;, a script allow to discover plugin goals dynamically the first time you try to reach it (&lt;code&gt;mvn plugin:&amp;lt;TAB&amp;gt;&lt;/code&gt;). First completion is a little bit longer but next ones will be immediate (Thanks &lt;a href="http://www.tomsquest.com" target="_blank" rel="noreferrer"&gt;Thomas Queste&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 class="relative group"&gt;Desktop Notifications
 &lt;div id="desktop-notifications" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#desktop-notifications" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;A fast build is awesome&amp;hellip; but it is not always possible to have one (for bad or good reasons by the way).&lt;br&gt;
Having to stay in front of your shell to wait for it is not really useful, in that case a desktop notification at the end of the build is your savior.&lt;/p&gt;

&lt;h2 class="relative group"&gt;maven-notifier
 &lt;div id="maven-notifier" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#maven-notifier" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;I have written a Maven extension to send a notification when a build ends: &lt;a href="https://github.com/jcgay/maven-notifier" target="_blank" rel="noreferrer"&gt;maven-notifier&lt;/a&gt;. It works with all major operating systems.&lt;br&gt;
By default, the extension will try to find an available notifier on your system.&lt;br&gt;
It is possible to configure which notifier you want to use (and many more) by creating a &lt;a href="https://github.com/jcgay/maven-notifier/wiki#configuration" target="_blank" rel="noreferrer"&gt;maven-notifier.properties&lt;/a&gt; file.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: center"&gt;Notifier&lt;/th&gt;
					&lt;th&gt;Screenshot&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;Growl&lt;/strong&gt;, for &lt;a href="http://www.growlforwindows.com/gfw/" target="_blank" rel="noreferrer"&gt;Windows&lt;/a&gt; and &lt;a href="http://growl.info/" target="_blank" rel="noreferrer"&gt;OS X&lt;/a&gt;.&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="maven-notifier-growl"
 src="https://jeanchristophegay.com/images/maven-notifier-growl.png"
 &gt;&lt;figcaption&gt;maven-notifier-growl&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;&lt;a href="http://snarl.fullphat.net/" target="_blank" rel="noreferrer"&gt;Snarl&lt;/a&gt;&lt;/strong&gt;, for Windows&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="maven-notifier-snarl"
 src="https://jeanchristophegay.com/images/notifier.snarl.success.png"
 &gt;&lt;figcaption&gt;maven-notifier-snarl&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;&lt;a href="https://github.com/alloy/terminal-notifier" target="_blank" rel="noreferrer"&gt;terminal-notifier&lt;/a&gt;&lt;/strong&gt;, OS X&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="notification-center"
 src="https://jeanchristophegay.com/images/notifier.notification-center.success.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;notification center&lt;/strong&gt; OS X (since Mavericks)&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="simple-nc"
 src="https://jeanchristophegay.com/images/notifier.simplenc.thumbnail.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;notify-send&lt;/strong&gt; for Linux&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="notify-send"
 src="https://jeanchristophegay.com/images/notifier.notify-send.error_.fail_.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;SystemTray&lt;/strong&gt; since Java 6&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="system-tray"
 src="https://jeanchristophegay.com/images/notifier.system.tray_.fail_.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;&lt;a href="https://www.pushbullet.com/" target="_blank" rel="noreferrer"&gt;Pushbullet&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="maven-notifier-pushbullet"
 src="https://jeanchristophegay.com/images/notifier.pushbullet.success.png"
 &gt;&lt;figcaption&gt;maven-notifier-pushbullet&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;Kdialog&lt;/strong&gt; for KDE&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="maven-notifier-kdialog"
 src="https://jeanchristophegay.com/images/notifier.kdialog.success.png"
 &gt;&lt;figcaption&gt;maven-notifier-kdialog&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;&lt;a href="http://www.paralint.com/projects/notifu/index.html" target="_blank" rel="noreferrer"&gt;notifu&lt;/a&gt;&lt;/strong&gt; for Windows&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="maven-notifier-notifu"
 src="https://jeanchristophegay.com/images/notifier.notifu.success.png"
 &gt;&lt;figcaption&gt;maven-notifier-notifu&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;AnyBar&lt;/strong&gt; for &lt;a href="https://github.com/tonsky/AnyBar" target="_blank" rel="noreferrer"&gt;OS X&lt;/a&gt; and &lt;a href="https://github.com/limpbrains/somebar" target="_blank" rel="noreferrer"&gt;Linux&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="anybar"
 src="https://jeanchristophegay.com/images/notifier.anybar_maven.png"
 &gt;&lt;figcaption&gt;maven-notifier-anybar&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;&lt;a href="https://github.com/nels-o/toaster" target="_blank" rel="noreferrer"&gt;Toaster&lt;/a&gt;&lt;/strong&gt; for Windows 8&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="toaster"
 src="https://jeanchristophegay.com/images/notifier.toaster.failure.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;&lt;a href="https://github.com/dorkbox/Notify" target="_blank" rel="noreferrer"&gt;Notify&lt;/a&gt;&lt;/strong&gt; since Java 6&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Notify"
 src="https://jeanchristophegay.com/images/notifier.notify.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;&lt;a href="https://github.com/Windos/BurntToast" target="_blank" rel="noreferrer"&gt;BurntToast&lt;/a&gt;&lt;/strong&gt; for Windows 10&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="BurntToast"
 src="https://jeanchristophegay.com/images/notifier.burnttoast.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;strong&gt;&lt;a href="https://slack.com" target="_blank" rel="noreferrer"&gt;Slack&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Slack"
 src="https://jeanchristophegay.com/images/slack-success.png"
 &gt;&lt;/figure&gt;
&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 class="relative group"&gt;Scripts
 &lt;div id="scripts" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#scripts" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;You can also use scripts that will wrap &lt;code&gt;mvn&lt;/code&gt; command to get its status and then send a notification.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Growl with &lt;a href="http://growl.info/extras.php#growlnotify" target="_blank" rel="noreferrer"&gt;growlnotify&lt;/a&gt; : &lt;a href="http://blank.jasonwhaley.com/2009/02/growl-maven-integration.html" target="_blank" rel="noreferrer"&gt;Integrate Growl with Maven&lt;/a&gt;, &lt;a href="https://github.com/geoffreywiseman/maven-growl" target="_blank" rel="noreferrer"&gt;maven-growl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;notification center with &lt;a href="https://github.com/alloy/terminal-notifier" target="_blank" rel="noreferrer"&gt;terminal-notifier&lt;/a&gt; : &lt;a href="https://github.com/geoffreywiseman/maven-notification-center" target="_blank" rel="noreferrer"&gt;maven-notification-center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;notify-send : &lt;a href="http://blog.progs.be/467/notification-maven-build-finishe" target="_blank" rel="noreferrer"&gt;Integrate notify-send with Maven.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 class="relative group"&gt;Colors
 &lt;div id="colors" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#colors" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;Maven standard output is sad. It is not easy to differentiate the various level messages.&lt;/p&gt;

&lt;h2 class="relative group"&gt;maven-color
 &lt;div id="maven-color" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#maven-color" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jcgay/maven-color" target="_blank" rel="noreferrer"&gt;maven-color&lt;/a&gt; colorize Maven output.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://asciinema.org/a/20053?autoplay=1" target="_blank" rel="noreferrer"&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="asciicast"
 src="https://asciinema.org/a/20053.svg"
 &gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Since Maven 3.1.0, &lt;a href="http://www.slf4j.org/" target="_blank" rel="noreferrer"&gt;SLF4J&lt;/a&gt; is used internally, meaning you can choose which Logging framework you want to use.&lt;br&gt;
&lt;a href="http://aheritier.net/united-colors-of-maven/" target="_blank" rel="noreferrer"&gt;This blog entry&lt;/a&gt; explains how you can customize your Maven installation to have colors in your logs with &lt;a href="http://logging.apache.org/log4j/2.x/" target="_blank" rel="noreferrer"&gt;Log4j 2&lt;/a&gt; or &lt;a href="http://logback.qos.ch/" target="_blank" rel="noreferrer"&gt;Logback&lt;/a&gt;. This is how &lt;a href="https://github.com/jcgay/maven-color#maven--31x" target="_blank" rel="noreferrer"&gt;maven-color&lt;/a&gt; works.&lt;/p&gt;
&lt;p&gt;For older versions (between 3.0.x and 3.1.x) I have used &lt;a href="http://jansi.fusesource.org/" target="_blank" rel="noreferrer"&gt;Jansi&lt;/a&gt; to write log in color and a java agent to replace dynamically the logger implementation used by Maven. It works with interactive goals but it is kind of hard to install and maintain across Maven different versions. It breaks easily if Maven changes the way they implements their internal code. Grab it at &lt;a href="https://github.com/jcgay/maven-color#maven-30x" target="_blank" rel="noreferrer"&gt;maven-color&lt;/a&gt;.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Scripts
 &lt;div id="scripts-1" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#scripts-1" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Some scripts are wrapping &lt;code&gt;mvn&lt;/code&gt; command to colorize output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/tomsquest/dotfiles/blob/master/zsh/functions/mvn-in-colors.zsh" target="_blank" rel="noreferrer"&gt;mvn-in-colors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ccouturi/mvnc" target="_blank" rel="noreferrer"&gt;mvnc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/builddoctor/maven-antsy-color" target="_blank" rel="noreferrer"&gt;maven-antsy-color&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is sweet but it does not work with interactive goals. Don&amp;rsquo;t try to use &lt;code&gt;maven-release-plugin&lt;/code&gt; or &lt;code&gt;maven-archetype-plugin&lt;/code&gt; in interactive mode, it will poorly fail when you will need to input text.&lt;/p&gt;

&lt;h1 class="relative group"&gt;All in one (OS X)
 &lt;div id="all-in-one-os-x" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#all-in-one-os-x" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;To gain installation time, I have written a brew formula.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew tap jcgay/jcgay
brew install maven-deluxe
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will install latest Maven version, &lt;a href="https://github.com/jcgay/maven-notifier" target="_blank" rel="noreferrer"&gt;maven-notifier&lt;/a&gt;, &lt;a href="https://github.com/jcgay/maven-color" target="_blank" rel="noreferrer"&gt;maven-color&lt;/a&gt; and &lt;a href="https://github.com/jcgay/maven-profiler" target="_blank" rel="noreferrer"&gt;maven-profiler&lt;/a&gt;.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Conclusion
 &lt;div id="conclusion" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#conclusion" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Xzibit"
 src="https://jeanchristophegay.com/images/pimpmyride.jpg"
 &gt;&lt;figcaption&gt;Xzibit&lt;/figcaption&gt;&lt;/figure&gt;
&lt;br&gt;
Thanks Xzibit for pimping my Maven !&lt;/p&gt;</description></item><item><title>Show Maven build plan</title><link>https://jeanchristophegay.com/en/posts/maven-build-plan/</link><pubDate>Sat, 22 Mar 2014 19:24:00 +0200</pubDate><guid>https://jeanchristophegay.com/en/posts/maven-build-plan/</guid><description>&lt;p&gt;I often find myself in front of a &lt;a href="https://maven.apache.org/guides/introduction/introduction-to-the-pom.html" target="_blank" rel="noreferrer"&gt;POM&lt;/a&gt; scratching my head while trying to find what Maven will execute during my build. Since Maven 3 it is possible to calculate execution plan by simulating the build. Strangely there is not easy way do display it. Here is &lt;a href="http://buildplan.jcgay.fr" target="_blank" rel="noreferrer"&gt;buildplan-maven-plugin&lt;/a&gt;.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Configuration
 &lt;div id="configuration" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#configuration" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;To easily use the plugin, add its &lt;code&gt;groupId&lt;/code&gt; in your Maven configuration (ie &lt;code&gt;settings.xml&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;pluginGroups&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;pluginGroup&amp;gt;&lt;/span&gt;fr.jcgay.maven.plugins&lt;span class="nt"&gt;&amp;lt;/pluginGroup&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/pluginGroups&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 class="relative group"&gt;Show build plan
 &lt;div id="show-build-plan" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#show-build-plan" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;It is possible to list goals executed during a build. The simulated phase is &lt;code&gt;deploy&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; mvn buildplan:list

[INFO] --- buildplan-maven-plugin:1.0:list (default-cli) @ maven-notifier ---
[INFO] ----------------------------------------------------------------------------------------------
[INFO] PLUGIN | PHASE | ID | GOAL
[INFO] ----------------------------------------------------------------------------------------------
[INFO] maven-resources-plugin | process-resources | default-resources | resources
[INFO] maven-compiler-plugin | compile | default-compile | compile
[INFO] plexus-component-metadata | process-classes | default | generate-metadata
[INFO] maven-resources-plugin | process-test-resources | default-testResources | testResources
[INFO] maven-compiler-plugin | test-compile | default-testCompile | testCompile
[INFO] maven-surefire-plugin | test | default-test | test
[INFO] maven-dependency-plugin | process-sources | get-logging-binding | copy
[INFO] maven-jar-plugin | package | default-jar | jar
[INFO] maven-shade-plugin | package | default | shade
[INFO] maven-assembly-plugin | | make-assembly | single
[INFO] maven-source-plugin | package | default | jar-no-fork
[INFO] maven-install-plugin | install | default-install | install
[INFO] maven-deploy-plugin | deploy | default-deploy | deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;h1 class="relative group"&gt;Show phases
 &lt;div id="show-phases" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#show-phases" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;A view per phase is available. This way, we can quickly see which plugins are used during a phase.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; mvn buildplan:list-phase

[INFO] --- buildplan-maven-plugin:1.0:list-phase (default-cli) @ maven-notifier ---
[INFO] install --------------------------------------------------------------------
[INFO] + maven-install-plugin | default-install | install
[INFO] process-resources ----------------------------------------------------------
[INFO] + maven-resources-plugin | default-resources | resources
[INFO] process-sources ------------------------------------------------------------
[INFO] + maven-dependency-plugin | get-logging-binding | copy
[INFO] test -----------------------------------------------------------------------
[INFO] + maven-surefire-plugin | default-test | test
[INFO] test-compile ---------------------------------------------------------------
[INFO] + maven-compiler-plugin | default-testCompile | testCompile
[INFO] process-test-resources -----------------------------------------------------
[INFO] + maven-resources-plugin | default-testResources | testResources
[INFO] process-classes ------------------------------------------------------------
[INFO] + plexus-component-metadata | default | generate-metadata
[INFO] compile --------------------------------------------------------------------
[INFO] + maven-compiler-plugin | default-compile | compile
[INFO] default-phase --------------------------------------------------------------
[INFO] + maven-assembly-plugin | make-assembly | single
[INFO] package --------------------------------------------------------------------
[INFO] + maven-jar-plugin | default-jar | jar
[INFO] + maven-shade-plugin | default | shade
[INFO] + maven-source-plugin | default | jar-no-fork
[INFO] deploy ---------------------------------------------------------------------
[INFO] + maven-deploy-plugin | default-deploy | deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Filtering phase using parameter &lt;code&gt;buildplan.phase&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mvn buildplan:list-phase -Dbuildplan.phase=test
&lt;/code&gt;&lt;/pre&gt;

&lt;h1 class="relative group"&gt;Show plugins
 &lt;div id="show-plugins" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#show-plugins" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;In this cas, executions are grouped by plugin.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; mvn buildplan:list-plugin

[INFO] --- buildplan-maven-plugin:1.0:list-plugin (default-cli) @ maven-notifier ---
[INFO] maven-deploy-plugin -----------------------------------------------------
[INFO] + deploy | default-deploy | deploy
[INFO] maven-source-plugin -----------------------------------------------------
[INFO] + package | default | jar-no-fork
[INFO] maven-assembly-plugin ---------------------------------------------------
[INFO] + | make-assembly | single
[INFO] maven-dependency-plugin -------------------------------------------------
[INFO] + process-sources | get-logging-binding | copy
[INFO] maven-resources-plugin --------------------------------------------------
[INFO] + process-resources | default-resources | resources
[INFO] + process-test-resources | default-testResources | testResources
[INFO] maven-jar-plugin --------------------------------------------------------
[INFO] + package | default-jar | jar
[INFO] maven-shade-plugin ------------------------------------------------------
[INFO] + package | default | shade
[INFO] maven-surefire-plugin ---------------------------------------------------
[INFO] + test | default-test | test
[INFO] maven-compiler-plugin ---------------------------------------------------
[INFO] + compile | default-compile | compile
[INFO] + test-compile | default-testCompile | testCompile
[INFO] maven-install-plugin ----------------------------------------------------
[INFO] + install | default-install | install
[INFO] plexus-component-metadata -----------------------------------------------
[INFO] + process-classes | default | generate-metadata
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The parameter &lt;code&gt;buildplan.plugin&lt;/code&gt; allow specific plugin filtering:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mvn buildplan:list-plugin -Dbuildplan.plugin=maven-compiler-plugin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is it, your build plan will have no secret for you anymore !&lt;/p&gt;</description></item><item><title>Migration from WordPress to Pelican</title><link>https://jeanchristophegay.com/en/posts/migration-wordpress-pelican/</link><pubDate>Mon, 17 Mar 2014 20:31:00 +0200</pubDate><guid>https://jeanchristophegay.com/en/posts/migration-wordpress-pelican/</guid><description>&lt;p&gt;Migration feedback of a &lt;a href="https://wordpress.org/" target="_blank" rel="noreferrer"&gt;WordPress&lt;/a&gt; blog to a static site built with &lt;a href="http://getpelican.com/" target="_blank" rel="noreferrer"&gt;Pelican&lt;/a&gt;.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Why ?
 &lt;div id="why-" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#why-" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;I just want a lightweight site. I tried to keep my WordPress instance clean but it has so much features I didn&amp;rsquo;t use that the tool was not meeting my needs. My shared hosting was not helping either and I was not satisfied by the average page loading time.&lt;/p&gt;
&lt;p&gt;As I was already writing all my content with &lt;a href="http://en.wikipedia.org/wiki/Markdown" target="_blank" rel="noreferrer"&gt;Markdown&lt;/a&gt; outside the Wordpress editor, I decided to go for a static site generator.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Pelican
 &lt;div id="pelican" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#pelican" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;Pelican is a static site generator written in Python. It supports &lt;a href="http://en.wikipedia.org/wiki/Markdown" target="_blank" rel="noreferrer"&gt;Markdown&lt;/a&gt;, &lt;a href="http://www.methods.co.nz/asciidoc/" target="_blank" rel="noreferrer"&gt;AsciiDoc&lt;/a&gt; and &lt;a href="http://docutils.sourceforge.net/rst.html" target="_blank" rel="noreferrer"&gt;reStructuredText&lt;/a&gt;.&lt;br&gt;
There is a lot of similar &lt;a href="http://staticsitegenerators.net/" target="_blank" rel="noreferrer"&gt;tools&lt;/a&gt;, and you certainly knows &lt;a href="http://jekyllrb.com/" target="_blank" rel="noreferrer"&gt;Jekyll&lt;/a&gt; or &lt;a href="http://octopress.org/" target="_blank" rel="noreferrer"&gt;Octopress&lt;/a&gt;.&lt;br&gt;
I choose Pelican because it has &lt;a href="http://docs.getpelican.com/en/3.3.0/getting_started.html#translations" target="_blank" rel="noreferrer"&gt;translation&lt;/a&gt; available out of the box. You can get it with others but not natively.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Install
 &lt;div id="install" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#install" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;For OS X:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install python
pip install virtualenv

## Install Pelican
mkdir -p ~/virtualenvs/pelican
virtualenv ~/virtualenvs/pelican
cd ~/virtualenvs/pelican
. bin/activate
pip install pelican
pip install Markdown
pip install beautifulsoup4
pip install typogrify
pip install webassets
pip install cssmin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For others OS installation details are &lt;a href="http://docs.getpelican.com/en/3.3.0/getting_started.html#installing-pelican" target="_blank" rel="noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3 class="relative group"&gt;Activate Pelican environment
 &lt;div id="activate-pelican-environment" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#activate-pelican-environment" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;. ~/virtualenvs/pelican/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 class="relative group"&gt;Quit Pelican environment
 &lt;div id="quit-pelican-environment" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#quit-pelican-environment" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;deactivate
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 class="relative group"&gt;Create a site
 &lt;div id="create-a-site" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#create-a-site" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Launch &lt;code&gt;pelican-quickstart&lt;/code&gt; and follow instructions.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Welcome to pelican-quickstart v3.3.0.

This script will help you create a new Pelican-based website.

Please answer the following questions so this script can generate the files
needed by Pelican.


&amp;gt; Where do you want to create your new web site? [.] blog
&amp;gt; What will be the title of this web site? Jean-Christophe Gay
&amp;gt; Who will be the author of this web site? Jean-Christophe Gay
&amp;gt; What will be the default language of this web site? [en] fr
&amp;gt; Do you want to specify a URL prefix? e.g., http://example.com (Y/n) Y
&amp;gt; What is your URL prefix? (see above example; no trailing slash) http://jeanchristophegay.com
&amp;gt; Do you want to enable article pagination? (Y/n) Y
&amp;gt; How many articles per page do you want? [10]
&amp;gt; Do you want to generate a Fabfile/Makefile to automate generation and publishing? (Y/n) Y
&amp;gt; Do you want an auto-reload &amp;amp; simpleHTTP script to assist with theme and site development? (Y/n) Y
&amp;gt; Do you want to upload your website using FTP? (y/N) N
&amp;gt; Do you want to upload your website using SSH? (y/N) N
&amp;gt; Do you want to upload your website using Dropbox? (y/N) N
&amp;gt; Do you want to upload your website using S3? (y/N) N
&amp;gt; Do you want to upload your website using Rackspace Cloud Files? (y/N) N
Done. Your new project is available at /Users/jcgay/blog
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Generated sources:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;blog
├── Makefile
├── content
│   ├── (pages)
├── develop_server.sh
├── fabfile.py
├── output
├── pelicanconf.py
└── publishconf.py

2 directories, 5 files
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 class="relative group"&gt;Add content
 &lt;div id="add-content" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#add-content" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Articles must be saved in &lt;code&gt;content&lt;/code&gt; folder.&lt;br&gt;
You can extract your WordPress articles using Pelican importer: &lt;a href="http://docs.getpelican.com/en/3.3.0/importer.html#import" target="_blank" rel="noreferrer"&gt;http://docs.getpelican.com/en/3.3.0/importer.html#import&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I have not tried it, I already had Markdown version of my content. It was just a matter of adding necessary metatada in each of my &lt;code&gt;.md&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;To have an article recognized by Pelican, add metadata:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Title: git-p4 au secours de Perforce
Date: 2012-03-18 18:10
Category: Scm
Tags: git, git-p4, perforce, p4
Slug: git-p4-au-secours-de-perforce
Author: Jean-Christophe Gay
lang: fr
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;slug&lt;/code&gt; property allow to customize URL generated by Pelican. This way you will be able to keep your WordPress URL.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Choose a theme
 &lt;div id="choose-a-theme" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#choose-a-theme" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Themes are available in the repository &lt;a href="https://github.com/getpelican/pelican-themes" target="_blank" rel="noreferrer"&gt;https://github.com/getpelican/pelican-themes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For now I use &lt;a href="https://github.com/talha131/pelican-elegant" target="_blank" rel="noreferrer"&gt;elegant&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Clone the repository to have it accessible by Pelican configuration.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Plugins
 &lt;div id="plugins" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#plugins" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Pelican is extendable by picking plugins. They are listed in the repository &lt;a href="https://github.com/getpelican/pelican-plugins" target="_blank" rel="noreferrer"&gt;https://github.com/getpelican/pelican-plugins&lt;/a&gt;.
Clone it.&lt;/p&gt;
&lt;p&gt;Here are the active plugins on my installation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/getpelican/pelican-plugins/tree/master/sitemap" target="_blank" rel="noreferrer"&gt;sitemap&lt;/a&gt;: generate &lt;code&gt;sitemap.xml&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/getpelican/pelican-plugins/tree/master/tipue_search" target="_blank" rel="noreferrer"&gt;tipue_search&lt;/a&gt;: search engine for your content without using a third party service.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/getpelican/pelican-plugins/tree/master/extract_toc" target="_blank" rel="noreferrer"&gt;extract_toc&lt;/a&gt;: extract a table of contents.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/getpelican/pelican-plugins/tree/master/optimize_images" target="_blank" rel="noreferrer"&gt;optimize_images&lt;/a&gt;: compress &lt;code&gt;jpeg&lt;/code&gt; and &lt;code&gt;png&lt;/code&gt; images.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/getpelican/pelican-plugins/tree/master/related_posts" target="_blank" rel="noreferrer"&gt;related_posts&lt;/a&gt;: display other articles in relation with the current one.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/getpelican/pelican-plugins/tree/master/summary" target="_blank" rel="noreferrer"&gt;summary&lt;/a&gt;: set a summary limit using &lt;code&gt;&amp;lt;!-- PELICAN_END_SUMMARY --&amp;gt;&lt;/code&gt; directly in article.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/getpelican/pelican-plugins/tree/master/assets" target="_blank" rel="noreferrer"&gt;assets&lt;/a&gt;: compile/minify static resources.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;Configuration
 &lt;div id="configuration" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#configuration" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Configuration is split in two files: &lt;code&gt;pelicanconf.py&lt;/code&gt; et &lt;code&gt;publishconf.py&lt;/code&gt;. The last one override former configuration with the production settings.&lt;/p&gt;
&lt;p&gt;Parameters are described &lt;a href="http://docs.getpelican.com/en/3.3.0/settings.html" target="_blank" rel="noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have not met any difficulties, two tips anyway.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Generate clean URLs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; ARTICLE_URL = '{slug}'
 ARTICLE_SAVE_AS = '{slug}/index.html'
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A folder &lt;code&gt;slug&lt;/code&gt; is created for each article containing a single &lt;code&gt;index.html&lt;/code&gt; file.&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;
&lt;p&gt;Copy files using metadata &lt;code&gt;EXTRA_PATH_METADATA&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; EXTRA_PATH_METADATA = {
 'extra/humans.txt': {'path': 'humans.txt'},
 'extra/robots.txt': {'path': 'robots.txt'},
 'extra/.htaccess': {'path': '.htaccess'},
 }
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 class="relative group"&gt;Comments
 &lt;div id="comments" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#comments" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;If you were using WordPress comments, you must move them to a third party service like &lt;a href="http://disqus.com/" target="_blank" rel="noreferrer"&gt;Disqus&lt;/a&gt;.&lt;br&gt;
I was already using it, if you&amp;rsquo;re not, install this &lt;a href="http://wordpress.org/plugins/disqus-comment-system/" target="_blank" rel="noreferrer"&gt;plugin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In each article, add expected discussion feed identifier:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;disqus_identifier: 7 http://jeanchristophegay.com/?p=7
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It is read by &lt;code&gt;elegant&lt;/code&gt; theme.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Redirect rules
 &lt;div id="redirect-rules" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#redirect-rules" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;Rewrite URLs which will disappear.&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-apacheconf" data-lang="apacheconf"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;IfModule&lt;/span&gt; &lt;span class="s"&gt;mod_rewrite.c&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;RewriteEngine&lt;/span&gt; &lt;span class="k"&gt;On&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;RewriteBase&lt;/span&gt; /
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;RewriteRule&lt;/span&gt; feed/?$ feeds/rss.xml [R=301,L]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;RewriteRule&lt;/span&gt; wp-content/uploads/2013/03/Capture-d’écran-2013-03-09-à-11.24.20-300x182.png images/p4merge-mini.png [R=301,L]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;RewriteRule&lt;/span&gt; wp-content/uploads/2013/03/Capture-d’écran-2013-03-09-à-11.24.20.png images/p4merge.png [R=301,L]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Redirect wp-content/uploads/2012/03/git-p4.png to images/git-p4.png&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;RewriteRule&lt;/span&gt; wp-content/uploads/[0-2][0-9][0-9][0-9]/[0-1][0-9]/([^/]+) images/$1 [R=301,L]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Redirect 2012/04 to archives.html#2012&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;RewriteRule&lt;/span&gt; ([0-2][0-9][0-9][0-9])/[0-1][0-9]/? archives.html#$1 [R=301,NE,L]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Redirect category/slug/ to categories.html#slug-ref&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;RewriteRule&lt;/span&gt; category/([^/]+)/? categories.html#$1-ref [R=301,NE,L]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Redirect tag/slug/ to tags.html#slug-ref&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;RewriteRule&lt;/span&gt; tag/([^/]+)/? tags.html#$1-ref [R=301,NE,L]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Redirect author/jcgay/ to /&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;RewriteRule&lt;/span&gt; author/jcgay/? / [R=301,L]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/IfModule&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 class="relative group"&gt;Test/Publish site
 &lt;div id="testpublish-site" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#testpublish-site" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;To generate site, launch &lt;code&gt;make html &amp;amp;&amp;amp; make serve&lt;/code&gt;.&lt;br&gt;
Content is generated into &lt;code&gt;output&lt;/code&gt; folder and publish at &lt;code&gt;http://localhost:8000&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Production site should be generated using &lt;code&gt;make publish&lt;/code&gt;. Upload the whole thing.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Conclusion
 &lt;div id="conclusion" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#conclusion" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;I like the final result, my blog is now generated from a simple git repository, content is versionned and the whole process is less cumbersome that what I was used to. Mission accomplished !&lt;/p&gt;</description></item></channel></rss>