LoginSignup
0
0

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

Last updated at Posted at 2024-04-15

背景

  • 数年前の 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.gradle
    plugins {
        id 'org.springframework.boot' version '2.4.13'
        id 'java'
    }
    

HTTP クライアントの調整

  • netty 関連のエラーがの解消に手間取り、今回は okhttp を利用する形にした
    • netty でも対応はできるはず
    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'
    
  • 参考ページ

storage 処理時に例外対応

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

その他

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0