$30 off During Our Annual Pro Sale. View Details »

JavaとGroovyで書かれたGradleプラグインをKotlinで書き直した話 / Converted a Gradle plugin from Groovy&Java to Kotlin

Kengo TODA
October 26, 2023

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

More Decks by Kengo TODA

Other Decks in Programming

Transcript

  1. JavaとGroovyで書かれた
    Gradleプラグインを
    Kotlinで書き直した話
    2023/Oct/26 集まれKotlin好き!Kotlin愛好会 vol.47
    Kengo TODA

    View Slide

  2. #LOVE_KOTLIN
    自己紹介
    フリーソフトウェア開発出身。OSSエンジニアやBtoB研究開発を経て、現在は
    医療機関向けにウェブサービスを提供する株式会社ヘンリーでSREやCorporate
    Engineerを担当。元SpotBugsの中の人。
    ChatGPTと一緒に数学書とか論文とかを読むのが最近のマイブーム。
    https://twitter.com/Kengo_TODA
    https://github.com/KengoTODA
    2

    View Slide

  3. #LOVE_KOTLIN
    今日話すこと
    JavaとGroovyで書いてあった spotbugs-gradle-plugin をKotlinで書き直してRC版リ
    リースまで漕ぎつけたので、所感を共有します!
    3

    View Slide

  4. #LOVE_KOTLIN
    Agenda
    1. JavaとGroovyで書いて課題だと感じていたこと
    2. Kotlinの流れがきた!
    3. 書き換えプロセスの体験
    4. Kotlinで書いて良かったところ
    4

    View Slide

  5. #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

    View Slide

  6. #LOVE_KOTLIN
    Kotlinの流れがきた!
    - 2022年、自分がサーバサイドKotlinを書いてる企業に転職した
    - 周りにKotlinを書いているひとが多い環境になった
    - 2023年、GradleがKotlinをDSLの標準言語にした
    - 以前「Java開発者向けのKotlin Gradleビルドスクリプト入門 」を話したのでご参考まで
    - Gradleが提供するドキュメントも多い
    - 何なら公式プラグインも Kotlinで書かれていたりする
    - Kotlinなら型安全、null安全、強力なIDEの支援などが一気に解決される
    6

    View Slide

  7. #LOVE_KOTLIN
    Javaからの書き換え
    簡単だったので語るべきところがない
    - IntelliJ IDEAがJava→Kotlinの変換をだいたいやってくれる
    - IntelliJ IDEAがKotlinらしい書き方のサジェストもしてくれる
    - だいたいIntelliJ IDEAに任せておけば間違いない
    - フォーマットもSpotless(ktlint)にお任せ
    7

    View Slide

  8. #LOVE_KOTLIN
    Groovyからの書き換え
    面倒だったところ
    - IntelliJ IDEAが変換をやってくれないので自分でやる
    - コンストラクタ、メソッド、フィールドなど細かいところで書き方が違う
    良かったところ
    - lateinit相当のフィールドの存在に気づけた
    - コンストラクタでfinalではないメソッドを呼び出していたことに気づけた
    8

    View Slide

  9. #LOVE_KOTLIN
    難しかったところ
    ● functional testをSpockからKotestに切り替えたかったが、テストが起動しな
    かったので諦めた
    9

    View Slide

  10. 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

    View Slide

  11. #LOVE_KOTLIN
    Kotlinで書いて良かったところ
    scope functionで初期化コードを意味ある単位で
    まとめて書ける
    11
    var extension = project.extensions.create(
    “extensionName”, MyExtension.class
    ).apply {
    prop.convention(true)
    another.convention(“default”)
    }

    View Slide

  12. 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")
    }
    )
    }

    View Slide

  13. #LOVE_KOTLIN
    ご清聴ありがとうございました
    Javaもまだ使ってるよ!という方は、今回紹介したspotbugs-gradle-pluginのv6を試
    してほしいですm (_ _)m
    13

    View Slide

  14. #LOVE_KOTLIN
    補足 なぜJavaとGroovyを混在させていたか
    ● もともとはJavaだけだった
    ● 公式のプラグイン実装の書き方がGroovyで説明されていてJavaだと書きにくい
    ことがあった
    ● Extension周りはGroovyで書いたほうがコードも短くなることがわかった
    ○ Javaだとアクセッサの嵐になる
    ● でもGroovyはIDEの対応が微妙で全部書き換える気になれなかった
    14

    View Slide

  15. #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

    View Slide