Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
JavaとGroovyで書かれたGradleプラグインをKotlinで書き直した話 / Converted a Gradle plugin from Groovy&Java to Kotlin
Search
Kengo TODA
October 26, 2023
Programming
0
640
JavaとGroovyで書かれたGradleプラグインをKotlinで書き直した話 / Converted a Gradle plugin from Groovy&Java to Kotlin
2023/Oct/26 集まれKotlin好き!Kotlin愛好会 vol.47 で発表したものです。
Kengo TODA
October 26, 2023
Tweet
Share
More Decks by Kengo TODA
See All by Kengo TODA
ヒューマンスキル / The Humanskills
eller86
0
480
医療機関向けシステムの信頼性 / Reliability of systems for medical institutions
eller86
0
250
Server-side Kotlinを使うスタートアップでどんなDetektルールが育ったか / Detekt rules made in start-up working with Server-side Kotlin
eller86
0
970
Java開発者向けのKotlin Gradleビルドスクリプト入門 / Gradle Build Script in Kotlin 101
eller86
1
1.3k
Goodbye JSR305, Hello JSpecify!
eller86
2
4.3k
Java8〜16におけるバイトコード生成の変化 / Changes of Bytecode Generation from Java 8 to 16
eller86
4
3.8k
Javaプログラミングの体験向上に関する活動 / DX enhancement around Java programming
eller86
0
3.6k
静的解析ツールで生産性向上
eller86
1
790
Building Java App in 2019
eller86
0
110
Other Decks in Programming
See All in Programming
Let's learn code review
riofujimon
2
560
検証も兼ねて個人開発でHonoとかと向き合った話
hanetsuki
1
1.3k
Build Apps for iOS, Android & Desktop in 100% Kotlin With Compose Multiplatform (mDevCamp 2024)
zsmb
0
410
Sheets API使ってみた
toshi0383
2
150
雑に思考を整理する技術と効能
konifar
61
30k
Fragment Composition of GraphQL
quramy
13
1.4k
敵対的ポイフル
futabato
0
120
Introducing Kotlin Multiplatform in an existing mobile app - Workshop Edition | AndroidMakers Paris
prof18
0
140
StoreKit2によるiOSのアプリ内課金のリニューアル
kangnux
0
120
AWS CDKコントリビュートTIPS / aws-cdk-contribution-tips
gotok365
3
300
障害対応を起点としたもっといい開発と運用のサイクル作りのためにできること / Hatena Enginner Seminar #29
polamjag
0
300
Hanami and htmx
bkuhlmann
0
210
Featured
See All Featured
Mobile First: as difficult as doing things right
swwweet
217
8.6k
Fontdeck: Realign not Redesign
paulrobertlloyd
76
4.9k
Docker and Python
trallard
35
2.7k
Code Review Best Practice
trishagee
56
15k
Making the Leap to Tech Lead
cromwellryan
125
8.5k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
242
1.2M
No one is an island. Learnings from fostering a developers community.
thoeni
16
2.1k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
21
1.4k
How STYLIGHT went responsive
nonsquared
92
4.8k
Code Reviewing Like a Champion
maltzj
515
39k
Atom: Resistance is Futile
akmur
260
25k
Music & Morning Musume
bryan
41
5.6k
Transcript
JavaとGroovyで書かれた Gradleプラグインを Kotlinで書き直した話 2023/Oct/26 集まれKotlin好き!Kotlin愛好会 vol.47 Kengo TODA
#LOVE_KOTLIN 自己紹介 フリーソフトウェア開発出身。OSSエンジニアやBtoB研究開発を経て、現在は 医療機関向けにウェブサービスを提供する株式会社ヘンリーでSREやCorporate Engineerを担当。元SpotBugsの中の人。 ChatGPTと一緒に数学書とか論文とかを読むのが最近のマイブーム。 https://twitter.com/Kengo_TODA https://github.com/KengoTODA 2
#LOVE_KOTLIN 今日話すこと JavaとGroovyで書いてあった spotbugs-gradle-plugin をKotlinで書き直してRC版リ リースまで漕ぎつけたので、所感を共有します! 3
#LOVE_KOTLIN Agenda 1. JavaとGroovyで書いて課題だと感じていたこと 2. Kotlinの流れがきた! 3. 書き換えプロセスの体験 4. Kotlinで書いて良かったところ
4
#LOVE_KOTLIN JavaとGroovyで書いて課題だと感じていたこと - null-safetyがない、アノテーションでの補完は漏れが生じる - Groovyにtype-safety がない、IDEによる補完が効かないことがある - Gradleの文書がKotlinとGroovyを前提にしていて、Javaで書きにくい -
周りにGroovyを書いているひとがいなくなった - 昔はJenkinsfileでけっこう書かれていた( 2016年〜) - GradleのGroovy対応がv3に留まっている - 2022年からv4を検証してるけどGradle 8.0から9.0に対応を延期したので優先度高くなさそう 5
#LOVE_KOTLIN Kotlinの流れがきた! - 2022年、自分がサーバサイドKotlinを書いてる企業に転職した - 周りにKotlinを書いているひとが多い環境になった - 2023年、GradleがKotlinをDSLの標準言語にした - 以前「Java開発者向けのKotlin
Gradleビルドスクリプト入門 」を話したのでご参考まで - Gradleが提供するドキュメントも多い - 何なら公式プラグインも Kotlinで書かれていたりする - Kotlinなら型安全、null安全、強力なIDEの支援などが一気に解決される 6
#LOVE_KOTLIN Javaからの書き換え 簡単だったので語るべきところがない - IntelliJ IDEAがJava→Kotlinの変換をだいたいやってくれる - IntelliJ IDEAがKotlinらしい書き方のサジェストもしてくれる -
だいたいIntelliJ IDEAに任せておけば間違いない - フォーマットもSpotless(ktlint)にお任せ 7
#LOVE_KOTLIN Groovyからの書き換え 面倒だったところ - IntelliJ IDEAが変換をやってくれないので自分でやる - コンストラクタ、メソッド、フィールドなど細かいところで書き方が違う 良かったところ -
lateinit相当のフィールドの存在に気づけた - コンストラクタでfinalではないメソッドを呼び出していたことに気づけた 8
#LOVE_KOTLIN 難しかったところ • functional testをSpockからKotestに切り替えたかったが、テストが起動しな かったので諦めた 9
workerExecutor.submit(SpotBugsRunne r.class, config -> { // getFirstEnabled() がnullable config.params(spec, getIgnoreFailures(),
reports.getFirstEnabled().getDestin ation()); 事例 Gradleプラグインにおけるnull-safetyの必要性 「解析レポート出力先」をファイルパスと形式( txt, xml, html, ...)をセットで設定できる仕様だった。 レポートがひとつも設定されていない場合に NPEを 投げてしまった。対象メソッドには @Nullableアノ テーションがついていたが、リリースされるまでこの 問題に気づけなかった。 https://github.com/spotbugs/spotbugs-gradle-p lugin/issues/68 10
#LOVE_KOTLIN Kotlinで書いて良かったところ scope functionで初期化コードを意味ある単位で まとめて書ける 11 var extension = project.extensions.create(
“extensionName”, MyExtension.class ).apply { prop.convention(true) another.convention(“default”) }
private FileCollection classes; void setClasses(FileCollection fileCollection) { this.classes = fileCollection
} FileCollection getClasses() { if (classes == null) { if (getClassDirs() == null) { throw new InvalidUserDataException("The classDirs property is not set") } return getClassDirs().asFileTree.filter({ File file -> file.name.endsWith(".class") }) } else { return classes } } Kotlinで書いて良かったところ フィールドの記述が短くできた 12 var classes: FileCollection? = null get() { return field ?: ( classDirs.asFileTree.filter { it.name.endsWith(".class") } ) }
#LOVE_KOTLIN ご清聴ありがとうございました Javaもまだ使ってるよ!という方は、今回紹介したspotbugs-gradle-pluginのv6を試 してほしいですm (_ _)m 13
#LOVE_KOTLIN 補足 なぜJavaとGroovyを混在させていたか • もともとはJavaだけだった • 公式のプラグイン実装の書き方がGroovyで説明されていてJavaだと書きにくい ことがあった • Extension周りはGroovyで書いたほうがコードも短くなることがわかった
◦ Javaだとアクセッサの嵐になる • でもGroovyはIDEの対応が微妙で全部書き換える気になれなかった 14
#LOVE_KOTLIN 補足 ファイルサイズの変化 Java/Groovy (5.2.1): 圧縮後 85 KiB Kotlin (6.0.0-rc.2):
圧縮後 115KiB ソースコードの数はExtension用コード1つしか増えていないが、コンパイル後の classファイルが37から69に増えている。GroovyでもClosureごとにclassファイルを 作っていたが、KotlinになってLambdaがより増えた。 15