待望の(?)Java 27がリリースされました。
Java 27 is now available! #Java27 #JDK27 #OpenJDK
Download now: https://t.co/0ZwSLt09RU
Release notes: https://t.co/MwnBiicZDy
API Javadoc: https://t.co/JIEwGOIgX6
Features: https://t.co/c6KX9u8jt3
Blog: https://t.co/4aFf6UTSkL pic.twitter.com/K293iuF8Ga— Java (@java) September 15, 2026
自社アプリケーション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))
}
}
}