jCenterでライブラリを公開する方法

**[Into the Sunset on May 1st: Bintray, JCenter, GoCenter, and ChartCenter](https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/)**
jCenterは閉鎖する（リードオンリーで参照のみ可能）とのことですので、Maven Centralに移行しましょう。

Maven Centralへ移行する方法はこちらを参照
[jCenterで公開していたKotlinライブラリをMaven Centralで公開する](https://qiita.com/ryo_mm2d/items/40df6e292c691366038e)

----

OSSライブラリ作っていますか？

JavaやAndroidの開発ではOSSライブラリはmavenリポジトリからとってくるのが常識で、jarやaarをダウンロードして使ってもらうというスタイルはほとんど見かけなくなっています。

せっかく作ったライブラリなので、広く使ってもらうためにもmavenリポジトリで公開しましょう。mavenリポジトリは出力したファイルをhttp/httpsでホスティングしてしまえばそれだけでリポジトリになるため、GithubならGithub Pagesにおいてしまうことで野良mavenリポジトリの完成です。私もこれやっています。
しかし、これでは野良リポジトリのパスをプロジェクトに追加してもらう必要があります。こんな風に。

```gradle
repositories {
    maven {
        url 'https://ohmae.github.com/maven'
    }
}
```

公開する側としてもちょっと抵抗もあるし、使う側としてもあんまり野良リポジトリとか使いたくないですよね。OSS一つ追加するたびにリポジトリが増えていく。ビルドも遅くなりそうです。
mavenCentralとかjcenterに置くことができればパスを直接書いてもらう必要はありません。最近のAndroidではデフォルトでこんな風にリポジトリが記述されます。

```gradle
repositories {
    google()
    jcenter()
}
```
jcenterはデフォルトで記述されていますが、mavenCentralの場合は`mavenCentral()`を追記してもらう必要があります。

というわけで、jcenterでライブラリを公開する方法を説明したいと思います。（簡単と言われつつも結構苦労したので・・・何番煎じだとか言わないで）

いくつかのライブラリを公開する過程でスクリーンショットをとった関係上、スクショごとに違うライブラリだったりして混乱させてしまうかもしれませんが適宜読み替えてください。

# BintrayにSign Up

https://bintray.com/ にアクセスします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/d94716f5-238b-ce59-ca49-82f6951b0cd3.png)

OSSプロジェクト用のアカウントはすんなり作ることができます。
OSSプランの場合、10GBストレージ、1TB/mダウンロードまでという条件だそうですが、jar/aarを配布するmavenリポジトリとして利用するなら、この条件に引っかかるようなプロジェクトはめったにないでしょう。

For an Open Source Accountの「Sign Up Here」をクリック

こんな感じの画面が出てくるので、必要事項を入力。OSSのプロジェクトならGithubアカウントを持っているでしょうから、Githubアカウントでサインアップしちゃった方がいいでしょう。アカウントの紐付けが気になる方はよしなに。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/b178214a-c971-218f-2ff7-849be23fce3f.png)

私はGithubでSign upすることにしました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/e4e11dc2-8e77-5da3-d36d-6a60615649a3.png)

こうなるので、bintary-botに許可を与えます。アカウントデータのメールアドレスに対するリードオンリーアクセスなのでそれほど気にすることでは無いかと。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/29afd41a-f834-d4bd-9a2e-3fc4fa8c6e3b.png)

氏名、アカウント名、メールアドレスがGithubの情報で入力されます。メールアドレス以外は変更できるみたいです。アカウント名は私の場合Githubのがそのまま使えましたが、使えない場合もあるでしょう。多分。その場合どうなるかはわかりません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/ebeb7c74-262a-b334-bdf2-5c529025b376.png)

アカウント作成ができるとこうなります。

アカウントを作った直後はパスワードが設定されていないので、Edit Your Profileからパスワードを設定しておいた方がいいでしょう。

