Into the Sunset on May 1st: Bintray, JCenter, GoCenter, and ChartCenter
jCenterは閉鎖する(リードオンリーで参照のみ可能)とのことですので、Maven Centralに移行しましょう。
Maven Centralへ移行する方法はこちらを参照
jCenterで公開していたKotlinライブラリをMaven Centralで公開する
OSSライブラリ作っていますか?
JavaやAndroidの開発ではOSSライブラリはmavenリポジトリからとってくるのが常識で、jarやaarをダウンロードして使ってもらうというスタイルはほとんど見かけなくなっています。
せっかく作ったライブラリなので、広く使ってもらうためにもmavenリポジトリで公開しましょう。mavenリポジトリは出力したファイルをhttp/httpsでホスティングしてしまえばそれだけでリポジトリになるため、GithubならGithub Pagesにおいてしまうことで野良mavenリポジトリの完成です。私もこれやっています。
しかし、これでは野良リポジトリのパスをプロジェクトに追加してもらう必要があります。こんな風に。
repositories {
maven {
url 'https://ohmae.github.com/maven'
}
}
公開する側としてもちょっと抵抗もあるし、使う側としてもあんまり野良リポジトリとか使いたくないですよね。OSS一つ追加するたびにリポジトリが増えていく。ビルドも遅くなりそうです。
mavenCentralとかjcenterに置くことができればパスを直接書いてもらう必要はありません。最近のAndroidではデフォルトでこんな風にリポジトリが記述されます。
repositories {
google()
jcenter()
}
jcenterはデフォルトで記述されていますが、mavenCentralの場合はmavenCentral()
を追記してもらう必要があります。
というわけで、jcenterでライブラリを公開する方法を説明したいと思います。(簡単と言われつつも結構苦労したので・・・何番煎じだとか言わないで)
いくつかのライブラリを公開する過程でスクリーンショットをとった関係上、スクショごとに違うライブラリだったりして混乱させてしまうかもしれませんが適宜読み替えてください。
BintrayにSign Up
https://bintray.com/ にアクセスします。
OSSプロジェクト用のアカウントはすんなり作ることができます。
OSSプランの場合、10GBストレージ、1TB/mダウンロードまでという条件だそうですが、jar/aarを配布するmavenリポジトリとして利用するなら、この条件に引っかかるようなプロジェクトはめったにないでしょう。
For an Open Source Accountの「Sign Up Here」をクリック
こんな感じの画面が出てくるので、必要事項を入力。OSSのプロジェクトならGithubアカウントを持っているでしょうから、Githubアカウントでサインアップしちゃった方がいいでしょう。アカウントの紐付けが気になる方はよしなに。
私はGithubでSign upすることにしました。
こうなるので、bintary-botに許可を与えます。アカウントデータのメールアドレスに対するリードオンリーアクセスなのでそれほど気にすることでは無いかと。
氏名、アカウント名、メールアドレスがGithubの情報で入力されます。メールアドレス以外は変更できるみたいです。アカウント名は私の場合Githubのがそのまま使えましたが、使えない場合もあるでしょう。多分。その場合どうなるかはわかりません。
アカウント作成ができるとこうなります。
アカウントを作った直後はパスワードが設定されていないので、Edit Your Profileからパスワードを設定しておいた方がいいでしょう。
Bintrayにmavenリポジトリを作成
Add New Repositoryをクリックします。
プライベートリポジトリは有料みたいですね。OSSならプライベートにする必要性もないですしPublicのままにします。
Name
リポジトリ名ですが、URLに使われて「https://bintray.com/<アカウント名>/<リポジトリ名>/<パッケージ名>」といった形になります。目的ごとに複数のリポジトリを作りたい場合は、それに応じた名前をつければいいと思いますが、mavenリポジトリならmavenにしている人が多いようです。
Type
プルダウンメニューがでるのでMavenを選択します。
Default Licenses
オプションなので入れなくてもいいですが、使うライセンスが決まっているなら入力しておきましょう。私はMITを選択しました。
Description
このリポジトリの説明ですね。いい説明が思いつかなかったので空欄のままにしました。
Createをクリックします。
これでリポジトリが作成されました。
パッケージを作る
リポジトリの画面からAdd New Packageをクリックしてパッケージを作ります。公開するライブラリ一つ一つに対応させて作ります。
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をクリックします。
パッケージが作成されました。
手動でアップロードする
後述するgradleを使って自動でアップロードするのがよいのですが、すでにビルド済みのjarなどを手動でアップロードすることもできます。
バージョンを作成
VersionsにあるNew Viewsionをクリックします。
Name
0.0.1などのバージョン名を入れます。バージョン名についてのルールは見つけられていませんが、公開する以上は セマンティックバージョニングにしたがって意味のあるバージョン名をつけるようにしましょう。
Release date
リリース日を設定します。デフォルトで今日の日付が入っていますが、必須ではないようです。
Description
このバージョンの説明、必須ではないです。
Create Versionをクリックすることで空のバージョンを作成することができます。
ファイルのアップロード
バージョンを作成したら画面上部からUpload Filesを選択します。
すると以下のような画面になります
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をクリックするとアップロードすることができます。
アップロードが完了すると、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」です。
以下のように書いておきます。変数名はこれと同じである必要はありませんが、他とかぶらない名前にしましょう。
bintray_user=xxxxxx
bintray_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
build.gradleの修正
※このbuild.gradleは新版では正常に動作しなくなりました。jCenter (bintray) にアップロードするbuild.gradleで書き直しました
公式プラグインのgradle-bintray-plugin
を使用します。
ルートプロジェクトのdependeniesに以下を追加。
Androidライブラリの場合はandroid-maven-gradle-pluginも追加します。
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つのプラグインを適用
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に以下のように書いて利用するものです。
implementation 'net.mm2d:preference:0.0.2'
この場合、groupIdが「net.mm2d」、artifactIdが「preference」、versionが「0.0.2」、アップロード先パッケージが「net.mm2d.preference」となります。またライブラリのモジュール名が「lib」でartifactIdと異なるため、archivesBaseNameを設定する必要があります。
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'
この定義値を使って以下のようにタスクを定義するとアップロードできるようになります。
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タスクを実行することでアップロードができます。
アップロードしたのち、BintrayのサイトからPublishを実行します。
これで、Bintrayの個人リポジトリから公開されます。(jcenterでの公開はまだです)
この時点で利用するには以下のようなリポジトリurlを指定する必要があります。
repositories {
maven {
url 'https://dl.bintray.com/<アカウント名>/<リポジトリ名>'
}
}
jCenterで公開する
パッケージページのLinked toから「Add to jCenter」をクリックします。
jCenter経由で公開してもらうようにリクエストを投げます。Group IDがユニークである必要があるとのこと。パッケージ名を決める段階でドメインベースのユニークなモノを選択しているでしょうから、パッケージ名を入力すれば問題ないでしょう。
送信して数日で承認の返信が来ます。私の場合は半日ぐらいでしたが、中の人が人力で対応していると思うので、申請の混雑具合とかに影響されるかもしれません。気長に待ちましょう。
Linked to のところにjcetenrが追加されています。
これでjcenterで公開され、野良リポジトリをgradleに追加しなくてもdependenciesに追加するだけで利用でききるようになりました。
作業したライブラリとかはこの辺です。ご参考まで。
- https://github.com/ohmae/preference-activity-compat
- https://github.com/ohmae/Log
- https://github.com/ohmae/mmupnp
以上です。