Grails Goodness: Add Banner To Grails 3.1 Application
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
* https://ift.tt/Wy1tic
*/
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.