前提
環境 | 値 |
---|---|
OS | Mac(M1) |
Language | Kotlin |
IDE | IntelliJ IDEA 2024.1.1 (Community Edition) |
SDK | corretto-21(Amazon Corretto 21.0.3 - aarch64) |
aws.sdk.kotlin:s3 | 1.3.67 |
事象
AWS SDK for KotlinのDeveloper GuideのS3Client.putObjectsサンプルコードを参考に実装を行なったところ、下記エラーが発生した。
Caused by: java.lang.NoClassDefFoundError: okhttp3/ConnectionListener
解消できた方法
S3ClientのhttpClientに対してCrtHttpEngine
を設定する。
//build.gradle.ktsに下記を追加
implementation("aws.smithy.kotlin:http-client-engine-crt:1.3.20")
suspend fun putS3Object(
bucketName: String,
objectKey: String,
objectPath: String,
) {
val request =
PutObjectRequest {
bucket = bucketName
key = objectKey
body = File(objectPath).asByteStream()
}
CrtHttpEngine().use { engine ->
S3Client {
region = "us-east-1"
httpClient = engine //<-CrtHttpEngineを使用するよう指定
}.use { s3 ->
val response = s3.putObject(request)
println("Tag information is ${response.eTag}")
}
}
}
解消できなかった方法
- aws.sdk.kotlin:s3を最新バージョン(1.3.69)に変更する
-
デフォルトのOkHttpEngineが使用できない場合の案内リンク先に従い、S3ClientのhttpClientに
OkHttp4Engine
を設定する - 依存関係に
com.squareup.okhttp3:okhttp:4.12.0
を追加する - resolutionStrategyで
com.squareup.okhttp3:okhttp:4.12.0
に統一する - 依存関係に
com.squareup.okhttp3:okhttp:5.0.0-alpha.12(alphaだけど安定版の案内あり)
を追加する - 依存関係に
com.squareup.okhttp3:okhttp:5.0.0-alpha.11(安定版のひとつ前)
を追加する - 依存関係に
com.squareup.okhttp3:okhttp:5.0.0-alpha.14(最新版)
を追加する
TIPS(ChatGPT利用)
httpClient
HTTP通信を行うためのエンジンを指定するプロパティ。
OkHttpEngine
概要
高速で効率的なHTTPクライアントライブラリ。
特徴
- HTTP/1.1、HTTP/2、及びWebSocketサポート
- 接続プールや自動リトライ、接続管理など、高度な機能が提供される
- セッションの管理(クッキー、リダイレクト、キャッシュ)など、標準的なHTTP通信のための多数の機能
- Android向けでよく使われる
OkHttp4Engine
概要
OkHttpライブラリのバージョン4.xを使用するエンジン。
特徴
- 非同期処理をより強力にサポート
- Kotlinに対応したコルーチンベースの非同期処理(
suspend
関数等)を利用可能 - HTTP/2、HTTP/3のサポート(特にHTTP/3は4.xからの新機能)
- セキュリティの向上(TLS 1.3、HTTP/2の強化など)
- APIがシンプルで、以前のバージョンよりも直感的に使いやすい
CrtHttpEngine
概要
AWSの Crt
(Common Runtime)ライブラリに基づくHTTPクライアントエンジン。AWS Crtライブラリのネットワークスタックを利用するため、高性能なHTTP通信を提供してくれる。C/C++で書かれた低レベルのコードが含まれており、効率を重視するシナリオで使用される。
特徴
- 高いパフォーマンスと低レイテンシを提供
- AWS SDKやIoTデバイスとの統合で特に効果を発揮
- 設定が豊富で、トラフィック管理やトラフィック制限、接続管理が細かく制御できる
- デバイス向けに最適化された設計(IoTなど)
- HTTP/1.1、HTTP/2に加えて、TLS接続が非常に強化されている