jcenter, bintray 廃止で自分のAndroidアプリに対応したことのメモ

[Service End for Bintray, JCenter, GoCenter, and ChartCenter \| JFrog](https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/)

の対応をする。

まずは [【追記：2022年2月1日へ延期】JCenter が2021年5月1日にシャットダウンすることになったので Android アプリエンジニア観点でメモをまとめた \- BattleProgrammerShibata](https://bps-tomoya.hateblo.jp/entry/2021/02/04/184317) でだいたいの状況を把握しよう。



影響があるかどうかの確認手順
===========================

- [八木さんのツイート](https://twitter.com/sys1yagi/status/1357509730713829378) を参考に確認方法をまとめる

- `build.gradle` の repositories で下記を削除する
    - `jcenter()`
    - `maven { url "http://dl.bintray.com...`
- `build.gradle` の repositories に `mavenCentral` が無ければ追加する
- `./gradlew --refresh-dependencies` する
- `./gradlew assemble` などでビルドする
- `./gradlew test` などでテストを実行する


AGP が jcenter に依存してる問題の対策
=====================================

- (2021/02/24追記) AGP 4.2 Beta05 で解消されたっぽい。

```
includeGroup("org.jetbrains.trove4j") を外して下記を実行

$ ./gradlew --refresh-dependencies
...
BUILD SUCCESSFUL in 27s

$ ./gradlew assemble
...
BUILD SUCCESSFUL in 41s
```

- 2021/02/15 時点で Android Studio 4.1系、4.2系で jcenter を外して Maven Central を設定すると、依存解決(gradle sync)時点で下記のようなエラーが発生する。

```
A problem occurred configuring root project 'EmojiPicker4T'.
> Could not resolve all artifacts for configuration ':classpath'.
   > Could not find org.jetbrains.trove4j:trove4j:20160824.
     Searched in the following locations:
       - https://dl.google.com/dl/android/maven2/org/jetbrains/trove4j/trove4j/20160824/trove4j-20160824.pom
       - https://repo.maven.apache.org/maven2/org/jetbrains/trove4j/trove4j/20160824/trove4j-20160824.pom
     Required by:
         project : > com.android.tools.build:gradle:4.2.0-beta04 > com.android.tools.build:builder:4.2.0-beta04 > com.android.tools:sdk-common:27.2.0-beta04

Possible solution:
 - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html
```

- [Now that Bintray and JCenter are shutting down, what should we do with the Android libraries that are hosted there? : androiddev](https://www.reddit.com/r/androiddev/comments/lbssfn/now_that_bintray_and_jcenter_are_shutting_down/glww2jk/?utm_source=reddit&utm_medium=web2x&context=3) によると AGP 7.0 では修正済み、AGP 4.2 には(場合によっては 4.1 にも)バックポート予定らしい。

- というわけで AGP 7 に依存するように変更すれば AGP 以外に問題になるものを洗い出せるんだけど、洗い出せるだけで開発は進まなくなるので、**AGP 4.2 だけは jcenter への依存を許す** ことにする(正確には `trove4j` だけ許す)

```gradle
buildscript {
    repositories {
        google()
        mavenCentral()

        // TODO AGP が依存しなくなったら削除すること
        jcenter().mavenContent {
            includeGroup("org.jetbrains.trove4j")
        }
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.2.0-beta04"
        // ...
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()

        // TODO AGP が依存しなくなったら削除すること
        jcenter().mavenContent {
            includeGroup("org.jetbrains.trove4j")
        }
    }
}
```

そしておもむろに`Sync Project with Gradle Files`する。

![2021-02-15_15h26_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39221/3f50737a-5613-9f0b-0f42-7d056578aa47.png)

さあここからが本当の闘いだ。



各ライブラリの jcenter -> mavenCentral 移行メモ
=============================================

PermissionsDispatcher
---------------------
- [PermissionsDispatcher](https://github.com/permissions-dispatcher/PermissionsDispatcher) は Maven Central に移行したっぽい。下記の修正で通った。

```diff
-  implementation "org.permissionsdispatcher:permissionsdispatcher-ktx:1.0.0-alpha2"
+  implementation "com.github.permissions-dispatcher:permissionsdispatcher-ktx:4.8.0"
```


ViewPagerIndicator
------------------
- 2012年にメンテが終了した [ViewPagerIndicator](https://github.com/JakeWharton/ViewPagerIndicator) は有志により Maven Central にホストされてた

```diff
- implementation 'com.viewpagerindicator:library:2.4.1@aar'
+ implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar'
```


ExoPlayer
---------
- (2021/4/15追記) Exoplayer 2.13.3 から Google's Maven Repository でホストされるようになった。ので、下記の記述は不要。

- 
 [ExoPlayer](https://github.com/google/ExoPlayer) は 2021/02/15 時点では [jcenter からの移行作業中らしい](https://github.com/google/ExoPlayer/issues/5246) ので特別に許可しておく


```gradle
allprojects {
    repositories {
        jcenter().mavenContent {
            // TODO ExoPlayer が mavenCentral() or google() に移行したら削除すること
            includeGroup("com.google.android.exoplayer")
        }
    }
}
```


koin
----
- DIライブラリの [koin](https://insert-koin.io/) は `3.0.1-alpha-6` から [mavenCentral](https://search.maven.org/search?q=io.insert-koin) に[移行した](https://github.com/InsertKoinIO/koin/issues/1004)ようです。`maven group id` が `org.koin` から `io.insert-koin` に変わったので注意。 (2021/3/4追記)

```diff
- implementation("org.koin:koin-android:2.1.5")
+ implementation("io.insert-koin:koin-android:3.0.1-alpha-6")
```


realm-java
----------
- [realm-java](https://github.com/realm/realm-java) は Maven Central に移行作業中とのこと (2021/03/05追記)
  - [JCenter to be dismissed \- migrate to Maven Central · Issue \#7295 · realm/realm\-java](https://github.com/realm/realm-java/issues/7295)


groupie
-------
- (2021/5/10追記) jitpack に移行しました。

```diff
-    implementation("com.xwray:groupie:${groupieVersion}")
+    implementation("com.github.lisawray.groupie:groupie:${groupieVersion}")
```


- 
[groupie](https://github.com/lisawray/groupie) は [Migration from Bintray · Issue \#384 · lisawray/groupie](https://github.com/lisawray/groupie/issues/384) の issue が立ってるけど移行するのかな？(2021/03/05追記)










代替リポジトリがないライブラリをGitHub Pagesの野良mavenリポジトリに配置する(2021/2/16追記)
=====================================================================================


[jCenterが閉鎖されるらしいので一旦Github Pagesを野良mavenリポジトリにして待避した話 \- Qiita](https://qiita.com/ryo_mm2d/items/b7a6b2f2fe47b5d34675) を参考に、代替リポジトリがないライブラリを`GitHub Pages`に配置してみる。

今回は3年ほどメンテされてない [syedowaisali/crystal\-range\-seekbar](https://github.com/syedowaisali/crystal-range-seekbar) を jcenter から自分のリポジトリに移行してみる。

## jcenter側のライブラリをダウンロードする
https://bintray.com/syedowaisali/maven/crystalrangeseekbar にアクセスするとファイルがあるのでダウンロードする。
ファイルツリーを維持するために下記のようなディレクトリ構成にする。

```bash
$ find takke.github.io -type f
takke.github.io/maven/com/crystal/crystalrangeseekbar/maven-metadata.xml
takke.github.io/maven/com/crystal/crystalrangeseekbar/1.1.3/crystalrangeseekbar-1.1.3-javadoc.jar
takke.github.io/maven/com/crystal/crystalrangeseekbar/1.1.3/crystalrangeseekbar-1.1.3-sources.jar
takke.github.io/maven/com/crystal/crystalrangeseekbar/1.1.3/crystalrangeseekbar-1.1.3.aar
takke.github.io/maven/com/crystal/crystalrangeseekbar/1.1.3/crystalrangeseekbar-1.1.3.pom
```

## GitHub Pages にコミットする
GitHub に `<username>.github.io` というリポジトリを作り、maven リポジトリをコミットする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39221/bb4d8742-5c13-61ee-f93e-c0016914fd4e.png)

```bash
$ cd takke.github.io/
$ git init
Initialized empty Git repository in D:/Src/takke.github.io/.git/

$ ls
maven/

$ git add maven
warning: LF will be replaced by CRLF in maven/com/crystal/crystalrangeseekbar/maven-metadata.xml.
The file will have its original line endings in your working directory

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   maven/com/crystal/crystalrangeseekbar/1.1.3/crystalrangeseekbar-1.1.3-javadoc.jar
        new file:   maven/com/crystal/crystalrangeseekbar/1.1.3/crystalrangeseekbar-1.1.3-sources.jar
        new file:   maven/com/crystal/crystalrangeseekbar/1.1.3/crystalrangeseekbar-1.1.3.aar
        new file:   maven/com/crystal/crystalrangeseekbar/1.1.3/crystalrangeseekbar-1.1.3.pom
        new file:   maven/com/crystal/crystalrangeseekbar/maven-metadata.xml


$ git commit -m "backup from jcenter"
[master (root-commit) 3378c40] backup from jcenter
 5 files changed, 45 insertions(+)
 create mode 100644 maven/com/crystal/crystalrangeseekbar/1.1.3/crystalrangeseekbar-1.1.3-javadoc.jar
 create mode 100644 maven/com/crystal/crystalrangeseekbar/1.1.3/crystalrangeseekbar-1.1.3-sources.jar
 create mode 100644 maven/com/crystal/crystalrangeseekbar/1.1.3/crystalrangeseekbar-1.1.3.aar
 create mode 100644 maven/com/crystal/crystalrangeseekbar/1.1.3/crystalrangeseekbar-1.1.3.pom
 create mode 100644 maven/com/crystal/crystalrangeseekbar/maven-metadata.xml

$ git remote add origin git@github.com:takke/takke.github.io.git

$ git push origin master
Enumerating objects: 12, done.
Counting objects: 100% (12/12), done.
Delta compression using up to 16 threads
Compressing objects: 100% (8/8), done.
Writing objects: 100% (12/12), 155.54 KiB | 792.00 KiB/s, done.
Total 12 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:takke/takke.github.io.git
 * [new branch]      master -> master
```

ブラウザから `https://takke.github.io/maven/com/crystal/crystalrangeseekbar/maven-metadata.xml` にアクセスして取得できたので問題なさそう。

## `build.gradle` に野良リポジトリを追加する

- まずは追加前の状態で `Sync Project with Gradle Files` してエラーになることを確認する。

```
Failed to resolve: com.crystal:crystalrangeseekbar:1.1.3
```

- `build.gradle` に下記のように追記する。

```gradle
allprojects {
    repositories {
        google()
        mavenCentral()

        // ...

        // crystalrangeseekbar は jcenter 以外に移行する可能性は低そうなので自分でホストする
        maven {
            url = uri("https://takke.github.io/maven")
            content {
                includeGroup("com.crystal")
            }
        }
    }
}
```

- 改めて `Sync Project with Gradle Files` してエラーにならないことを確認。お疲れさまでした。



リンク集
=========

- [JCenter / Bintray等が停止することで起きる影響を考える \- shuma\_yoshioka’s diary](https://blog.s64.jp/entry/jfrog_repository_sunsetting_affection)
- [【追記：2022年2月1日へ延期】JCenter が2021年5月1日にシャットダウンすることになったので Android アプリエンジニア観点でメモをまとめた \- BattleProgrammerShibata](https://bps-tomoya.hateblo.jp/entry/2021/02/04/184317)
- [jCenterが閉鎖されるらしいので一旦Github Pagesを野良mavenリポジトリにして待避した話 \- Qiita](https://qiita.com/ryo_mm2d/items/b7a6b2f2fe47b5d34675)

## ライブラリを mavenCentral に移行する際の参考
- [GitHub上でのGradle Projectの管理状況2021](https://uzzu.co/post/github-gradle-project-2021.html)
- [bintray/JCenter に上げていたJVMライブラリを楽して Maven Central へ移行する](https://zenn.dev/red_fat_daruma/articles/0f3a01a53dc4fd)
- [github/maven\-plugins: Official GitHub Maven Plugins](https://github.com/github/maven-plugins)
- PermissionsDispatcher も Maven Central に移行したのでこの辺りが参考になりそう⇒ https://github.com/permissions-dispatcher/PermissionsDispatcher/commit/d7e30604ad966cd56195db08e356c464a25daa95



更新履歴
==========

- 2021/02/15 確認手順、対策、移行メモを書いた
- 2021/02/16 「代替リポジトリがないライブラリをGitHub Pagesの野良mavenリポジトリに配置する」追記
- 2021/02/24 AGP 4.2 Beta05 で解消されたっぽい旨を追記
- 2021/03/04 koinについて追記
- 2021/03/05 Realm, groupieについて追記
- 2021/04/15 ExoPlayer について追記
- 2021/05/10 Groupie の jitpack 移行について追記
- 2021/05/12 fix typo ("takke.github.com" -> "takke.github.io")