背景
- 数年前の azure-storage-blob を利用している Spring Boot プロジェクトをビルドする必要があった
- もろもろハマったのでメモとして残しておく
対応一覧
azure-storage-blob 12.0.0 が参照できなくなった
- mavenCentral から参照できなくなった
- バージョンを上げる
- 単純に上げるだけだと他ライブラリのバージョンと競合するので合わせて対応していく
- azure-sdk-bom を利用してバージョンを上げる
build.gradle
implementation platform('com.azure:azure-sdk-bom:1.2.22') implementation 'com.azure:azure-storage-blob'
- 他ライブラリは別途調整
- ライブラリバージョンを上げただけの参考例外。サーバ起動時
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [jp.co.saison.gregorio.backend.infrastructure.gateway.azurestoragegateway.EventImageAzureStorageBlobGateway]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: io/netty/handler/logging/ByteBufFormat
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:213) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:117) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:310) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]
... 19 common frames omitted
Caused by: java.lang.NoClassDefFoundError: io/netty/handler/logging/ByteBufFormat
at reactor.netty.transport.logging.ReactorNettyLoggingHandler.<init>(ReactorNettyLoggingHandler.java:65) ~[reactor-netty-core-1.0.40.jar:1.0.40]
at reactor.netty.transport.logging.AdvancedByteBufFormat.toLoggingHandler(AdvancedByteBufFormat.java:109) ~[reactor-netty-core-1.0.40.jar:1.0.40]
at reactor.netty.http.client.HttpClientConfig.<clinit>(HttpClientConfig.java:722) ~[reactor-netty-http-1.0.40.jar:1.0.40]
at reactor.netty.http.client.HttpClientConnect.<init>(HttpClientConnect.java:84) ~[reactor-netty-http-1.0.40.jar:1.0.40]
at reactor.netty.http.client.HttpClient.create(HttpClient.java:398) ~[reactor-netty-http-1.0.40.jar:1.0.40]
at com.azure.core.http.netty.NettyAsyncHttpClientBuilder.build(NettyAsyncHttpClientBuilder.java:206) ~[azure-core-http-netty-1.14.1.jar:1.14.1]
at com.azure.core.http.netty.NettyAsyncHttpClientProvider.createInstance(NettyAsyncHttpClientProvider.java:64) ~[azure-core-http-netty-1.14.1.jar:1.14.1]
at com.azure.core.http.netty.NettyAsyncHttpClientProvider.createInstance(NettyAsyncHttpClientProvider.java:70) ~[azure-core-http-netty-1.14.1.jar:1.14.1]
at com.azure.core.implementation.http.HttpClientProviders.lambda$createInstance$0(HttpClientProviders.java:58) ~[azure-core-1.47.0.jar:1.47.0]
at com.azure.core.implementation.util.Providers.create(Providers.java:119) ~[azure-core-1.47.0.jar:1.47.0]
at com.azure.core.implementation.http.HttpClientProviders.createInstance(HttpClientProviders.java:58) ~[azure-core-1.47.0.jar:1.47.0]
at com.azure.core.http.HttpClient.createDefault(HttpClient.java:61) ~[azure-core-1.47.0.jar:1.47.0]
at com.azure.core.http.HttpClient.createDefault(HttpClient.java:51) ~[azure-core-1.47.0.jar:1.47.0]
at com.azure.core.http.HttpPipelineBuilder.build(HttpPipelineBuilder.java:86) ~[azure-core-1.47.0.jar:1.47.0]
at com.azure.storage.blob.implementation.util.BuilderHelper.buildPipeline(BuilderHelper.java:151) ~[azure-storage-blob-12.25.3.jar:12.25.3]
at com.azure.storage.blob.BlobContainerClientBuilder.buildAsyncClient(BlobContainerClientBuilder.java:163) ~[azure-storage-blob-12.25.3.jar:12.25.3]
at com.azure.storage.blob.BlobContainerClientBuilder.buildClient(BlobContainerClientBuilder.java:124) ~[azure-storage-blob-12.25.3.jar:12.25.3]
Caused by: java.lang.ClassNotFoundException: io.netty.handler.logging.ByteBufFormat
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) ~[na:na]
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
Spring Boot のバージョンを上げる
- 2.x を使っていて古かったので最新に変更する
- その際、古い gradle のバージョンも利用不可になっていたので合わせて変更する
- wrapper のバージョンを変更
build.gradleplugins { id 'org.springframework.boot' version '2.4.13' id 'java' }
- その際、古い gradle のバージョンも利用不可になっていたので合わせて変更する
HTTP クライアントの調整
- netty 関連のエラーがの解消に手間取り、今回は okhttp を利用する形にした
- netty でも対応はできるはず
build.gradleimplementation platform('com.azure:azure-sdk-bom:1.2.22') implementation 'com.azure:azure-storage-blob' implementation 'com.azure:azure-core-http-okhttp' implementation 'com.squareup.okhttp3:okhttp:4.12.0'
- 参考ページ
storage 処理時に例外対応
- storage アップロード時に以下例外発生するようになった
java.io.IOException: mark/reset not supported
- 文字通りの例外で、ライブラリに渡している InputStream が mark/reset に対応していない
- 12.0.0 では問題なかった
- ライブラリを使用しているプログラムを修正し、BufferdInputSteam でラップするなどする
その他
- Artifacty などのプロダクトを使用すれば旧バージョンのライブラリも利用できる