M1 MacでSpring Boot実行時に発生するNettyエラーを抑える方法

こんにちは。 エキサイト株式会社の三浦です。

M1 MacでSpring Bootを実行すると、Netty周りでエラーが起きる場合があります。

今回は、そのエラーを解消する方法を説明します。

M1 MacとSpring BootのNettyエラー

M1 Macは、従来のIntel Macよりもパフォーマンス面で優れていると言われています。

一方で、M1 Macで使われているCPUアーキテクチャIntel Macのそれと異なるため、問題が起きることがあります。

Spring Bootの実行時も同様で、M1 Macで実行すると以下のエラーが起きる場合があります。

Unable to load io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider, fallback to system defaults. This may result in incorrect DNS resolutions on MacOS.

エラーの解消方法

このエラーの解消方法は簡単で、M1 Mac用のライブラリを明示的に指定すれば解消します。

Gradleを使っている場合は、build.gradleに以下のように指定します。

implementation 'io.netty:netty-resolver-dns-native-macos:4.1.80.Final:osx-aarch_64'

ただし、これだけだと逆にM1 Mac以外でもM1 Mac用のライブラリが使用されてしまうので、それを避ける場合は以下のように条件づけすると良いでしょう。

// Apple Silicon使用時で、かつjibによるデプロイでない時のみ、Apple Silicon用のライブラリを使用する
// jib以外のデプロイ方法を使用している場合は、適切なタスク名を使用する
final String osName = java.util.Optional.ofNullable(System.getProperty("os.name")).orElse("")
final String osArch = java.util.Optional.ofNullable(System.getProperty("os.arch")).orElse("")
final String taskName = project.gradle.startParameter.getTaskNames().isEmpty()
        ? ""
        : java.util.Optional.ofNullable(project.gradle.startParameter.getTaskNames().first()).orElse("")
if (osName.startsWith("Mac OS X")
        && osArch == "aarch64"
        && !taskName.contains("jibDockerBuild")
) {
    implementation 'io.netty:netty-resolver-dns-native-macos:4.1.80.Final:osx-aarch_64'
}

参考

github.com

最後に

M1 Macが出てしばらく経っていますが、まだすべてのアプリケーションで完全に問題がなくなったわけではありません。

うまく付き合っていきましょう。