SpringBoot で開発を始める際に、Spring 公式が提供している Spring Initializr というプロジェクトの雛形生成ツールを使うのが一般的だと思います。
このツールですが、これ自身も SpringBoot で開発されており、Netflix とかは社内でカスタマイズして、生産性を爆上げさせている話もあったりします。1
そういった背景があり、以前から中身はどんな感じなんだろうと気になっていたので、このアドベントカレンダーを機に実装を見て、気づきを Qiita に残していこうと思います。
リポジトリの構成を理解する
Initializr のリポジトリは spring-io という Organization 配下にあります。
Spring 本体の Organization である spring-projects とはまた別の Organization です。
start.spring.io - GitHub
initializr - GitHub
ただ、メンバー見る限り Spring の中の人が開発していると言ってよい感はあります。
README を見る限り、 start.spring.io が実際にサービスをデプロイするときの UI だったり、サーバー側の設定のカスタマイズを行っているようです。
initializr は本体という印象。
ちなみに、公式ドキュメントはこちらのようです。
docs.spring.io なので、 spring.pleiades.io で日本語訳される範囲からは外れている模様。
README を読む
それぞれのリポジトリに記載されている README を読んで、もうちょっと細かい情報を把握していきます。
start.spring.io の README
主なモジュールの説明
- start-client: クライアントサイドのアセット
- start-site: サーバーインフラとメタデータの設定
- start-site-verification: メタデータの妥当性を検証するテスト
使い方
- ユーザとしての使い方マニュアルは USING.adoc で整理されている
- ローカル環境でビルドや実行するまでのコマンドは README.adoc に記載されている通り
Bash ライクなシェルで実施と書いているけど、 mvnw.cmd
があるので PowerShell とかでも可の雰囲気があります。
その他
- Web UI に関しては提供しているけど、 Spring Initializr ライブラリと同等のサポートレベルはない
- ライセンスは Apache 2.0 のため、無償の範囲で商用利用可能で改変や再配布も OK
initializr の README
基本的なコンセプト
- Java、Kotlin、Groovy などの基本的な JVM 言語のプロジェクト生成に対応
- Apache MavenとGradleのビルドシステムをサポート
- .gitignoreファイルの自動生成
- カスタムリソース生成のための拡張ポイントを提供
使い方
- ローカル環境でビルドや実行するまでのコマンドは README.adoc に記載されている通り
- CLI(Spring Boot CLI, cURL, etc)や IDE(VSCode, Eclipse, IntelliJ IDEA(有償版), NetBeans)、Web UI(https://start.spring.io)で利用可能
- initializr-web モジュールを使えば、独自にカスタマイズしたインスタンスを簡単に立ち上げられる
その他
バージョン 1.0 より前だから大規模なリファクタリングが発生する可能性はあるそうです。ただ、GitHub の milestones 見る限り、そういった予定は計画されてはなさそう。
git clone する
一旦、リポジトリ2つとも git clone してソースコードの全体像を把握してみます。
Git の履歴とかは不要なので、直近のソースコードの情報だけにしたいため --depth=1
を付けて clone しています。
こうすると、ファイルサイズが節約できるので。
mkdir ~/repos/spring-io && cd ~/repos/spring-io
git clone --depth=1 https://github.com/spring-io/start.spring.io.git
git clone --depth=1 https://github.com/spring-io/initializr.git
もし、この記事で読んでいるバージョンと同じにしたい場合、以下のコマンドで合わせられます。(12月7日時点で最新のコミットハッシュです)
cd ~/repos/spring-io/start.spring.io
git fetch --depth=1 origin db5dc08e67104a06fe2cd850d10cefa96c7db386
git checkout db5dc08e67104a06fe2cd850d10cefa96c7db386
cd ~/repos/spring-io/initializr
git fetch --depth=1 origin ad03a71a30b89457fb97dff11dcb103565735fba
git checkout ad03a71a30b89457fb97dff11dcb103565735fba
また、今後コードが修正された際に、自分が知っているソースコードとの差分を確認できると後々便利なので、git の tag を付けてどのバージョンでコードを読んだのかわかるようにしておきます。
cd ~/repos/spring-io/start.spring.io
git tag -a reading_202412 -m "ソースコード読解用(2024年12月)"
cd ~/repos/spring-io/initializr
git tag -a reading_202412 -m "ソースコード読解用(2024年12月)"
tokei で行数カウントする
IDE(今回は VSCode を使用予定)で開く前に、 tokei でプロジェクトの規模感を確認します。
tokei は Rust 製のソースコードの行数カウンタツールです。
数年前は、 cloc という Perl 製の行数カウンタや、それを Go で置き換えした go-cloc を使っていましたが、tokei が速いのでこれを使うようになりました。
cd ~/repos/spring-io
tokei start.spring.io
===============================================================================
Language Files Lines Code Comments Blanks
===============================================================================
AsciiDoc 4 516 383 0 133
Batch 1 149 134 0 15
Java 337 20259 10497 7019 2743
JavaScript 70 6800 6336 62 402
JSON 5 1854 1854 0 0
Mustache 7 126 105 0 21
Sass 14 3449 3213 46 190
Shell 1 259 184 49 26
SVG 1 28 26 0 2
Plain Text 1 202 0 169 33
XML 6 540 480 31 29
YAML 26 1994 1990 0 4
-------------------------------------------------------------------------------
HTML 1 87 83 0 4
|- CSS 1 162 162 0 0
(Total) 249 245 0 4
===============================================================================
Total 474 36263 25285 7376 3602
===============================================================================
tokei initializr
===============================================================================
Language Files Lines Code Comments Blanks
===============================================================================
AsciiDoc 11 1992 1535 2 455
Batch 3 392 341 0 51
CSS 1 599 548 34 17
Java 590 62314 36471 17085 8758
JSON 21 2269 2269 0 0
Kotlin 2 29 23 0 6
Mustache 12 157 139 0 18
Shell 4 873 556 219 98
Plain Text 1 202 0 169 33
XSL 1 27 27 0 0
XML 35 2334 2210 37 87
YAML 10 442 438 0 4
===============================================================================
Total 691 71630 44557 17546 9527
===============================================================================
なかなかの規模感ですが、よく見る現場の Java コード資産と比べるとかなり軽量な気がします。initializr に Kotlin のコードが 23 行だけあるのが若干気になります。
なぜ、Initializer ではなく Initializr なのか?
気になったので調べてみました。GitHub の Issue とかには検索した感じ、こういった質問はこれまで飛んで来てなさそうです。
そのため、これから記載することはあくまで私の推測ですが、おそらく以下の記事に書かれているような背景でわざと e を取り除いたように見えます。
どうやら 2004 年に写真共有サービスの Flickr が、本当は flicker にしたかったけど、ドメインが取れなかったから flickr にしたのが最初らしいです。その後、Flickr が順調に成長すると、新しいテック企業(Blendr や Tumblr など)も真似たため、「eの欠落」が今どきのイケてる新しい企業の商標的な存在になり、 Spring Initilizr もそれにあやかった感じだと思います。へぇー。