AWS SDK javaのパッケージとv1, v2の共存について

死ぬほど今更ですがAWS SDK javaについて自分のほしい情報を早引きしたかったのでまとめ。

v1とv2のgroupid・パッケージの違い

v1,v2はgroupidやパッケージが異なっているがどちらがv2なのかそこまで自明ではないので以下にまとめる。

以下のマッピングになっている。

version groupid s3のときの指定例 全部一括で依存する時の指定
v1 com.amazonaws com.amazonaws.aws-java-sdk-s3 com.amazonaws.aws-java-sdk
v2 software.amazon.awssdk software.amazon.awssdk.s3 software.amazon.awssdk.aws-sdk-java

BOMについて

AWS SDKは内部的には別々のライブラリになっており、S3, kinesisなど必要なサービスに関するライブラリのみに依存出来る。 これらのライブラリはパッケージが一部被っている関係で、バラバラのバージョンに依存するとバイナリ互換に関する問題が発生しうる。

BOM (bills of materials)はこの問題に対処するもので、要は一貫性が取れてるライブラリのバージョン番号一覧のようなもの。 依存にBOMを加えつつ各サービスごとのライブラリのバージョン指定を省略することで、いい感じに互換性のあるバージョンを解決してくれるようになっている。

設定例

Apache Maven プロジェクトの設定 - AWS SDK for Java を参考にすると以下のようになる。

BOM指定

<project>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>bom</artifactId>
        <version>2.X.X</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

依存指定

    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>dynamodb</artifactId> <- version指定不要
    </dependency>

bomを使いたくないとき

bomを使いたくない場合は手動で互換性のあるバージョンを指定することになります。

とはいえv1の例v2の例 を見ると基本的に全部一貫して同じバージョンを使っておけば良いのであんまり苦にはならないはず。(一部v1のswfみたいな開発が止まってるやつは古いバージョンになっていたりするっぽい)

心配なときは、以下から最新バージョンを見つけて各サービスの利用すべきバージョンをチェックしてみよう。

V1, V2同時利用について

SDK for Java 1.x と 2.x の並行使用 - AWS SDK for Java によるとv1, v2を一つのアプリケーションで同時に依存しても良さそう。

特に工夫も必要なくサービスごとに別々にv1, v2の依存を追加すればいいっぽい。(パッケージ違うから割と安心してできるはず。)