# Bintrayにmavenリポジトリを作成

Add New Repositoryをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/f2dc0ace-2263-fe09-1287-57a2d72ef285.png)

プライベートリポジトリは有料みたいですね。OSSならプライベートにする必要性もないですしPublicのままにします。


**Name**
リポジトリ名ですが、URLに使われて「https://bintray.com/<アカウント名>/<リポジトリ名>/<パッケージ名>」といった形になります。目的ごとに複数のリポジトリを作りたい場合は、それに応じた名前をつければいいと思いますが、mavenリポジトリならmavenにしている人が多いようです。
**Type**
プルダウンメニューがでるのでMavenを選択します。
**Default Licenses**
オプションなので入れなくてもいいですが、使うライセンスが決まっているなら入力しておきましょう。私はMITを選択しました。
**Description**
このリポジトリの説明ですね。いい説明が思いつかなかったので空欄のままにしました。

Createをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/f609a343-6405-1b30-f576-91a3a3c02bc8.png)

これでリポジトリが作成されました。

# パッケージを作る

リポジトリの画面からAdd New Packageをクリックしてパッケージを作ります。公開するライブラリ一つ一つに対応させて作ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/bc90165f-f1a4-5aea-d0b8-5b1c90dbd38b.png)

**Name**
Javaのパッケージ名ではありません。Javaのパッケージ名でもいいですが、このライブラリを端的に表す名前をつけましょう。私は、groupId+artifactIdを設定することにしました。artifactIdだけでも問題ないでしょうけど、妙にシンプル名前をつけてしまっているので。
**Description**
公開するライブラリの説明入れます
**License**
こちらは必須ですので使うライセンスを入れましょう。ライセンスがまだ決まっていない場合は公開できません。決めてから出直しましょう。
**Tags**
検索などで利用されるタグなので「Android」とかのカテゴリ情報を入れましょう。複数設定することができます。
**Maturity**
「Official」「Stable」「Development」「Experimental」から選択します。適切なモノを入れましょう。
**Website**
必須ではないですが、Githubでソースコードを公開しているならそこのURLでよいでしょう
**Issue tracker**
こちらも必須ではないですが、同様にGithubのIssueのURLでよいでしょう。
**Version Control**
必須です。GithubのURLを入れましょう。

最後のチェックボックスはダウンロード数とかを公開するかどうかですが、どっちでもいいです。

Create Packageをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/0c2dd9e9-0bfd-d118-07f2-8160047c8087.png)

パッケージが作成されました。

# 手動でアップロードする

後述するgradleを使って自動でアップロードするのがよいのですが、すでにビルド済みのjarなどを手動でアップロードすることもできます。

## バージョンを作成
VersionsにあるNew Viewsionをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/ad24bff6-ea2d-cbad-e5b2-83c524fb96f8.png)

**Name**
0.0.1などのバージョン名を入れます。バージョン名についてのルールは見つけられていませんが、公開する以上は[ セマンティックバージョニング](https://semver.org/lang/ja/)にしたがって意味のあるバージョン名をつけるようにしましょう。
**Release date**
リリース日を設定します。デフォルトで今日の日付が入っていますが、必須ではないようです。
**Description**
このバージョンの説明、必須ではないです。

Create Versionをクリックすることで空のバージョンを作成することができます。

## ファイルのアップロード

バージョンを作成したら画面上部からUpload Filesを選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/7ae4383d-ccea-742d-3f4e-ff7734de8861.png)

すると以下のような画面になります

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/5a254008-fe14-1937-b3dd-8481ca5921f8.png)

**Target Repository Path**
ファイルをアップロードするパスを指定します。

例えば、このスクリーンショットの「net.mm2d.log」はgroupIdが`net.mm2d`で、artifactIdが`log`なライブラリで、バージョンが`0.0.2`なので、pomファイルをアップロードする先は「net/mm2d/log/0.0.2」を指定します。

