diff --git a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index 58fabb5c473..b7af65f8a4c 100644 --- a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -43,6 +43,7 @@ content into your application; rather pick only the properties that you need. spring.main.sources= # sources (class name, package name or XML resource location) to include spring.main.web-environment= # detect by default spring.main.show-banner=true + spring.main.banner-mode=console # the mode used to display the banner (console, off, or log) spring.main....= # see class for all properties # AUTO-CONFIGURATION diff --git a/spring-boot-docs/src/main/asciidoc/howto.adoc b/spring-boot-docs/src/main/asciidoc/howto.adoc index d7df7d0960d..ed48010ecfd 100644 --- a/spring-boot-docs/src/main/asciidoc/howto.adoc +++ b/spring-boot-docs/src/main/asciidoc/howto.adoc @@ -123,7 +123,7 @@ might have. [source,properties,indent=0,subs="verbatim,quotes,attributes"] ---- spring.main.web_environment=false - spring.main.show_banner=OFF + spring.main.banner_mode=off ---- and then the Spring Boot banner will not be printed on startup, and the application will @@ -139,7 +139,7 @@ consider this application [source,java,indent=0] ---- new SpringApplicationBuilder() - .showBanner(Banner.Mode.OFF) + .bannerMode(Banner.Mode.OFF) .sources(demo.MyApp.class) .run(args); ---- @@ -149,7 +149,7 @@ used with the following configuration: [source,properties,indent=0,subs="verbatim,quotes,attributes"] ---- spring.main.sources=com.acme.Config,com.acme.ExtraConfig - spring.main.show-banner=CONSOLE + spring.main.banner_mode=console ---- The actual application will _now_ show the banner (as overridden by configuration) and use diff --git a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc index 5e5049835e9..43c6bf5b9cb 100644 --- a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc +++ b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc @@ -93,7 +93,7 @@ instance and customize it. For example, to turn off the banner you would write: ---- public static void main(String[] args) { SpringApplication app = new SpringApplication(MySpringConfiguration.class); - app.setShowBanner(false); + app.setBannerMode(Banner.Mode.OFF); app.run(args); } ---- @@ -124,7 +124,7 @@ For example: [source,java,indent=0] ---- new SpringApplicationBuilder() - .showBanner(Banner.Mode.OFF) + .bannerMode(Banner.Mode.OFF) .sources(Parent.class) .child(Application.class) .run(args); diff --git a/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java b/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java index f87caceb9d9..fce9d4191c7 100644 --- a/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java +++ b/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java @@ -18,6 +18,7 @@ package org.springframework.boot; import java.io.ByteArrayOutputStream; import java.io.PrintStream; +import java.io.UnsupportedEncodingException; import java.lang.reflect.Constructor; import java.security.AccessControlException; import java.util.ArrayList; @@ -182,7 +183,7 @@ public class SpringApplication { private Class mainApplicationClass; - private Banner.Mode showBanner = Banner.Mode.CONSOLE; + private Banner.Mode bannerMode = Banner.Mode.CONSOLE; private boolean logStartupInfo = true; @@ -324,7 +325,7 @@ public class SpringApplication { environment = convertToStandardEnvironment(environment); } - if (this.showBanner != Banner.Mode.OFF) { + if (this.bannerMode != Banner.Mode.OFF) { printBanner(environment); } @@ -524,21 +525,23 @@ public class SpringApplication { * banner.location=classpath:banner.txt, banner.charset=UTF-8. If the banner file does * not exist or cannot be printed, a simple default is created. * @param environment the environment - * @see #setShowBanner(org.springframework.boot.Banner.Mode) + * @see #setBannerMode */ protected void printBanner(Environment environment) { Banner selectedBanner = selectBanner(environment); - if (this.showBanner == Banner.Mode.LOG) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - selectedBanner.printBanner(environment, this.mainApplicationClass, - new PrintStream(baos)); - this.log.info(baos.toString()); + if (this.bannerMode == Banner.Mode.LOG) { + try { + this.log.info(createStringFromBanner(selectedBanner, environment)); + } + catch (UnsupportedEncodingException ex) { + this.log.warn("Failed to create String for banner", ex); + } } else { - selectedBanner - .printBanner(environment, this.mainApplicationClass, System.out); + selectedBanner.printBanner(environment, this.mainApplicationClass, + System.out); } } @@ -557,6 +560,14 @@ public class SpringApplication { return DEFAULT_BANNER; } + private String createStringFromBanner(Banner banner, Environment environment) + throws UnsupportedEncodingException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + banner.printBanner(environment, this.mainApplicationClass, new PrintStream(baos)); + String charset = environment.getProperty("banner.charset", "UTF-8"); + return baos.toString(charset); + } + /** * Strategy method used to create the {@link ApplicationContext}. By default this * method will respect any explicitly set application context or application context @@ -853,11 +864,22 @@ public class SpringApplication { /** * Sets if the Spring banner should be displayed when the application runs. Defaults - * to {@code org.springframework.boot.Banner.Mode.CONSOLE}. - * @param bannerMode if the banner should be shown in log or console, or turned off. + * to {@code true}. + * @param showBanner if the banner should be shown + * @deprecated since 1.3.0 in favor of {@link #setBannerMode} */ - public void setShowBanner(Banner.Mode bannerMode) { - this.showBanner = bannerMode; + @Deprecated + public void setShowBanner(boolean showBanner) { + setBannerMode(showBanner ? Banner.Mode.CONSOLE : Banner.Mode.OFF); + } + + /** + * Sets the mode used to display the banner when the application runs. Defaults to + * {@code Banner.Mode.CONSOLE}. + * @param bannerMode the mode used to display the banner + */ + public void setBannerMode(Banner.Mode bannerMode) { + this.bannerMode = bannerMode; } /** diff --git a/spring-boot/src/main/java/org/springframework/boot/builder/SpringApplicationBuilder.java b/spring-boot/src/main/java/org/springframework/boot/builder/SpringApplicationBuilder.java index 420ee1b0057..005eda5d3cc 100644 --- a/spring-boot/src/main/java/org/springframework/boot/builder/SpringApplicationBuilder.java +++ b/spring-boot/src/main/java/org/springframework/boot/builder/SpringApplicationBuilder.java @@ -172,7 +172,7 @@ public class SpringApplicationBuilder { web(false); // Probably not interested in multiple banners - showBanner(Banner.Mode.OFF); + bannerMode(Banner.Mode.OFF); // Make sure sources get copied over this.application.setSources(this.sources); @@ -310,12 +310,19 @@ public class SpringApplicationBuilder { * Flag to indicate the startup banner should be printed. * @param showBanner the flag to set. Default true. * @return the current builder + * @deprecated Since 1.3.0 in favor of {@link #bannerMode} */ - public SpringApplicationBuilder showBanner(Banner.Mode showBanner) { + @Deprecated + public SpringApplicationBuilder showBanner(boolean showBanner) { this.application.setShowBanner(showBanner); return this; } + public SpringApplicationBuilder bannerMode(Banner.Mode bannerMode) { + this.application.setBannerMode(bannerMode); + return this; + } + /** * Sets if the application is headless and should not instantiate AWT. Defaults to * {@code true} to prevent java icons appearing. diff --git a/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java b/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java index 40ac559125b..d446a04abaa 100644 --- a/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java @@ -163,19 +163,37 @@ public class SpringApplicationTests { } @Test - public void disableBanner() throws Exception { + public void disableBannerWithMode() throws Exception { SpringApplication application = spy(new SpringApplication(ExampleConfig.class)); application.setWebEnvironment(false); - application.setShowBanner(Banner.Mode.OFF); + application.setBannerMode(Banner.Mode.OFF); + this.context = application.run(); + verify(application, never()).printBanner((Environment) anyObject()); + } + + @SuppressWarnings("deprecation") + @Test + public void disableBannerWithBoolean() throws Exception { + SpringApplication application = spy(new SpringApplication(ExampleConfig.class)); + application.setWebEnvironment(false); + application.setShowBanner(false); this.context = application.run(); verify(application, never()).printBanner((Environment) anyObject()); } @Test - public void disableBannerViaProperty() throws Exception { + public void disableBannerViaShowBannerProperty() throws Exception { SpringApplication application = spy(new SpringApplication(ExampleConfig.class)); application.setWebEnvironment(false); - this.context = application.run("--spring.main.show_banner=OFF"); + this.context = application.run("--spring.main.show_banner=false"); + verify(application, never()).printBanner((Environment) anyObject()); + } + + @Test + public void disableBannerViaBannerModeProperty() throws Exception { + SpringApplication application = spy(new SpringApplication(ExampleConfig.class)); + application.setWebEnvironment(false); + this.context = application.run("--spring.main.banner-mode=off"); verify(application, never()).printBanner((Environment) anyObject()); } @@ -219,17 +237,8 @@ public class SpringApplicationTests { public void enableBannerInLogViaProperty() throws Exception { SpringApplication application = spy(new SpringApplication(ExampleConfig.class)); application.setWebEnvironment(false); - this.context = application.run("--spring.main.show_banner=LOG"); - verify(application, atLeastOnce()).setShowBanner(Banner.Mode.LOG); - } - - @Test - public void verifyBannerOutputContainsLogInfo() throws Exception { - SpringApplication application = spy(new SpringApplication(ExampleConfig.class)); - application.setWebEnvironment(false); - application.run("--spring.main.show_banner=LOG", - "--banner.location=classpath:test-banner.txt"); - verify(application, atLeastOnce()).setShowBanner(Banner.Mode.LOG); + this.context = application.run("--spring.main.banner-mode=log"); + verify(application, atLeastOnce()).setBannerMode(Banner.Mode.LOG); assertThat(this.output.toString(), containsString("o.s.boot.SpringApplication")); } @@ -565,8 +574,8 @@ public class SpringApplicationTests { TestSpringApplication application = new TestSpringApplication( ExampleConfig.class); application.setWebEnvironment(false); - this.context = application.run("--spring.main.show_banner=OFF"); - assertThat(application.getShowBanner(), is(Banner.Mode.OFF)); + this.context = application.run("--spring.main.banner-mode=OFF"); + assertThat(application.getBannerMode(), is(Banner.Mode.OFF)); } @Test @@ -733,7 +742,7 @@ public class SpringApplicationTests { private boolean useMockLoader; - private Banner.Mode showBanner; + private Banner.Mode bannerMode; TestSpringApplication(Object... sources) { super(sources); @@ -764,13 +773,13 @@ public class SpringApplicationTests { } @Override - public void setShowBanner(Banner.Mode bannerMode) { - super.setShowBanner(bannerMode); - this.showBanner = bannerMode; + public void setBannerMode(Banner.Mode bannerMode) { + super.setBannerMode(bannerMode); + this.bannerMode = bannerMode; } - public Banner.Mode getShowBanner() { - return this.showBanner; + public Banner.Mode getBannerMode() { + return this.bannerMode; } } diff --git a/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigFileEnvironmentPostProcessorTests.java b/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigFileEnvironmentPostProcessorTests.java index a8c7fa003da..c9ae2bd971c 100644 --- a/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigFileEnvironmentPostProcessorTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigFileEnvironmentPostProcessorTests.java @@ -88,7 +88,7 @@ public class ConfigFileEnvironmentPostProcessorTests { } System.clearProperty("the.property"); System.clearProperty("spring.config.location"); - System.clearProperty("spring.main.showBanner"); + System.clearProperty("spring.main.banner-mode"); } @Test @@ -624,7 +624,7 @@ public class ConfigFileEnvironmentPostProcessorTests { // gh-346 this.initializer.setSearchNames("bindtoapplication"); this.initializer.postProcessEnvironment(this.environment, this.application); - Field field = ReflectionUtils.findField(SpringApplication.class, "showBanner"); + Field field = ReflectionUtils.findField(SpringApplication.class, "bannerMode"); field.setAccessible(true); assertThat((Banner.Mode) field.get(this.application), equalTo(Banner.Mode.OFF)); } @@ -632,9 +632,9 @@ public class ConfigFileEnvironmentPostProcessorTests { @Test public void bindsSystemPropertyToSpringApplication() throws Exception { // gh-951 - System.setProperty("spring.main.showBanner", "OFF"); + System.setProperty("spring.main.banner-mode", "off"); this.initializer.postProcessEnvironment(this.environment, this.application); - Field field = ReflectionUtils.findField(SpringApplication.class, "showBanner"); + Field field = ReflectionUtils.findField(SpringApplication.class, "bannerMode"); field.setAccessible(true); assertThat((Banner.Mode) field.get(this.application), equalTo(Banner.Mode.OFF)); } diff --git a/spring-boot/src/test/resources/bindtoapplication.properties b/spring-boot/src/test/resources/bindtoapplication.properties index ec0094f3fda..33406d213f8 100644 --- a/spring-boot/src/test/resources/bindtoapplication.properties +++ b/spring-boot/src/test/resources/bindtoapplication.properties @@ -1 +1 @@ -spring.main.show_banner=OFF +spring.main.banner-mode=off