Maven in colors
📅 Published: ~ Updated: • Thomas Queste
Maven output is quite pale. Want to see some green for successes, red for failures and yellow for warnings? Let’s see how to do it.
This post is an enhanced version of several shell scripts (like this one) or Arnaud Heritier’s log4j2 approach: United Colors of Maven.
How it looks
Here is a screenshot of a successful build :
Screenshot of a failed build :
Preferred solution: shell function
My preferred solution is to pipe Maven’s output to sed and to insert Ansi color sequences at the correct locations. It is done like this :
mvn $goal | sed -e '/BUILD SUCCESS/$red BUILD SUCCESS/'
In reality, it is a bit more complex because we want to return the exit code of the maven command and not the one of sed or the other chained command.
The shell function (zsh and bash compatible) is available at: https://github.com/tomsquest/dotfiles/blob/master/zsh/functions/mvn-in-colors.zsh
You just have to put this file somewhere, source it and make an alias to mvn :
$ source mvn-in-colors.zsh
$ alias mvn=mvn-in-colors # done !
Restrictions
Using this method does not work when Maven asks for input, for example, when using the release:prepare goal.
Workaround :
- Ignore the alias with
\mvn
when releasing - Don’t use the release plugin and prefer the solution of Axel Fontaine: Maven Release Plugin: The Final Nail in the Coffin
Maven Agent
Jean-Christophe Gay wrote an interesting bit of code to handle the problem: a Java agent to hack Maven logging.
The code is here: Maven Color on GitHub
Restrictions
The Readme says the agent will fail when using a plugin using itself a different version of ASM (use to change the bytecode). See the Known issues.
Rainbow
Rainbow is a colorizer of commands outputs written in Python. It uses patterns to match strings to colors.
And Rainbow supports Maven out of the box!
Once installed, running Rainbow is as simple as :
$ rainbow --config=mvn3 -- mvn clean install
Restrictions
The original Rainbow version does not return the exit code of the specified program (mvn in our case). This is a real problem when you want to chain mvn with a push. ie.
$ rainbow --config=mvn3 -- mvn clean install && git push # will push even if the build failed !
Some works try to fix the issues of rainbow. The one from GfxMonk seems to fix the lack of exit code.