Java のライブラリを JCenter で公開する手順まとめ

はじめに

Android Studio から Android プロジェクトのビルドも Gradle で実行されるようになりました。
Gradle では Maven リポジトリで配信されているライブラリが非常に簡単に使えるので、自作のライブラリを JCenter や Maven Central で公開する効果はこれまで以上に高くなっていると思います。

そこで最近、Github で公開している Java のライブラリを JCenter で公開してみたので、その手順をまとめました。

下記の2ページ参考にしています。
GradleでBintrayにアップロードする手順
How to distribute your own Android library through jCenter and Maven Central from Android Studio

前提

  • Gradle でビルドできる Java プロジェクトであること。

やりたいこと

  • Gradle でライブラリのアップロードをすること
  • アップロードしたライブラリには署名がされていること
  • 上記が可能な build.gradle を Github にそのまま置けること
    • 自分だけが Bintray へのアップロードをできること
    • 自分以外もビルドはできること

Bintray のアカウントを作る

https://bintray.com/
JCenter で公開するためには Bintray の Maven レポジトリにライブラリアップロードする必要があります。

Maven レポジトリを作る

ライブラリをアップロードするめの Maven リポジトリを作成します。

New Repositoryを選択。


Repository Typeは Maven を選択。

署名鍵を用意する

署名用の鍵ペアを作成。パスワード付きで作りましょう。
Windows の場合は Cygwin や MinGW などで作ればいいと思います。
$ gpg --gen-key
作成した鍵を表示。
$ gpg --list-keys
/<USER>/.gnupg/pubring.gpg
---------------------------------
pub   2048R/XXXXXXXX 2015-08-13
uid                  Your Name <your.email@email.com>
sub   2048R/YYYYYYYY 2015-08-13
公開鍵サーバに公開鍵を送信。最後の PUBLIC_KEY_ID の部分は、鍵一覧表示で XXXXXXXX としてある8桁の英数字です。
$ gpg --keyserver hkp://pool.sks-keyservers.net --send-keys PUBLIC_KEY_ID
鍵を文字列形式に変換
$ gpg -a --export your.email@email.com > public_key_sender.asc
$ gpg -a --export-secret-key your.email@email.com > private_key_sender.asc
これで、ユーザディレクトリ以下に公開鍵と秘密鍵が置かれました。

Bintrayに署名鍵を登録

続いて Bintray に署名鍵を登録します。

プロファイル編集ページに「GPG Signing」の項目があるので、「Public Key」の欄に先ほど作成した  public_key_sender.asc の中身を、「Private Key」の欄に private_key_sender.asc の中身をそれぞれコピペします。

秘密鍵を公開鍵と同じサーバに置くのは正直意味不明ですが、公式の gradle-bintray-plugin で自動署名をするためには必要みたいなのでパスワード付き署名を使うことにしました。

Bintray がクラックされて秘密鍵が漏れたら面倒なので、この鍵ペアは別の用途には絶対に使わないようにしてください

秘密の情報を設定

公開しない秘密の情報を、Gradle ホームディレクトリの gradle.properties に記載します。
build.gradle からはこのファイルの情報を変数として参照させます。

<User>/.gradle/gradle.properties を編集します。(なければ作成してください)
bintray_user=yourbintrayusername
bintray_apikey=yourbintrayapikey
bintray_gpg_password=yourgpgpassword
API Key は Bintray のプロファイル編集ページにあります。
最後のGPGパスワードは、先ほど鍵作成時に設定したパスワードです。

ちなみにですが、プロパティ名の区切りに "." を使うのはやめたほうがよいです。
build.gradle 内で参照するときに名前衝突して面倒なことになる場合があります。

プロジェクト内の local.properties に記載するという手もありますが、事故って git にコミットされると嫌なので絶対にコミットされない Gradle ホームディレクトリの設定ファイルを使用しています。

gradle-bintray-plugin の導入

簡単にアップロードできる公式プラグインがあるので使いましょう。
https://github.com/bintray/gradle-bintray-plugin

bintray プラグインを使うには、build.gradle の先頭に下記の記述が必要です。
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.3.1'
    }
}
apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.bintray'
残りの build.gradle は下記の通り。
grouparchivesBaseName はユーザがライブラリを参照するときに実際に記述する名前です。しっかりと考えましょう。
// Your library will be referred as your_maven_group_name:library_name:version
archivesBaseName = 'library_name'
group = 'your_maven_group_name'
version = '1.0.0' // library version

def utf8 = 'UTF-8'
[compileJava, compileTestJava]*.options*.encoding = utf8

task sourcesJar(type: Jar, dependsOn:classes) {
    classifier = 'sources'
    from sourceSets.main.allSource
}

task javadocJar(type: Jar, dependsOn:javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

javadoc {
    options.locale = 'en_US'
}

artifacts {
    archives jar
    archives sourcesJar
    archives javadocJar
}

publishing {
    publications {
        mavenPublication(MavenPublication) {
            from components.java
        }
    }
}

bintray {
    user = project.hasProperty('bintray_user') ? bintray_user : ''
    key = project.hasProperty('bintray_apikey') ? bintray_apikey : ''

    pkg {
        repo = 'maven'
        name = 'your_repository_name'
        licenses = ['MIT']
        websiteUrl = 'https://github.com/your_github_name/your_library'
        issueTrackerUrl = 'https://github.com/your_github_name/your_library/issues'
        vcsUrl = 'https://github.com/your_github_name/your_library.git'
        version {
            name = project.version
            released = new Date()
            gpg {
                sign = true
                passphrase = project.hasProperty('bintray_gpg_password') ? bintray_gpg_password : ''
            }
        }
    }
    publications = ['mavenPublication']
    configurations = ['archives']
}
bintray クロージャ内で、先ほど設定したローカルの gradle.properties の値を読み出しています。
値が無ければ空文字列にフォールバックしますが、このプロパティは bintrayUpload タスクでのみ使われるので、通常のビルドをするだけであれば(Bintrayにアップロードする時以外は)正しい値が入っている必要はありません。

アップロード

bintrayUpload タスクが追加されています。
事前に build タスク等で jar を作成する必要があります。
$ ./gradlew build
$ ./gradlew bintrayUpload
これで Bintray に非公開状態でアップロードされました。

Bintray で公開

Bintray のレポジトリをブラウザで開いてアップロードしたファイルに問題がないか確認し、問題なければ「Publish」を選択しましょう。即座に公開されます。

JCenter に同期

レポジトリの General タブ内に「Add to JCenter」があるので選択しましょう。
次の画面でも特に何も変更せずに「Send」すればOKです。

申請に問題がなければ半日くらいで JCenter に登録されます。

最後に

公開したのはこのライブラリです。
https://github.com/kazyx/wirespider
https://bintray.com/kazyx/maven/net.kazyx%3Awirespider
 
マルチプロジェクト構成になっていますが、基本的にはこの記事で紹介したビルドスクリプトと同じです。(マルチプロジェクト構成の時には各モジュールを別々に bintrayUpload しないと最後のモジュール以外署名がされない不具合があるっぽい?)

Maven Central にも同期しようと思ったのですが、追加でいろいろ必要だったので面倒でやめました。 アカウントだけは作ったのですが。

コメント

このブログの人気の投稿

C#でJSON配列のパースに苦労した話

Android の SharedPreferences データはオンメモリで保持されている

C#で子クラスのTypeから継承元インタフェースのジェネリック引数を得る方法