Featured image of post 【遊び心満載】SpringBootの起動時の出力を任意の画像やアイコンに差し替える機能が面白い【謎の技術】

【遊び心満載】SpringBootの起動時の出力を任意の画像やアイコンに差し替える機能が面白い【謎の技術】

1703文字

見慣れぬ新機能

先日、とある案件で「Spring Boot」を使いたいという相談を受けていたため、ドキュメントや様々な技術ブログを漁っていたところ、面白そうな記述を見つけました。

Banner images

英語スキル雑魚の筆者は、とりあえずGoogle翻訳に全文コピペし概要を確認してみました。

英文:

You can now use image files to render ASCII art banners. Drop a banner.gif, banner.jpg or banner.png file into src/main/resources to have it automatically converted into ASCI

訳:

イメージファイルを使用してASCIIアートバナーをレンダリングできるようになりました。 banner.gif、banner.jpg、banner.pngファイルをsrc/main/resourcesにハイツすれば、自動的にASCIIに変換されます

こんぐらい自分で訳せよ!!
っていう満場一致の指摘は置いとくとして、なにやらシステム起動時のログに表示されるログを任意の画像に差し替えれるようになったよ!と言う事らしいですね。

こういう本来の目的と全く関係のない遊び心は筆者は大好物なので調査そっちのけで早速調べる事にしました☆w

ちなみにSpring Boot自体はとても使いやすいフレームワークです。
Javaであれば一番浸透していますし、まだまだ進化を遂げているのでオススメです!
筆者も大好きです♪

手順

まずは標準出力

まずは通常の起動ログを確認してみましょう。
以下のコマンドを実行してください。

起動コマンド
./gradlew bootrun

すると、以下のようなログが出力されると思います。

デフォルトでは制作元であるSpringのロゴが表示されます。
では、早速この出力部分を変えてみましょう。

banner.pngの配置

作業はとても簡単です。
src/main/resourcesディレクトリに出力させたい画像をbanner.pngという名称で配置するだけです。
配置後の構造はこんな感じ。

ディレクトリ構造
.
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── jp
    │   │       └── blogenist
    │   │           └── app
    │   │               └── AppApplication.java
    │   └── resources
    │       ├── application.properties
    │       └── banner.png
    └── test
        └── java
            └── jp
                └── blogenist
                    └── app
                        └── AppApplicationTests.java

この状態でもう一度実行してみてください。

起動コマンド
./gradlew bootrun

おぉ!変わった!!
画像を配置するだけで自動生成してくれるんですね。

カラー出力したい

しかし、人間は欲深き生き物です。
自動生成しただけでは飽き足らずにカラー出力したい・・・!と思ってしまいました。

しかし、SpringBootさんは抜かりないです。
その場合は以下の設定application.propertiesに追加してください。

src/main/resources/application.properties
spring.output.ansi.enabled=always

application.ymlの場合は以下。

src/main/resources/application.yml
spring:
  output:
    ansi:
      enabled: always

カラーきた!!

しかし、ところどころ崩れているのが気に食わん。。。orz

テキストでより細かく設定

画像での出力だと、自動生成なので精密さに限界があります。
なので、細部までこだわりたい場合にはテキストファイルを作成して配置する事で自動生成では不可能な設定が可能になります。

ソースを見てみると、SpringBootのorg.springframework.boot.ansiパッケージ内に以下のEnumがあり、この値をテキストファイル内で${AnsiColor.RED}のように指定する事で様々な色を指定する事が可能になるとの事。

org.springframework.boot.ansi.AnsiColor.java
.
.
.

package org.springframework.boot.ansi;

.
.
.

public enum AnsiColor implements AnsiElement {
	DEFAULT("39"),
	BLACK("30"),
	RED("31"),
	GREEN("32"),
	YELLOW("33"),
	BLUE("34"),
	MAGENTA("35"),
	CYAN("36"),
	WHITE("37"),
	BRIGHT_BLACK("90"),
	BRIGHT_RED("91"),
	BRIGHT_GREEN("92"),
	BRIGHT_YELLOW("93"),
	BRIGHT_BLUE("94"),
	BRIGHT_MAGENTA("95"),
	BRIGHT_CYAN("96"),
	BRIGHT_WHITE("97");

.
.
.

}

なるほど。
とりあえず試してみましょう。

以下のテキストを配置してみます。

