Add support for custom banner

SpringApplication now picks up a classpath:banner.txt
by default, and user can choose a different one with
banner.location. The encoding is banner.encoding.

Fixes gh-458
This commit is contained in:
Dave Syer 2014-04-30 16:30:54 +01:00
parent 537b0c3ff3
commit 7a33afa722
3 changed files with 36 additions and 3 deletions

View File

@ -17,6 +17,7 @@
package org.springframework.boot;
import java.lang.reflect.Constructor;
import java.nio.charset.Charset;
import java.security.AccessControlException;
import java.util.ArrayList;
import java.util.Arrays;
@ -66,6 +67,7 @@ import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.StopWatch;
import org.springframework.util.StreamUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.context.ConfigurableWebApplicationContext;
import org.springframework.web.context.WebApplicationContext;
@ -276,7 +278,7 @@ public class SpringApplication {
}
if (this.showBanner) {
printBanner();
printBanner(environment);
}
// Create, load, refresh and run the ApplicationContext
@ -452,6 +454,36 @@ public class SpringApplication {
environment.setActiveProfiles(profiles.toArray(new String[profiles.size()]));
}
/**
* Print a custom banner message to the console, optionally extracting its location or
* content from the Environment (banner.location and banner.charset). The defaults are
* banner.location=classpath:banner.txt, banner.charest=UTF-8. If the banner file does
* not exist or cannot be printed, a simple default is created.
*
* @see #setShowBanner(boolean)
* @see #printBanner()
*/
protected void printBanner(Environment environment) {
String location = environment.getProperty("banner.location", "banner.txt");
ResourceLoader resourceLoader = this.resourceLoader != null ? this.resourceLoader
: new DefaultResourceLoader(getClassLoader());
Resource resource = resourceLoader.getResource(location);
if (resource.exists()) {
try {
System.out.println(StreamUtils.copyToString(
resource.getInputStream(),
environment.getProperty("banner.charset", Charset.class,
Charset.forName("UTF-8"))));
return;
}
catch (Exception e) {
System.out.println("Banner not printable: " + resource + " ("
+ e.getClass() + ": '" + e.getMessage() + "')");
}
}
printBanner();
}
/**
* Print a simple banner message to the console. Subclasses can override this method
* to provide additional or alternative banners.

View File

@ -123,8 +123,8 @@ public class SpringApplicationTests {
public void customBanner() throws Exception {
SpringApplication application = spy(new SpringApplication(ExampleConfig.class));
application.setWebEnvironment(false);
application.run();
verify(application).printBanner();
application.run("--banner.location=classpath:test-banner.txt");
verify(application, never()).printBanner();
}
@Test

View File

@ -0,0 +1 @@
Running a Test!