画面右下のClick to Add Filesのところへアップロードするpom/jar/aarファイルをドラッグドロップしてSave Changesをクリックするとアップロードすることができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/a18d6d4e-0e2a-5f4b-407f-7de2ae4207c8.png)

アップロードが完了すると、Filesタブでアップロードされたファイルを確認することができます。
一階層上には`maven-metadata.xml`が自動で作成されます。

なお、アップロードしただけでは公開されません。Publishをクリックする必要があります。おかしなパスにアップロードしてしまった！などの場合はPublishする前に削除すれば影響ありません。
ただ、後述のGradleからのアップロードであっても、Publishを自動化することはできなさそうでした、毎回アップロードしたのち、bintrayにログインしてpublishする必要がある。ちょっと面倒・・・

# Gradleからアップロードできるようにする

Gradleプラグインが用意されていて、build.gradleに設定を書くだけで簡単にアップロードすることができます。
通常の開発ではこの方法を使いましょう。CIを使っている場合は、CIのビルド成果物をそのままアップロードすることもできますし。

## GPG Keyを作成・・・しない

GPG Keyをアップロードすることでライブラリに署名することができるらしいのですが、公開鍵と秘密鍵両方をアップロードする必要がある・・・いやそれって・・・と疑問が払拭できなかったのでやらないことにしました。
自分で用意しないでBintrayの鍵で署名してもらうこともできるらしいのでそちらを選ぶのもありでしょう。

## API Keyを取得する

Edit Profile→API KeyでAPI Keyを取得できます。この鍵は公開してはいけません。漏れないようにしましょう。

## ローカルファイルにAPI Keyを保存する

Gradleからアップロードするので、GradleにAPI Keyを読み込ませる必要がありますが、公開リポジトリ内のファイルに書いてしまうと誰でもアップロードできるようになってしまいます。誤ってコミットしてしまわないような場所に書いておきましょう。
（もし万が一、間違って公開してしまった等の場合はrevokeしてそのkeyを無効化することが可能ですので慌てずに）

「<ユーザーディレクトリ>/.gradle/gradle.properties」であればリポジトリの外部であり、操作を誤って漏洩させてしまう危険性は低く、デフォルトで読み込まれるので面倒がないことから、ここに書く人が多いようです。ファイルが無ければ作成します。Windowsであれば「C:\\Users\\<ユーザー名>\\.gradle\\gradle.properties」です。
以下のように書いておきます。変数名はこれと同じである必要はありませんが、他とかぶらない名前にしましょう。

```gradle
bintray_user=xxxxxx
bintray_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

## build.gradleの修正

**※このbuild.gradleは新版では正常に動作しなくなりました。[jCenter (bintray) にアップロードするbuild.gradle](https://qiita.com/ryo_mm2d/items/5ffc52c4554ebeef45de)で書き直しました**

公式プラグインの`gradle-bintray-plugin`を使用します。
ルートプロジェクトのdependeniesに以下を追加。
Androidライブラリの場合はandroid-maven-gradle-pluginも追加します。

```gradle
buildscript {
...
    dependencies {
...
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
    }
}
```

モジュールのbuild.gradleにてプラグインを適用します。Javaの場合はcom.jfrog.bintrayのみ、Androidの場合は2つのプラグインを適用

```gradle
apply plugin: 'com.jfrog.bintray'
apply plugin: 'com.github.dcendents.android-maven'
```

アップロードするための情報を設定しますが、似たような情報を繰り返し設定することになるので先に基本情報を定義しておきます。モジュール名とartifactIdを異なる名前にしている場合は、archivesBaseNameにartifactIdを設定しておかないとjarの名前がモジュール名になってしまったりするようです。

https://github.com/ohmae/preference-activity-compat のaarをアップロードする設定を示します。
利用する場合はdependenciesに以下のように書いて利用するものです。

```gradle
implementation 'net.mm2d:preference:0.0.2'
```

この場合、groupIdが「net.mm2d」、artifactIdが「preference」、versionが「0.0.2」、アップロード先パッケージが「net.mm2d.preference」となります。またライブラリのモジュール名が「lib」でartifactIdと異なるため、archivesBaseNameを設定する必要があります。

```gradle
def versionMajor = 0
def versionMinor = 0
def versionPatch = 2

