JCenter 是否永久关闭(10 月 31 日)?

新手上路,请多包涵

版主注:这好像是服务中断了。 Stack Overflow 无法为此问题提供支持

   > Failed to list versions for com.google.http-client:google-http-client-android.
         > Unable to load Maven meta-data from https://jcenter.bintray.com/com/google/http-client/google-http-client-android/maven-metadata.xml.
            > Could not HEAD 'https://jcenter.bintray.com/com/google/http-client/google-http-client-android/maven-metadata.xml'.
               > Read timed out

我试图构建一个 Android 应用程序,但出现了上述错误。当我连接到“https://jcenter.bintray.com/com/google/http-client/google-http-client-android/maven-metadata.xml”时,出现 nginx 403 错误。 JCenter 关闭了吗?我应该怎么办?

原文由 Queen Ellery 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 549
2 个回答

更新:2022 年 11 月 8 日

还有一件事。 在这里关注事件


tldr;

是的。 jcenter 正在关闭。但是有一种方法可以解决这个问题。 jcenter 已落下,并以只读模式保持可用。到目前为止,还没有关于何时再次可用的更新。根据您的情况,您可以选择快速或 不那么快速的 选项。


我在哪里可以查看状态?

更新:这里报告了新事件。 检查一下

正如@Adrian 在评论中提到的,您可以在 Gradle 的事件状态页面 上检查当前事件的状态。更新:状态显示“已解决”,但我仍然无法完成该项目。所以我想知道该状态页面是否只显示 jcenter 对 Gradle 插件门户的影响,而不是 jcenter 的一般状态。

到目前为止,我再也找不到报告 bintray 状态的地方了。如果你找到一个,请在下面评论。


我现在能做什么?

推荐更新:

现在通过更新 gradlePluginPortal 以充当 jcenter 镜像(几乎)解决了该事件,很可能在 jcenter() 之前添加以下存储库应该可以解决该问题:

 google()
mavenCentral()
gradlePluginPortal()

临时解决方案:

切换 gradle 的离线模式,如下所示。这适用于本地机器,但不适用于 CI。

切换离线模式选项

强大的解决方案:

远离已弃用的服务始终是个好主意。 大多数 活跃的库现在都托管在其他流行的存储库上,例如 google repo、Maven Central 或 gradle plugin repo。

要在您的项目中添加这些存储库,请在存储库块中添加以下内容(您可能已经有了)。订单很重要。确保将它们放在 jcenter() 之前,这告诉 gradle 在尝试从 jcenter() 拉出之前查看其他回购协议。

提示:全局搜索 jcenter() 并确保包含 jcenter() 的每个存储库块都有这些其他存储库。

  repositories {
    ...
    google()
    mavenCentral()
    gradlePluginPortal()
    jcenter()
    ...
 }

执行 gradle sync 和 clean build,看看是否可行。


那没用?

别担心(还)。这很常见。上述解决方案在某些情况下无法单独使用:

  1. 当从 jcenter() 移动到其他 repo(如 mavenCentral() )时,作者决定更新版本号。这仅仅意味着您需要更新该依赖项的版本以从其他存储库中获取它。查找在失败的构建日志中显示为不可用的库。找到它的github或者开发文档查看最新版本。 Gradle Sync + 干净的构建。

  2. 我们刚刚添加的存储库是流行的,但不是唯一的。当图书馆的作者不得不从 jcenter 切换到其他地方时,他们没有选择其中之一。在这种情况下,请查看 github 页面或开发人员文档。通常作者将所需的存储库放在这些页面上。如果您发现项目中不存在存储库,请添加它。 Gradle Sync + 干净的构建。

    • 当心:一些作者选择存储库选项,如 jitpack.io 主要是因为它比其他选项更快更容易。但是您应该意识到对此的担忧。来自 gradle 的 Melix 总结了对 jitpack.io 的关注。由于潜在的安全问题,我建议在添加之前咨询团队和安全专家。
  3. 好吧,现在是时候不用担心了。您很可能正在使用一些已弃用或不再维护的库。找到库的 github 页面,看看作者是否在自述文件中声明它已弃用或不再维护。您甚至可以检查它最后一次提交的时间。如果是前一段时间,这意味着它不再维护,作者不关心将库从 jcenter() 移动到任何其他 repo。

    • 转到回购协议的 GitHub 问题。一定有人发布了关于计划从 jcenter 移动的问题。如果幸运的话,有人甚至可能已经创建了分叉并将该分叉托管在其他地方。例如,我在其中一个项目中使用 spanny 并且作者没有移动它。 GustavoRoss 非常关心 分叉和移动。
    • 没有人分叉和移动?那么你有两个选择。
      1. 寻找一个可以为您执行相同操作的备用活动库。当然这很耗时,但又是一个远离弃用资源的好主意。
      2. 如果您没有时间集成新库或没有其他库存在,那么请成为英雄并创建 GitHub 项目的分支并移动。
  4. 但是,嘿,我不记得我的代码库中有问题库?这意味着,它是一个传递依赖(直接依赖的依赖)。再次检查,你的直接依赖的最新版本,希望新版本已经解决了这个问题。

如何检查直接依赖和传递依赖?

  • 您失败的构建日志中有答案。

构建日志注释截图

希望到此为止,您的构建工作正常了。如果没有,那么希望 jcenter 很快回来并开始计划远离它。

原文由 HBB20 发布,翻译遵循 CC BY-SA 4.0 许可协议

终于在几个小时的刘海之后,问题解决了。在 android/build.gradle 中,在 allprojects -> repositories 的顶部添加以下内容。

它将在配置阶段从所有依赖项中删除 jcenter() 并将其替换为 mavenCentral()

它应该看起来像这样:

     allprojects {
      repositories {
          all { ArtifactRepository repo ->
              println repo.url.toString()
              if (repo.url.toString().startsWith("https://jcenter.bintray.com/")) {
                  project.logger.warn "Repository ${repo.url} removed."
                  remove repo
                  mavenCentral()
              }
          }
          gradlePluginPortal() // add this if you get further errors
          ...other repos
      }
    }

希望能帮助到你 :)

原文由 Faizal Shap 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题