In a previous post we learned how to add a banner to a Grails 3.0 application. We used the Spring Boot support in Grails to show a banner on startup. The solution we used doesn't work for a Grails 3.1 application. We need to implement a different solution to show a banner on startup.
First of all we create a new class that implements the org.springframework.boot.Banner
interface. We implement the single method printBanner
and logic to display a banner, including colors:
// File: src/main/groovy/mrhaki/grails/GrailsBanner.groovy package mrhaki.grails import org.springframework.boot.Banner import grails.util.Environment import org.springframework.boot.ansi.AnsiColor import org.springframework.boot.ansi.AnsiOutput import org.springframework.boot.ansi.AnsiStyle import static grails.util.Metadata.current as metaInfo /** * Class that implements Spring Boot Banner * interface to show information on application startup. */ class GrailsBanner implements Banner { /** * ASCCI art Grails 3.1 logo built on * http://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20 */ private static final String BANNER = $/ _________________ _____ .___.____ _________ ________ ____ / _____|______ \ / _ \ | | | / _____/ \_____ \ /_ | / \ ___| _/ / /_\ \| | | \_____ \ _(__ < | | \ \_\ \ | \/ | \ | |___ / \ / \ | | \______ /____|_ /\____|__ /___|_______ \/_______ / /______ / /\ |___| \/ \/ \/ \/ \/ \/ \/ /$ @Override void printBanner( org.springframework.core.env.Environment environment, Class<?> sourceClass, PrintStream out) { // Print ASCII art banner with color yellow. out.println AnsiOutput.toString(AnsiColor.BRIGHT_YELLOW, BANNER) // Display extran infomratio about the application. row 'App version', metaInfo.getApplicationVersion(), out row 'App name', metaInfo.getApplicationName(), out row 'Grails version', metaInfo.getGrailsVersion(), out row 'Groovy version', GroovySystem.version, out row 'JVM version', System.getProperty('java.version'), out row 'Reloading active', Environment.reloadingAgentEnabled, out row 'Environment', Environment.current.name, out out.println() } private void row(final String description, final value, final PrintStream out) { out.print AnsiOutput.toString(AnsiColor.DEFAULT, ':: ') out.print AnsiOutput.toString(AnsiColor.GREEN, description.padRight(16)) out.print AnsiOutput.toString(AnsiColor.DEFAULT, ' :: ') out.println AnsiOutput.toString(AnsiColor.BRIGHT_CYAN, AnsiStyle.FAINT, value) } }
Next we must override the GrailsApp
class. We override the printBanner
method, which has no implementation in the GrailsApp
class. In our printBanner
method we use GrailsBanner
:
// File: src/main/groovy/mrhaki/grails/BannerGrailsApp.groovy package mrhaki.grails import grails.boot.GrailsApp import groovy.transform.InheritConstructors import org.springframework.core.env.Environment @InheritConstructors class BannerGrailsApp extends GrailsApp { @Override protected void printBanner(final Environment environment) { // Create GrailsBanner instance. final GrailsBanner banner = new GrailsBanner() banner.printBanner(environment, Application, System.out) } }
Finally in the Application
class we use BannerGrailsApp
instead of the default GrailsApp
object:
// File: grails-app/init/mrhaki/grails/Application.groovy package mrhaki.grails import grails.boot.config.GrailsAutoConfiguration class Application extends GrailsAutoConfiguration { static void main(String[] args) { final BannerGrailsApp app = new BannerGrailsApp(Application) app.run(args) } }
When we start our Grails application on a console with color support we see the following banner:
Written with Grails 3.1.8.