<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Notification Center on Jean-Christophe Gay</title><link>https://jeanchristophegay.com/en/tags/notification-center/</link><description>Recent content in Notification Center on Jean-Christophe Gay</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><copyright>© 2026 Jean-Christophe Gay</copyright><lastBuildDate>Tue, 18 Aug 2026 23:08:47 +0200</lastBuildDate><atom:link href="https://jeanchristophegay.com/en/tags/notification-center/index.xml" rel="self" type="application/rss+xml"/><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"
 width="298"
 height="60"&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"
 width="298"
 height="59"&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"
 width="299"
 height="60"&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"
 width="290"
 height="64"&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"
 width="323"
 height="62"&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"
 width="324"
 height="63"&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"
 width="354"
 height="74"&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"
 width="287"
 height="178"&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"
 width="360"
 height="119"&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"
 width="360"
 height="107"&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"
 width="329"
 height="112"&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"
 width="315"
 height="99"&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"
 width="385"
 height="90"&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"
 width="250"
 height="72"&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"
 width="361"
 height="81"&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"
 width="424"
 height="187"&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>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"
 width="300"
 height="77"&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"
 width="291"
 height="66"&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"
 width="324"
 height="63"&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"
 width="324"
 height="63"&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"
 width="405"
 height="86"&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"
 width="286"
 height="168"&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"
 width="360"
 height="119"&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"
 width="363"
 height="111"&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"
 width="183"
 height="84"&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"
 width="209"
 height="129"&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"
 width="385"
 height="90"&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"
 width="250"
 height="72"&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"
 width="361"
 height="81"&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"
 width="424"
 height="187"&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"
 width="281"
 height="211"&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></channel></rss>