古い azure-storage-blob を利用した Spring Boot のプロジェクトがビルドできなくなった問題への対応メモ

# 背景
- 数年前の azure-storage-blob を利用している Spring Boot プロジェクトをビルドする必要があった
- もろもろハマったのでメモとして残しておく

# 対応一覧
## azure-storage-blob 12.0.0 が参照できなくなった
- mavenCentral から参照できなくなった
- バージョンを上げる
    - 単純に上げるだけだと他ライブラリのバージョンと競合するので合わせて対応していく
- azure-sdk-bom を利用してバージョンを上げる
    - https://learn.microsoft.com/ja-jp/azure/developer/java/sdk/get-started-gradle
    ```groovy: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 のバージョンを変更
    ```groovy:build.gradle
    plugins {
        id 'org.springframework.boot' version '2.4.13'
        id 'java'
    }
    ```
## HTTP クライアントの調整
- netty 関連のエラーがの解消に手間取り、今回は okhttp を利用する形にした
    - netty でも対応はできるはず
    ```groovy:build.gradle
    implementation 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'
    ```
- 参考ページ
    - https://learn.microsoft.com/ja-jp/azure/developer/java/sdk/http-client-pipeline

## storage 処理時に例外対応
- storage アップロード時に以下例外発生するようになった
```
java.io.IOException: mark/reset not supported
```
- 文字通りの例外で、ライブラリに渡している InputStream が mark/reset に対応していない
    - 12.0.0 では問題なかった
- ライブラリを使用しているプログラムを修正し、BufferdInputSteam でラップするなどする

# その他
- Artifacty などのプロダクトを使用すれば旧バージョンのライブラリも利用できる