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

Joh*_*ton 7 dependencies android gradle maven kotlin

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

dependencies {
    compileOnly "com.android.tools.lint:lint-api:30.1.2"
    compileOnly "com.android.tools.lint:lint-checks:30.1.2"
}
Run Code Online (Sandbox Code Playgroud)

但是 Gradle 给出了一个错误,指出这些依赖项无法解决。经过一番挖掘,我发现 MavenCentral 和 Google 对这些库的版本控制似乎不同,Google 是上面代码片段中描述的版本,MavenCentral 的最新版本是 25.3.0。如果我将版本号替换为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
Run Code Online (Sandbox Code Playgroud)

很多关于此错误的帖子,并且已解决的少数帖子是通过使用可用依赖项的最新版本来解决的,在我的情况下,这又回到了本文中描述的第一个错误。


项目级别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
}
Run Code Online (Sandbox Code Playgroud)

棉绒模块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")
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序模块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")
    ...
}
Run Code Online (Sandbox Code Playgroud)

settings.gradle

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

InputTypeDetector.kt(自定义 lint 类):

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

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

我一直在关注这个教程

Chr*_*iki 0

我不清楚,当您不提供settings.gradle文件时,您配置了哪些依赖项解析存储库。因此,I\xe2\x80\x99ll 假设您已在那里配置了以下内容:

\n
dependencyResolutionManagement {\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

现在,虽然版本 25.3.0lint-apilint-checks已经存在,但它的依赖声明使其不适合用作编译时依赖项。所以我\xe2\x80\x99ve将版本升级到26.6.4:

\n
    compileOnly "com.android.tools.lint:lint-api:26.6.4"\n    compileOnly "com.android.tools.lint:lint-checks:26.6.4"\n
Run Code Online (Sandbox Code Playgroud)\n

这带来了所有必需的依赖项。但是您的实现仍然存在一个问题InputTypeDetectorvisitElement方法签名是错误的,因为它CoroutineContext.Element使用element. 不过,应该是org.w3c.dom.Element

\n
    override fun visitElement(context: XmlContext, element: org.w3c.dom.Element) {\n        // \xe2\x80\xa6\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

回应您的评论:我\xe2\x80\x99m害怕,我可以\xe2\x80\x99t用您的代码重现错误。但请注意,我做了一些可能会有所不同的修改:

\n
    \n
  • 我必须在以下位置添加缺少的导入LintRegistry.kt
    \nimport com.android.tools.lint.detector.api.CURRENT_API
  • \n
  • .idea/在将您的项目导入 Android Studio 之前我已经删除了。
  • \n
  • 出于安全原因,我删除了gradle/gradlewgradlew.bat文件。然后我添加了相同版本(7.4.2)的新 Gradle Wrapper。
  • \n
\n

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

\n