如何在 Android Studio 中使用 ButterKnife 修复此错误?

jus*_*lbs 48 android android-studio butterknife

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

原因:超类访问检查失败:类utterknife.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,但目前将整个项目转换为一项艰巨的任务。谢谢!

Die*_*rik 73

一些 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
Run Code Online (Sandbox Code Playgroud)


小智 23

我在将 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. 繁荣!其作品


小智 15

你应该使用不同的jdk进行编译,我使用的是太高级的jdk进行编译。将其恢复为 jdk11 为我解决了这个问题


azz*_*its 13

尝试将以下代码添加到 android 部分 {} 内的应用程序 build.gradle(项目级别)

android{
    tasks.withType(JavaCompile).configureEach{
    options.fork = true
    opti ons.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']
}
Run Code Online (Sandbox Code Playgroud)

在 gradle.properties 文件中,

android.nonFinalResIds=false
Run Code Online (Sandbox Code Playgroud)

例如

android {
    namespace = "com.xp.vrsr"
    compileSdk = 34

    defaultConfig {
        applicationId "com.interact.vrsrilanka"
        minSdk 24
        targetSdk 34
        versionCode 4
        versionName "1.3"
        multiDexEnabled true
    }
    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']
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    lintOptions {
        checkReleaseBuilds false
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 你好,它适用于我的系统。但它是如何运作的呢?你在哪里找到这个想法?你能解释一下吗? (2认同)

Far*_*d Z 5

使用上面答案中的想法并使用 Android Studio:文件 | 设置 | 构建、执行、部署 | 构建工具| 摇篮。Gradle JDK -> Android Studio 默认 JDK(版本 11.0.13 ...)

在 Windows 上,要从终端构建,还必须添加

JAVA_HOME=C:\Program Files\Android\Android Studio\jre
Run Code Online (Sandbox Code Playgroud)

前往文件 | 设置 | 终端| 环境变量


小智 5

第1步:gradle.properties添加

android.nonFinalResIds=false
Run Code Online (Sandbox Code Playgroud)

第2步:应用程序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']}
Run Code Online (Sandbox Code Playgroud)