More Related Content
Similar to Spring Initializrをハックする-カスタマイズを通してその内部実装を覗く (20)
Spring Initializrをハックする-カスタマイズを通してその内部実装を覗く
- 1. © 2019 NTT DATA Corporation
2019/11/15 日本Springユーザ会主催 Spring One 2019報告会
株式会社NTTデータ システム技術本部 齊加匠
Spring Initializrをハックする
-カスタマイズを通してその内部実装を覗く
- 2. © 2019 NTT DATA Corporation 2
{
“name”: {
“ja”: “齊加匠”,
”en”: “SAIKA TAKUMI”,
},
“company”: “NTTDATA”,
“favorites”: [“Arch Linux”, “Golang”, “Neovim”],
“github”: “takumi34”,
“twitter”: “@Untergrund_idol”,
“blog”: “takumi34.github.io”,
}
自己紹介
- 3. © 2019 NTT DATA Corporation 3
現地での写真
NTTデータの出展ブース
- 4. © 2019 NTT DATA Corporation 4
話すこと
Spring Initializrの
カスタマイズについて
- 5. © 2019 NTT DATA Corporation 5
「Creating “The Second Best Place on the Internet”
with Spring Initializr」
Stéphane Nicoll
https://content.pivotal.io/slides/creating-the-second-best-place-on-the-internet-
with-spring-initializr
https://github.com/snicoll/demo-custom-initializr
聴講したセッション
- 6. © 2019 NTT DATA Corporation 6
1.軽い紹介
2.歴史
3.カスタマイズ
もくじ
- 8. © 2019 NTT DATA Corporation 8
Spring Initializr
- 9. © 2019 NTT DATA Corporation 9
Web, IDE, CLIなどのクライアントから
Spring Bootのプロジェクトを
生成できるツール
Spring Initializr
- 10. © 2019 NTT DATA Corporation 10
WEB UI
https://start.spring.io/
- 11. © 2019 NTT DATA Corporation 11
start.spring.io
https://github.com/spring-io/start.spring.io
- 12. © 2019 NTT DATA Corporation 12
Initializr
https://github.com/spring-io/initializr
- 13. © 2019 NTT DATA Corporation 13
Spring Initializr
の軽い説明
- 16. © 2019 NTT DATA Corporation 18
https://start.spring.io/
- 18. © 2019 NTT DATA Corporation 20
➜ curl https://start.spring.io/starter.tgz -d dependencies=web | tar -xzvf –
➜ tree
.
├── HELP.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── demo
│ │ └── DemoApplication.java
│ └── resources
│ ├── application.properties
│ ├── static
│ └── templates
└── test
└── java
└── com
└── example
└── demo
└── DemoApplicationTests.java
14 directories, 7 files
Curlだと
- 20. © 2019 NTT DATA Corporation 24
IntelliJ IDEA Ultimateだと
- 21. © 2019 NTT DATA Corporation 25
ちなみに
Spring Boot CLIでも
- 28. © 2019 NTT DATA Corporation 36
最初は簡単なgroovy script
https://content.pivotal.io/slides/creating-the-second-best-place-on-the-internet-with-spring-initializr
- 29. © 2019 NTT DATA Corporation 37
• Terminal Support
– Spring Boot CLI (March 2014)
– CURL, HTTP (Jan 2015)
• IDE
– STS, IntelliJ IDEA (March 2015)
– Netbeans (May 2016)
– VSCode (Jan 2018)
Supportの広がり
- 30. © 2019 NTT DATA Corporation 41
Spring Initializr
の凄さ
- 31. © 2019 NTT DATA Corporation 42
Spring Bootの
エコシステムを
形成
- 32. © 2019 NTT DATA Corporation 43
一か月で世界で
1M以上の
ダウンロード
- 36. © 2019 NTT DATA Corporation 52
そもそもカスタマイズし
て何がうれしい?
- 38. © 2019 NTT DATA Corporation 54
• UIの変更
• パッケージのオプションの変更
• デフォルトの依存関係の変更
• 3rd partyの依存関係の追加
• .gitignoreの変更やREADMEの追加
など
カスタマイズの例
- 39. © 2019 NTT DATA Corporation 56
実際に
カスタマイズして
いる事例
- 40. © 2019 NTT DATA Corporation 57
https://github.com/ssherwood/presentations/blob/master/springone-2016/easy-
microservices/initializr-guide.adoc
↑内容はちょっと古い
https://www.slideshare.net/SpringCentral/easy-consumption-of-microservices
Spring One 2016の発表
- 41. © 2019 NTT DATA Corporation 59
まずはInitializr
の中身見てみる
- 42. © 2019 NTT DATA Corporation 60
https://github.com/spring-io/initializr
- 43. © 2019 NTT DATA Corporation 64
旧 新(2019年2月から)
https://spring.io/blog/2019/02/20/what-s-new-with-spring-initializr
- 46. © 2019 NTT DATA Corporation 67
時は2017年に遡る
https://github.com/spring-io/initializr/issues/340
- 47. © 2019 NTT DATA Corporation 68
今までもInitializrをカスタマイズす
ることは可能だった
- 48. © 2019 NTT DATA Corporation 69
しかし、libraryをforkして変更しな
ければならなかった
- 49. © 2019 NTT DATA Corporation 71
2019年10月に
Spring Initializr 0.8.0がリリースされた
- 50. © 2019 NTT DATA Corporation 72
Spring Initializr 0.8 brings a complete rewrite of the project
generation API with dedicated abstractions for common assets of
JVM-based projects.
(中略)
This should make the creation of a custom instance easier than
ever!
Spring Initializr 0.8.0リリースの目玉
https://spring.io/blog/2019/10/14/spring-initializr-0-8-0-available-now
- 51. © 2019 NTT DATA Corporation 74
• BuildCustomizer to add dependencies, plugins
or other configuration items
• ProjectContributor, a high-level hook-point to
add assets to a directory structure
https://spring.io/blog/2019/02/20/what-s-new-with-spring-initializr
新たに追加されたAPI
- 53. © 2019 NTT DATA Corporation 78
実際に自分
で使ってカスタ
マイズしてみた
- 54. © 2019 NTT DATA Corporation 79
セッションとは
違うカスタマイ
ズ
- 56. © 2019 NTT DATA Corporation 82
dependencies {
implementation ("org.springframework.boot:spring-boot-starter-web“)
implementation("io.spring.initializr:initializr-web")
implementation("io.spring.initializr:initializr-generator-spring")
}
dependencyManagement {
imports {
mavenBom "io.spring.initializr:initializr-bom:0.8.0.RELEASE"
}
}
build.gradle
- 57. © 2019 NTT DATA Corporation 83
dependencies {
implementation ("org.springframework.boot:spring-boot-starter-web“)
implementation("io.spring.initializr:initializr-web")
implementation("io.spring.initializr:initializr-generator-spring")
}
dependencyManagement {
imports {
mavenBom "io.spring.initializr:initializr-bom:0.8.0.RELEASE"
}
}
build.gradle
BOM(a Bill of Materials)
- 58. © 2019 NTT DATA Corporation 85
これでlocalhost:8080ア
クセスすると
- 60. © 2019 NTT DATA Corporation 88
IntelliJ IDEAなどでlocalhost:8080にアクセスするとやりやすい
- 61. © 2019 NTT DATA Corporation 89
次は
BuildCustomizer
ProjectContributer
を使ってみる
- 62. © 2019 NTT DATA Corporation 90
io.spring.initializr.generator.project.ProjectGenerationConfiguration=\
com.chika.custominitializr.contributer.SampleProjectGenerationConfiguration
spring.factoriesにパス記載
- 63. © 2019 NTT DATA Corporation 91
io.spring.initializr.generator.project.ProjectGenerationConfiguration=\
com.chika.custominitializr.contributer.SampleProjectGenerationConfiguration
spring.factoriesにパス記載
自動でコンポーネントスキャンされるわけじゃないの
で、spring.factoriesで登録する必要あり
- 64. © 2019 NTT DATA Corporation 92
@ProjectGenerationConfiguration
public class SampleProjectGenerationConfiguration {
@Bean
public BannerContributor bannerContributor() {
return new BannerContributor();
}
@Bean
public BuildCustomizer<MavenBuild> devtoolsContributor () {
return (build) -> build.dependencies().add("devtools",
"org.springframework.boot","spring-boot-devtools", DependencyScope.COMPILE);
}
}
デフォルトの依存関係をカスタマイズ
- 65. © 2019 NTT DATA Corporation 93
@ProjectGenerationConfiguration
public class SampleProjectGenerationConfiguration {
@Bean
public BannerContributor bannerContributor() {
return new BannerContributor();
}
@Bean
public BuildCustomizer<MavenBuild> devtoolsContributor () {
return (build) -> build.dependencies().add("devtools",
"org.springframework.boot","spring-boot-devtools", DependencyScope.COMPILE);
}
}
デフォルトの依存関係をカスタマイズ
このアノテーション
- 66. © 2019 NTT DATA Corporation 94
@ProjectGenerationConfiguration
public class SampleProjectGenerationConfiguration {
@Bean
public BannerContributor bannerContributor() {
return new BannerContributor();
}
@Bean
public BuildCustomizer<MavenBuild> devtoolsContributor () {
return (build) -> build.dependencies().add("devtools",
"org.springframework.boot","spring-boot-devtools", DependencyScope.COMPILE);
}
}
デフォルトの依存関係をカスタマイズ
このアノテーション
依存関係に
devtoolsを追加
- 67. © 2019 NTT DATA Corporation 95
実際に
プロジェクトを
生成すると
- 68. © 2019 NTT DATA Corporation 96
pom.xmlが変更されている
- 69. © 2019 NTT DATA Corporation 97
起動バナーをカスタマイズ
public class BannerContributor implements ProjectContributor {
public void contribute(Path projectRoot) throws IOException {
Path bannerDirectory = projectRoot
.resolve("src/main/resources");
Files.createDirectories(bannerDirectory);
Path file =Files.createFile(bannerDirectory.resolve("banner.txt"));
try (PrintWriter writer = new PrintWriter(Files.newBufferedWriter(file))) {
writer.println(
" _____ _ _ _ ¥n" +
" / ____| | | (_) | | ¥n" +
" | | | |__ _ | | __ __ _ ¥n" +
" | | | '_ ¥¥ | | | |/ / / _` |¥n" +
" | |____ | | | | | | | < | (_| |¥n" +
" ¥¥_____| |_| |_| |_| |_|¥¥_¥¥ ¥¥__,_|¥n"
);
}
}
}
- 70. © 2019 NTT DATA Corporation 98
実際に
プロジェクトを
生成すると
- 73. © 2019 NTT DATA Corporation 103
例えばapplication.ymlに
こう書くと
- 74. © 2019 NTT DATA Corporation 104
initializr:
dependencies:
- name: Web
content:
- name: Web
id: web
description: webだよ!!!
types:
- name: Maven Project
id: maven-project
description: mvn
tags:
build: maven
format: project
default: true
action: /starter.zip
application.yml
packagings:
- name: Jar
id: jar
default: true
javaVersions:
- id: 11
default: true
languages:
- name: Java
id: java
default: true
- name: Kotlin
id: kotlin
default: false
group-id:
value: org.chika
- 75. © 2019 NTT DATA Corporation 105
initializr:
dependencies:
- name: Web
content:
- name: Web
id: web
description: webだよ!!!
types:
- name: Maven Project
id: maven-project
description: mvn
tags:
build: maven
format: project
default: true
action: /starter.zip
application.yml
packagings:
- name: Jar
id: jar
default: true
javaVersions:
- id: 11
default: true
languages:
- name: Java
id: java
default: true
- name: Kotlin
id: kotlin
default: false
group-id:
value: org.chika
Descriptio
nを変更
Defaultも
変えられる
initializrの
namespace
で指定
chika
になってる
- 76. © 2019 NTT DATA Corporation 106
STSでプロジェクトを生成しようとすると
- 77. © 2019 NTT DATA Corporation 107
STSでプロジェクトを生成しようとすると
Discriptionが
変更されてる
- 79. © 2019 NTT DATA Corporation 115
https://github.com/spring-io/initializr/tree/master/initializr-service-sample
- 81. © 2019 NTT DATA Corporation 118
Spring Initializr凄い!
まとめ
- 82. © 2019 NTT DATA Corporation 119
カスタマイズやってみよ
う!
まとめ
- 83. © 2019 NTT DATA Corporation 120
https://github.com/takumi34/custom-spring-initializr
今回使ったコードはここに格納しています