こんにちは。 エキサイト株式会社の三浦です。
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' }
参考
最後に
M1 Macが出てしばらく経っていますが、まだすべてのアプリケーションで完全に問題がなくなったわけではありません。
うまく付き合っていきましょう。