group 'net.mm2d'
archivesBaseName = 'preference'
version "${versionMajor}.${versionMinor}.${versionPatch}"

def libraryId = 'log-android'
def siteUrl = 'https://github.com/ohmae/preference-activity-compat'
def githubUrl = 'https://github.com/ohmae/preference-activity-compat'
```

この定義値を使って以下のようにタスクを定義するとアップロードできるようになります。

```gradle
bintray {
    user = project.hasProperty('bintray_user') ? bintray_user : ''
    key = project.hasProperty('bintray_key') ? bintray_key : ''
    configurations = ['archives']

    pkg {
        repo = 'maven'
        name = project.group + '.' + libraryId
        licenses = ['MIT']
        websiteUrl = siteUrl
        issueTrackerUrl = githubUrl + '/blob/master/LICENSE'
        vcsUrl = githubUrl + '.git'
        issueTrackerUrl = githubUrl + '/issues'
        publicDownloadNumbers = true
        version {
            name = project.version
        }
    }
}

install {
    repositories.mavenInstaller {
        pom.project {
            name libraryId
            url siteUrl

            packaging 'aar'
            groupId project.group
            artifactId libraryId
            version project.version

            licenses {
                license {
                    name 'The MIT License'
                    url 'https://opensource.org/licenses/MIT'
                    distribution 'repo'
                }
            }
            scm {
                connection githubUrl + '.git'
                url githubUrl
            }
        }
    }
}
```

これで、bintrayUploadタスクを実行することでアップロードができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/cec018d0-761d-c378-b901-8d026df19424.png)

アップロードしたのち、BintrayのサイトからPublishを実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/e4495b5e-2a30-a96d-5b63-70a63acc366b.png)

これで、Bintrayの個人リポジトリから公開されます。（jcenterでの公開はまだです）
この時点で利用するには以下のようなリポジトリurlを指定する必要があります。

```gradle
repositories {
    maven {
        url 'https://dl.bintray.com/<アカウント名>/<リポジトリ名>'
    }
}
```

# jCenterで公開する

パッケージページのLinked toから「Add to jCenter」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/8375d59b-ce93-16a1-2403-e7a9ea7ee232.png)

jCenter経由で公開してもらうようにリクエストを投げます。Group IDがユニークである必要があるとのこと。パッケージ名を決める段階でドメインベースのユニークなモノを選択しているでしょうから、パッケージ名を入力すれば問題ないでしょう。

送信して数日で承認の返信が来ます。私の場合は半日ぐらいでしたが、中の人が人力で対応していると思うので、申請の混雑具合とかに影響されるかもしれません。気長に待ちましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/ba2742d6-05f5-85dd-09e0-d14a4dbf3fc0.png)

Linked to のところにjcetenrが追加されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155171/97dd8343-3566-0720-8ce1-cf08b22dce74.png)

これでjcenterで公開され、野良リポジトリをgradleに追加しなくてもdependenciesに追加するだけで利用でききるようになりました。

作業したライブラリとかはこの辺です。ご参考まで。

- https://github.com/ohmae/preference-activity-compat
    - https://bintray.com/ohmae/maven/net.mm2d.preference
- https://github.com/ohmae/Log
    - https://bintray.com/ohmae/maven/net.mm2d.log
    - https://bintray.com/ohmae/maven/net.mm2d.log-android
- https://github.com/ohmae/mmupnp
    - https://bintray.com/ohmae/maven/net.mm2d.mmupnp

以上です。