无法访问 'java.lang.Object' 这是...的超类型 检查您的模块类路径是否缺少或冲突的依赖项

Cannot access 'java.lang.Object' which is a supertype of... Check your module classpath for missing or conflicting dependencies

我认为通过实现我自己的自定义 linter 来了解有关静态代码分析的更多信息会很有趣并且会提供很多信息。我一直在尝试声明以下依赖项:

dependencies {
    compileOnly "com.android.tools.lint:lint-api:30.1.2"
    compileOnly "com.android.tools.lint:lint-checks:30.1.2"
}

但是Gradle给出了无法解析这些依赖项的错误。在挖掘一些之后,我发现 MavenCentral 和 Google 对这些库的版本控制似乎不同,Google 是上面代码片段中描述的版本,而 MavenCentral 的最新版本是 25.3.0。如果我换掉那些 described on MavenCentral 的版本号,依赖关系可以通过 Gradle 解决,但我的自定义 linter 代码完全以红色突出显示并给出错误

Cannot access 'java.lang.Object' which is a supertype of my_custom_linter. Check your module classpath for missing or conflicting dependencies

很多 SO post关于这个错误,少数已经解决的问题是通过使用可用依赖项的最新版本解决的,这在我的例子中,回到 post.

中描述的第一个错误

项目级别build.gradle

buildscript {
    repositories {
        google()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:7.0.4"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10"
    }
}

plugins {
    id 'com.android.application' version '7.1.2' apply false
    id 'com.android.library' version '7.1.2' apply false
    id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
    id 'org.jetbrains.kotlin.jvm' version '1.6.10' apply false
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

lint 模块build.gradle:

plugins {
    id 'java-library'
    id 'org.jetbrains.kotlin.jvm'
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
}

dependencies {
    compileOnly "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.10"
    compileOnly "com.android.tools.lint:lint-api:25.3.0"
    compileOnly "com.android.tools.lint:lint-checks:25.3.0"
}

jar {
    manifest {
        attributes("Lint-Registry": "com.example.lint_checks.LintRegistry")
    }
}

应用模块build.gradle:

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}

android {
    compileSdk 32

    defaultConfig {
        ...
    }

    buildTypes {
        ...
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
    kotlinOptions {
        jvmTarget = '1.7'
    }
    buildFeatures {
        viewBinding true
    }
}

dependencies {
    lintChecks project(path: ":lint-checks")
    ...
}

settings.gradle

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
    }
}
rootProject.name = "Custom Linter"
include ':app'
include ':lint-checks'

InputTypeDetector.kt(自定义 lint class):

/* Entire class highlighted by IDE with error message: 
Cannot access 'java.lang.Object' which is a supertype of 'com.example.lint_checks.InputTypeDetector'. Check your module classpath for missing or conflicting dependencies */ 

class InputTypeDetector: LayoutDetector() {
    companion object {
        @JvmStatic
        internal val ISSUE_MISSING_INPUT_TYPE = Issue.create(
            id = "MissingInputType",
            briefDescription = "Specify inputType attribute to get proper keyboard shown by system.",
            explanation = "You should specify an inputType for each EditText so that you can get the proper keyboard to be shown by system.",
            category = Category.USABILITY,
            priority = 8,
            severity = Severity.ERROR,
            implementation = Implementation(
                InputTypeDetector::class.java,
                Scope.ALL_RESOURCES_SCOPE
            )
        ).addMoreInfo("https://developer.android.com/training/keyboard-input/style")
    }

    override fun getApplicableElements(): Collection<String>? {
        return listOf(
            SdkConstants.EDIT_TEXT,
            "androidx.appcompat.widget.AppCompatEditText",
            "android.support.v7.widget.AppCompatEditText"
        )
    }

    override fun visitElement(context: XmlContext, element: CoroutineContext.Element) {
        if (!element.hasAttribute(SdkConstants.ATTR_INPUT_TYPE)) { // Check if the element has the `android:inputType` attribute
            context.report(
                issue = ISSUE_MISSING_INPUT_TYPE, // The issue that we defined above
                location = context.getLocation(element),
                message = ISSUE_MISSING_INPUT_TYPE.getExplanation(TextFormat.TEXT)
            )
        }
    }
}

更新: 我已验证 lint-apilint-checks jar 文件位于我项目的外部库目录中。 Gradle请求25.3.0版本时已经解决并下载了这些依赖。为什么我在访问 java.lang.Object 和检查我的 class 路径时收到错误消息?

我一直关注这个tutorial

我不清楚您配置了哪些依赖项解析存储库,因为您没有提供 settings.gradle 文件。所以我假设你在那里配置了以下内容:

dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
    }
}

现在,虽然存在 lint-apilint-checks 的 25.3.0 版本,但它的依赖声明使其不适合用作 compile-time 依赖。所以我把版本升级到26.6.4:

    compileOnly "com.android.tools.lint:lint-api:26.6.4"
    compileOnly "com.android.tools.lint:lint-checks:26.6.4"

这引入了所有必需的依赖项。但是您的 InputTypeDetector 实现仍然存在一个问题:visitElement 方法签名是错误的,因为它使用 CoroutineContext.Element 作为 element 的类型。它应该是 org.w3c.dom.Element,但是:

    override fun visitElement(context: XmlContext, element: org.w3c.dom.Element) {
        // …
    }

通过这些更改,我可以成功构建您的 lint-checks 项目(使用 Gradle 7.4.2 测试)。


回复您的评论:恐怕,我无法重现 your code 的错误。但是请注意,我做了一些可能会有所不同的修改:

  • 我必须在 LintRegistry.kt 中添加缺少的导入:
    import com.android.tools.lint.detector.api.CURRENT_API
  • 在将您的项目导入 Android Studio 之前,我删除了 .idea/
  • 出于安全原因,我删除了 gradle/gradlewgradlew.bat 文件。然后我添加了一个新的 Gradle 相同版本 (7.4.2) 的包装器。

您能否尝试做同样的事情并重新导入项目,看看是否可以解决问题?另一件值得尝试排除 Android Studio 问题的事情:看看从命令行构建是否有效,例如 ./gradlew lint-checks:build.

我也看到了同样的问题。我经常遇到这种情况。

迟早,我最终会回到旧的代码库,它又可以工作一段时间。

但我知道总有一天我的 build.gradle.kts 会变成血红色,而 ideaj 开始丢失 Object 和 Comparable 之类的东西......但不知何故,它仍然奇迹般地工作......没有java.lang.Object ...它会一直工作直到停止工作。

然后我又开始跳舞了。