JCenter永久关闭了吗(10月31日)?

回答 5 浏览 2.7万 2022-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

我正试图建立一个安卓应用程序,但我得到了上述错误。当我连接到 "https://jcenter.bintray.com/com/google/http-client/google-http-client-android/maven-metadata.xml "时,出现了nginx 403错误。是JCenter宕机了吗?我应该怎么做?

Queen Ellery 提问于2022-10-31
jcentre已经停机。有许多网站你可以检查状态。其中一个是statusgator.com/services/bintray。你所能做的就是等待它再次启动和运行。androidStud 2022-10-31
尽管jcenter的废弃更新在2021年2月到来,但今天Gradle中出现了一个临时事件报告。正因为如此,用户发生了这个问题。我在这里附上了事件的链接和jcenter废弃的链接。点击 JCenter关闭对Gradle构建的影响 点击 JCenter问题,Gradle的事件报告Sugana Ganesha Vel 2022-10-31
投票重开。这个标题可能有误导性;JCenter已经停机,但预计这将是永久。正因为如此,用户仍然需要变通的方法,对最佳解决方案的健康讨论对社区来说是很有价值的。也许可以把这个问题改名为:"JCentre可能会永久关闭。我们有什么选择?"或类似的问题,这样就可以清楚地知道这不仅仅是一个暂时的停机。dKen 2022-10-31
如果你需要在整理JCenter的同时快速构建,你可以随时在Gradle离线模式下构建。gradle --offline buildRoy Hinkley 2022-10-31
5 个回答
#1楼 已采纳
得票数 56

更新时间:2022年11月8日

又发生了一起事件。在此关注该事件


tldr;

是的。jcenter现在已经停机了。但有一个办法可以解决这个问题。jcenter在不久前被淘汰了,仍然以只读模式提供。到目前为止,还没有关于它何时能再次使用的更新。根据你的情况,有快速或不那么快速的选择给你。


我在哪里可以查到状态?

更新:这里报告了新的事件。看看这个

正如@Adrian在评论中提到的,你可以在Gradle的事件状态页面上查看当前事件的状态。更新:状态显示为"已解决",但我还是不能做这个项目。所以我想知道该状态页是否只显示了jcenter对Gradle Plugin Portal的影响,而不是jcenter的一般状态。

到目前为止,我没有找到任何地方可以报告bintray的状态了。如果你找到了,请在下面评论。


我现在能做什么呢?

建议的更新:

现在,通过更新gradlePluginPortal作为jcenter镜像,事件已经解决了(几乎是),在jcenter()之前添加以下软件库应该可以解决这个问题。

google()
mavenCentral()
gradlePluginPortal() 

暂时性的解决方案:

如下图所示,切换gradle的离线模式。这在本地机器上是可行的,但在CI上是不可行的。

Toggle offline mode option

稳健的解决方案:

摆脱废弃的服务总是一个好主意。大多数活跃的库现在都托管在其他流行的仓库,如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())时,作者决定更新版本号。这只是意味着你需要更新该依赖的版本,以便从其他 repo 中获取它。寻找在失败的构建日志中显示为不可用的库。找到它的github或开发文档来检查最新版本。Gradle Sync + clean build。

  2. 我们刚刚添加的库是流行的,但不是唯一的。当库的作者不得不从jcenter切换到其他地方时,他们并没有选择其中的一个。在这种情况下,请查看github页面或开发者文档。通常作者会把所需的软件库放在这些页面上。如果你发现你的项目中没有这个仓库,请添加它。Gradle Sync + Clean build。

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

    • 转到GitHub上的Repo问题。一定有人发布了关于从jcenter迁移的计划的问题。如果你运气好的话,可能有人甚至已经创建了分叉,并将该分叉托管在其他地方。例如,我在一个项目中使用了spanny,而作者并没有移动它。GustavoRoss非常关心分叉和移动。
    • 没有人分叉和移动? 那么你有两个选择。
      1. 寻找一个替代的活动库,为你做同样的事情。当然,这很费时间,但这也是一个远离废弃资源的好主意。
      2. 如果你没有时间整合新的库,或者没有其他库存在,那就做个英雄,把GitHub项目做成分叉,然后转移。
  4. 但是,我不记得在我的代码库中放了相关的库?这意味着,它是一个过渡性的依赖(你的直接依赖的依赖)。再次检查,你的直接依赖的最新版本,希望新版本已经解决了这个问题。

如何检查直接依存关系和转折依存关系?

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

Build log annotated screenshot

希望在这一点上,你的构建工作已经完成。如果没有,那么希望jcenter能尽快回来,并开始计划远离它。

HBB20 提问于2022-10-31
HBB20 修改于2022-11-08
Gradle的状态页面也显示与JCenter有关的故障。最近这里Adrian 2022-10-31
这里有一个grep,你可以在你的项目中运行,它将输出版本库中所有出现的jcenter,你可以用它作为一个起点来研究你可能需要更新哪些库。grep -rnw "jcenter" * > output-file. txtLakston 2022-10-31
运行这个命令,看看你有哪些依赖于jCenter的依赖,然后删除或升级这些依赖。shell for FILE in `find . |grep build.gradle`; do echo $FILE; cat $FILE |grep jcenter; done 来源:github相关问题louiechristie 2022-11-08
#2楼
得票数 29

最后经过几个小时的拍脑袋,问题解决了。在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 提问于2022-10-31
Faizal Shap 修改于2022-10-31
#3楼
得票数 8

是的,你并不孤单,Jcenter今天似乎倒下了。

我的解决方案是将所有的jCenter改为mavenCentral,从root/android/build.gradle开始。

另外,别忘了库node_module/*error libaray*/android/build.gradle

honam wong 提问于2022-10-31
honam wong 修改于2022-10-31
mavenCentral不是jcenter的完全替代品。我建议同时保留Mahesh 2022-10-31
@Mahesh 谢谢你的信息。我现在会保留它们honam wong 2022-11-06
#4楼
得票数 6

我也刚刚遇到这个问题,我不太清楚为什么jcenter会返回403,但你可以通过在仓库设置中在jcenter()之前添加mavenCentral()来解决这个问题,像这样。

    repositories {
        ...
        mavenCentral() // add this line
        jcenter()
        ...
    }
Madray Haven 提问于2022-10-31
这对大多数依赖关系都有效,但如果您使用的是未上传到mavenCentral的某些依赖关系,甚至是未上传到mavenCentral的过渡依赖关系,那么您(和我)就只能听从jcenter的摆布。我们可以等待并希望jcenter修复或添加一个新的技术债务紧急任务,以摆脱该依赖(或希望是版本)。说起来容易,做起来难。HBB20 2022-10-31
#5楼
得票数 5

我认为mavenCentral不是jcenter的完全替代品。
我用的是aliyun的镜像。把jcenter()换成maven { url "https://maven.aliyun.com/repository/jcenter" }

不知道它是否可以从中国以外的地方访问,或者阿里云是否对一些包进行审查,或者它是否是最新的。

指南,以取代。

android/build.gradle

buildscript {
    ...
    repositories {
        ...
-        jcenter()
+       maven { url "https://maven.aliyun.com/repository/jcenter" }
    }
}
allprojects {
+   buildscript {
+       repositories {
+           maven { url "https://maven.aliyun.com/repository/jcenter" }
+       }
+   }
    repositories {
        ...
-       jcenter()
+       maven { url "https://maven.aliyun.com/repository/jcenter" }
    }
}
cani1see 提问于2022-10-31
cani1see 修改于2022-10-31
这为我做了工作。有哪些"需要知道的事情",使用这个可能会有什么后果?Itay Feldman 2022-10-31