如何在Android Studio中修复ButterKnife的错误?

42
构建成功,但在模拟器上运行失败,并出现以下控制台消息:

原因:超类访问检查失败:类butterknife.compiler.ButterKnifeProcessor $ RScanner(在未命名模块@ 0x65e8e2f6中)无法访问com.sun.tools.javac.tree.TreeScanner(在模块jdk.compiler中),因为模块jdk.compiler不会将com.sun.tools.javac.tree导出到未命名模块@ 0x65e8e2f6

我尝试过的:从Gradle中删除Butterknife,并进行同步,然后重新添加并再次同步。完全删除Butterknife库,在编译时不会产生此错误,但由于缺少Butterknife而无法编译。 我的环境:Butterknife 10.2.3 Android Grade插件版本:7.1.2 - Gradle版本:7.2 - Android Studio Bumblebee 我已经阅读到此错误会在其他库中发生某些看似不相关的罕见情况,并且仍然没有找到解决方案。我知道Butterknife已被弃用,应该迁移到ViewBinding,但目前要将整个项目转换为ViewBinding是一个很大的任务。谢谢!

1
我希望你能找到这个问题的答案,这似乎是一个合理的问题,但在你找到答案的时间里,你可能已经完全实现了ViewBinding :) - a_local_nobody
@a_local_nobody 这是一个具有讽刺意味的真实观点,也可能是我最终会做的事情。试图在这里走运哈哈 - justColbs
1
这是与编程有关的内容,请将其翻译成中文。仅返回翻译后的文本即可:没错,我只是觉得值得指出的是,这不是一个复杂的改变,但需要花费时间,所以我想指出它的价值。在你等待的时候,你可以开始做些事情,反正迟早都得做这件事,最好能提高一下生产力。 - a_local_nobody
@a_local_nobody 你激励了我。我想我会哈哈,谢谢! - justColbs
11个回答

58

一些 sun 库需要对较新版本的 Java 编译器进行可见性设置。请参见 此答案 获取更多信息。我将以下内容添加到我们的 gradle.properties 文件中,问题就解决了。(我们使用 Butterknife 和 Realm,并需要添加以下三个包。对于仅使用 Butterknife 的情况,您可能无需添加 "javac.code")

org.gradle.jvmargs=-Xmx1920M \
--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \
--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED \
--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED

20

我在更新Android Studio到Android Studio Flamingo | 2022.2.1之后遇到了这个问题,我的项目使用了嵌入式JDK,但我通过简单的步骤进行了修复。

  1. https://www.oracle.com/pk/java/technologies/javase/jdk11-archive-downloads.html
  2. 下载适用于您所需操作系统的JDK 11
  3. 安装它
  4. 打开Android Studio-> 文件 -> 项目结构 -> SDK位置 -> 点击Gradle设置(蓝色高亮文本) -> 从列表中选择带有11.0版本名称的jdk 11
  5. 运行该项目
  6. 完美解决!

14

您应该使用不同版本的JDK进行编译,我使用了一个过于先进的JDK进行编译。将其还原为JDK11后问题得到解决。


1
我最终升级了许多项目到最新版本(它相当过时了),并解决了问题。感谢您的回复。 - justColbs
回退到JDK 11用于旧项目时出现了以下错误: 算法-hmacpbesha256不可用。 - undefined

9
尝试将以下代码添加到应用程序的 build.gradle 文件中。
tasks.withType(JavaCompile).configureEach{
options.fork = true
options.forkOptions.jvmArgs +=[
'--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED', 
'--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED', 
'--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED']
}

在 gradle.properties 文件中,
android.nonFinalResIds=false

2
嗨, 在我的系统上它运行正常。但是它是如何工作的呢?你是从哪里得到这个想法的?能解释一下吗? - undefined
1
嘿,这对我也起作用了。我猜这只是绕过不匹配的JDK版本的方法。 - undefined
嘿,对我也有效,谢谢你。 - undefined
build.gradle文件中的哪里添加这个? - undefined

5

使用以上答案中的思路并使用Android Studio:文件 | 设置 | 构建,执行,部署 | 构建工具 | Gradle。 Gradle JDK -> Android Studio 默认 JDK(版本为11.0.13 ...)

在Windows上,在终端构建时,还需要添加:

JAVA_HOME=C:\Program Files\Android\Android Studio\jre

进入文件 | 设置 | 终端 | 环境变量


请注明您的答案适用于Windows操作系统。 - Marcin Orlowski
对我来说,只需在Gradle JDK选项中添加另一个JDK即可解决这个问题。无需编辑Windows环境变量。 - aman207

4
请使用JDK 11。虽然我们将Gradle JDK设置为jdk11或correto 11,但Android Studio没有识别它。
解决方案: 1. 在终端中输入java --version,查看是否显示为JDK 11。 2. 如果版本不是JDK 11,则设置JAVA_HOME环境变量:export JAVA_HOME=/Users/${echo $USER}/documents/Android\Studio.app/Contents/jre/Contents/Home 3. 在终端中再次输入java --version,查看是否显示为JDK 11。

Gradle不允许这样做。现在它说:“Android Gradle插件需要Java 17才能运行。您当前正在使用Java 11。” - Nathan
同样的事情也发生在我身上。 - Carlos

3
我刚刚在使用最新版本的Android Studio Flamingo打开我的旧项目时遇到了这个问题,浪费了大约3个小时。在我将项目的JDK设置为11之后重新构建项目,问题得到了很好的解决。

enter image description here


1
是的,在我的情况下,我遇到了同样的问题,将它更改为jdk 11解决了它。 - undefined

2
请在build.gradle(:app)文件中添加以下代码:
android { tasks.withType(JavaCompile).configureEach { options.fork = true options.forkOptions.jvmArgs += [ '--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED', '--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED', '--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED', '--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED', '--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED', '--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED', '--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED', '--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED', '--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED', '--add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED', ] } }

2
第一步:在gradle.properties中添加
android.nonFinalResIds=false

第二步:在应用的 build.gradle 文件中添加
tasks.withType(JavaCompile).configureEach{options.fork = true
options.forkOptions.jvmArgs +=[
'--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED', 
'--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED', 
'--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED']}

1
从文件夹C:\Users\yourUser.gradle\中删除文件夹.gradle可以解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接