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で書き直した話 / Con...
Search
Kengo TODA
October 26, 2023
Programming
0
1.2k
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
KotlinユーザのためのJSpecify入門 / JSpecify 101 for Kotlin Devs
eller86
0
1k
ヒューマンスキル / The Humanskills
eller86
0
600
医療機関向けシステムの信頼性 / Reliability of systems for medical institutions
eller86
0
340
Server-side Kotlinを使うスタートアップでどんなDetektルールが育ったか / Detekt rules made in start-up working with Server-side Kotlin
eller86
0
1.4k
Java開発者向けのKotlin Gradleビルドスクリプト入門 / Gradle Build Script in Kotlin 101
eller86
1
1.6k
Goodbye JSR305, Hello JSpecify!
eller86
2
5k
Java8〜16におけるバイトコード生成の変化 / Changes of Bytecode Generation from Java 8 to 16
eller86
4
4.3k
Javaプログラミングの体験向上に関する活動 / DX enhancement around Java programming
eller86
0
3.8k
静的解析ツールで生産性向上
eller86
1
960
Other Decks in Programming
See All in Programming
Unity Android XR入門
sakutama_11
0
160
XStateを用いた堅牢なReact Components設計~複雑なClient Stateをシンプルに~ @React Tokyo ミートアップ #2
kfurusho
1
910
JavaScriptツール群「UnJS」を5分で一気に駆け巡る!
k1tikurisu
9
1.8k
密集、ドキュメントのコロケーション with AWS Lambda
satoshi256kbyte
0
190
Lottieアニメーションをカスタマイズしてみた
tahia910
0
130
Open source software: how to live long and go far
gaelvaroquaux
0
640
AIの力でお手軽Chrome拡張機能作り
taiseiue
0
170
昭和の職場からアジャイルの世界へ
kumagoro95
1
380
第3回 Snowflake 中部ユーザ会- dbt × Snowflake ハンズオン
hoto17296
4
370
ARA Ansible for the teams
kksat
0
150
Bedrock Agentsレスポンス解析によるAgentのOps
licux
3
850
2024年のWebフロントエンドのふりかえりと2025年
sakito
3
250
Featured
See All Featured
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
960
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.6k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Embracing the Ebb and Flow
colly
84
4.6k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
10
1.3k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.6k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
21
2.5k
Automating Front-end Workflow
addyosmani
1368
200k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Producing Creativity
orderedlist
PRO
344
39k
Music & Morning Musume
bryan
46
6.3k
Unsuck your backbone
ammeep
669
57k
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