Mavenリポジトリが必要な場合
社内などプライベートな環境でJavaライブラリを管理したい場合は多いと思います。
ある程度の規模になるとNexusを導入したりしますが、もう少し手軽に実現したい時もあります。
このエントリは、AWS S3を利用してMavenリポジトリを構築する方法です。
手順
以下の順でMavenリポジトリを作成、使用します。
- S3にMavenリポジトリ用のBucketを作成
- S3のMavenリポジトリにアクセスするためのユーザ作成
- Gradleのpluginでライブラリの登録設定
- ライブラリを利用するためのクライアント設定
1. Mavenリポジトリ用のBucketを作成
特筆すべきことはなく通常通り、S3のBucketを作成します。
ここではmy-maven
というBucketを作成したとします。
2. Mavenリポジトリにアクセスするためのユーザ作成
必須ではないですが、適切なアクセス制御のために、Mavenリポジトリ用のユーザを作成し、S3のアクセス権限を追加します。
また、このタイミングでAWSのAccess key ID
とSecret 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
プラグインを適用し、ライブラリを登録するための設定を行います。
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リポジトリをクライアント側で追加すれば、他のリポジトリと同様に利用できるようになります。
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でも同様のことができます。