Mavenリポジトリが必要な場合

社内などプライベートな環境でJavaライブラリを管理したい場合は多いと思います。
ある程度の規模になるとNexusを導入したりしますが、もう少し手軽に実現したい時もあります。
このエントリは、AWS S3を利用してMavenリポジトリを構築する方法です。

手順

以下の順でMavenリポジトリを作成、使用します。
1. S3にMavenリポジトリ用のBucketを作成
2. S3のMavenリポジトリにアクセスするためのユーザ作成
3. Gradleのpluginでライブラリの登録設定
4. ライブラリを利用するためのクライアント設定

1. Mavenリポジトリ用のBucketを作成

特筆すべきことはなく通常通り、S3のBucketを作成します。
ここではmy-mavenというBucketを作成したとします。

2. Mavenリポジトリにアクセスするためのユーザ作成

必須ではないですが、適切なアクセス制御のために、Mavenリポジトリ用のユーザを作成し、S3のアクセス権限を追加します。
また、このタイミングでAWSのAccess key IDSecret access keyを取得します。

アクセスポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::my-maven",
                "arn:aws:s3:::my-maven/*"
            ]
        }
    ]
}

3. Gradleのpluginでライブラリの登録設定

maven-publishプラグインを適用し、ライブラリを登録するための設定を行います。

build.gradle
apply plugin: 'maven-publish'

def tag = System.getenv('CIRCLE_TAG') // git tagのプッシュを検知 (CircleCIの場合の例)
def buildVersion = "1.0.0"
group = 'com.example'
version = tag ? "${tag}-RELEASE" : "${buildVersion}-SNAPSHOT" // tagプッシュの場合RELEASE、それ以外はSNAPSHOTとする (このあたりは実際の運用に合わせて指定)

// リポジトリ登録するライブラリにソースも含めるため
task sourceJar(type: Jar) {
    from sourceSets.main.allJava
}

publishing {
    repositories {
        maven {
            url "s3://my-maven"
            credentials(AwsCredentials) {
                accessKey System.getenv('AWS_ACCESS_KEY_ID')
                secretKey System.getenv('AWS_SECRET_ACCESS_KEY')
            }
        }
    }
    publications {
        mavenJava(MavenPublication) {
            from components.java
            artifact sourceJar {
                classifier "sources"
            }
        }
    }
}

以下のコマンドで、ソースのビルドと、リポジトリ登録を行います。
通常はCIなどを経由して利用することになると思います。

$ gradle publish

4. ライブラリを利用するためのクライアント設定

作成したMavenリポジトリをクライアント側で追加すれば、他のリポジトリと同様に利用できるようになります。

build.gradle
repositories {
    mavenCentral()
    // 以下を追加
    maven {
        url "s3://my-maven"
        credentials(AwsCredentials) {
            accessKey System.getenv('AWS_ACCESS_KEY_ID')
            secretKey System.getenv('AWS_SECRET_ACCESS_KEY')
        }
    }
}

まとめ

構築も簡単なので、ライブラリ管理が必要になったときの手段の1つとして有効です。
また、今回の例はGradleでしたが、Mavenでも同様のことができます。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.