Uncategorized

Java 27に移行完了

待望の(?)Java 27がリリースされました。

自社アプリケーション3つをJava 27に移行しました。新しい文法要素は何も使っていませんが、パフォーマンスやメモリ利用効率が向上していれば嬉しいです。

なんてことはありませんが2点だけ工夫が必要でしたので簡単にメモを残します。

バグの回避

以下のようなコードをJava 27でコンパイルするとjavac内部でNullPointerExceptionが発生します。Java 26では正常にコンパイルが通るコードです。

import java.io.IOException;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.CLASS)
@interface TypeUseAnnotation {
}

class Scratch {
    void main() {
        IO.println("Hello world!");
    }

    static {
        try {
            throw new IOException();
        } catch (@TypeUseAnnotation IOException ignored) {
        }
    }

}

これは依存ライブラリのない最小再現コードで、実際はこんな意味不明なコードではありません。プロダクションコードではJSpecifyの@NotNullをstaticブロックで使っているところで問題が発生していました。
アノテーションを削除することで問題は回避できました。なお、既知のバグではなさそうだったので報告済みです。

Gradleの起動JVM

現時点でGradleを実行できるJVMの最新バージョンは26です。すぐに27もサポートバージョンとなるとは思われますが、ひとまずGradleの起動JVMを26、ターゲットを27とすることで回避しました。ターゲットを27とするにはKotlin DSLでは以下のように書きます。

    plugins.withType().configureEach {
        java {
            sourceCompatibility = JavaVersion.VERSION_27
            toolchain {
                languageVersion.set(JavaLanguageVersion.of(27))
            }
        }
    }