banner.txt
${AnsiColor.RED}█RED█
${AnsiColor.BLUE}█BLUE█
${AnsiColor.GREEN}█GREEN█${AnsiColor.BRIGHT_GREEN}█BRIGHT_GREEN█
${AnsiColor.YELLOW}█YELLOW█${AnsiColor.BRIGHT_YELLOW}█BRIGHT_YELLOW█

そして実行。

良い感じ♪

ちなみにテキストの最初に空行を入れないと、出力が崩れる事があるので、何行か空行を入れといたほうが良いかもしれません。
この辺は要調整ですね。

では、実際に先ほど使用したbanner.pngを削除してbanner.txtに置き換えましょう。

banner.txt

                                   ${AnsiColor.GREEN}::::::
                                  ${AnsiColor.GREEN}::::::::: ${AnsiColor.BRIGHT_BLACK}#
                                 ${AnsiColor.GREEN}:::::::::o ${AnsiColor.BRIGHT_BLACK}#####
                                ${AnsiColor.GREEN}o::::::::: ${AnsiColor.BRIGHT_BLACK}#########
                                  ${AnsiColor.GREEN}o:::::: ${AnsiColor.BRIGHT_BLACK}#############
                               ${AnsiColor.RED}#       :  ${AnsiColor.BRIGHT_BLACK}################
                              ${AnsiColor.RED}#  ######     ${AnsiColor.BRIGHT_BLACK}################
                             ${AnsiColor.RED}#  ######         ${AnsiColor.BRIGHT_BLACK}###############
                            ${AnsiColor.RED}#  ######             ${AnsiColor.BRIGHT_BLACK}#############
                           ${AnsiColor.RED}#  ######                ${AnsiColor.BRIGHT_BLACK}############
                          ${AnsiColor.RED}#  ######                  ${AnsiColor.BRIGHT_BLACK}############
                         ${AnsiColor.RED}#  ######                  ${AnsiColor.BRIGHT_BLACK}#############
                        ${AnsiColor.RED}#  ######  ${AnsiColor.BRIGHT_BLACK}##############################
                       ${AnsiColor.RED}#  ######  ${AnsiColor.BRIGHT_BLACK}##############################
                      ${AnsiColor.RED}#  ######  ${AnsiColor.BRIGHT_BLACK}#############################
                     ${AnsiColor.RED}#  ######  ${AnsiColor.BRIGHT_BLACK}############################
                    ${AnsiColor.RED}#  ######  ${AnsiColor.BRIGHT_BLACK}##########################
                   ${AnsiColor.RED}#  ######     ${AnsiColor.BRIGHT_BLACK}#############
                  ${AnsiColor.RED}#  ######        ${AnsiColor.BRIGHT_BLACK}#############
                 ${AnsiColor.RED}#  ######            ${AnsiColor.BRIGHT_BLACK}############
                ${AnsiColor.RED}#  ######              ${AnsiColor.BRIGHT_BLACK}############
               ${AnsiColor.RED}#  ######                 ${AnsiColor.BRIGHT_BLACK}###########
              ${AnsiColor.RED}#  ######                    ${AnsiColor.BRIGHT_BLACK}##########
             ${AnsiColor.RED}#  ######                      ${AnsiColor.BRIGHT_BLACK}##########
            ${AnsiColor.RED}#  ######                        ${AnsiColor.BRIGHT_BLACK}##########
           ${AnsiColor.RED}#  ######                        ${AnsiColor.BRIGHT_BLACK}###########
          ${AnsiColor.RED}#  ###### ${AnsiColor.BRIGHT_BLACK}###                    ${AnsiColor.BRIGHT_BLACK}#############
         ${AnsiColor.RED}#  ###### ${AnsiColor.BRIGHT_BLACK}####################################
        ${AnsiColor.RED}######### ${AnsiColor.BRIGHT_BLACK}####################################
       ${AnsiColor.RED}######### ${AnsiColor.BRIGHT_BLACK}####################################
      ${AnsiColor.RED}######### ${AnsiColor.BRIGHT_BLACK}###################################

     ${AnsiColor.BLUE}##########
     ${AnsiColor.BLUE}########
     ${AnsiColor.BLUE}######
     ${AnsiColor.BLUE}####
      ${AnsiColor.BLUE}#

実行するとこんな感じ。

とても良い感じになりましたね♪

終わりに

実際の開発には直接は関係のないところですが、社内パッケージを作っている場合にはこういう部分にブランドロゴを埋め込むのも良いと思います♪

もちろん個人開発時の遊び心としても面白いので、余裕がある方はぜひ試してみてください♪