无法访问作为上级类型的 'java.lang.Object'... 请检查您的模块类路径以查找缺失或冲突的依赖项。

7

我认为通过实现自定义的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。如果我使用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帖子,而那些已经解决的很少,都是通过使用可用依赖项的最新版本来解决的,在我的情况下,这又回到了本文描述的第一个错误。


项目级别的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
}

build.gradle 中的 Lint 模块:

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 类):

/* 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文件位于我的项目的外部库目录中。当请求版本25.3.0时,Gradle已经解析并下载了这些依赖项。为什么我会收到关于访问java.lang.Object和检查我的类路径的错误?

我一直在遵循这个教程

3个回答

2
我也遇到了同样的问题,这种情况经常发生。
迟早有一天,我会回到旧的代码库,它会再次正常工作一段时间。
但是我知道有一天我的build.gradle.kts会变成血红色,ideaj开始丢失像Object和Comparable这样的东西……但仍然以某种神奇的方式继续工作……没有java.lang.Object……它继续工作直到不行为止。
然后我又开始跳舞了。

1
TL;DR: 这是Android Studio的某些版本的一个错误。进行升级。
在几个项目中,我发现整个代码都被红色下划线标记(显示错误),在每个build.gradle.kts文件中,似乎没有任何原因,因为这段代码在几天前还能正常工作。
我发现这是由于Android Studio本身的一个错误引起的。
实际上,我在某个论坛上找到了相关报告。
我使用Jetbrains Toolbox来存储IDE。我曾经使用的是Android Studio Flamingo 2022.2.1 Patch 2,但也有可能是Toolbox在幕后自动将AS升级到这个版本,从而带来了这个错误。
这可能是由于某种IDE损坏导致的,所以重新安装IDE可能会有所帮助(您可以保留您的设置)。
对我来说,通过删除旧版本并安装更新版本的Android Studio,Giraffe 2022.3.1 RC 1,问题得到了解决。

0

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

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

现在,虽然存在版本为25.3.0的lint-apilint-checks,但它们具有依赖声明,使其不适合用作编译时依赖项。因此,我已将版本升级到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 进行测试)。


回复您的评论:很抱歉,我无法重现 您的代码 中的错误。不过请注意,我进行了一些修改,这可能会有所不同:

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

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


奇怪 :-( 从命令行构建也失败了吗? - Chriki
感谢您授予奖励。您是否已经找到导致此错误的两台计算机之间的差异?如果您找到了原因,我很想听听您的看法 :-) - Chriki
我无法解决(至今仍然无法解决)的计算机是运行Mac OS Monterey的机器,而不再出现错误的计算机正在运行Manjaro Linux。两台计算机都安装了相同版本的Android Studio 2021.1.1 Patch 2。我在Mac上注意到的一件事是一个错误“用于使用Gradle构建的Kotlin版本(1.6.10)与IDE插件捆绑的版本(1.6.20)不同”,但更改为IDE捆绑的Kotlin版本(1.6.20)会导致错误“插件版本(1.6.20)与库版本(1.3.71)不同”。 - John Harrington
在项目和模块级别的build.gradle文件中将Gradle插件版本更改为1.3.71并进行同步,仍然会出现错误Plugin version (1.6.10) is not the same as library version (1.3.71)。但是,在Linux机器上进行此更改后,所有错误消息都消失了,我可以毫无问题地运行./gradle lint。我不确定问题是什么,但我认为涉及到Gradle插件未按照Mac版Android Studio指定的方式更改。 - John Harrington
你可能会发现不必去另一台电脑。我承受不起这种奢侈,所以我设法回到源代码树的旧版本,然后可以应用之前做过的相同更改。这并不会破坏任何东西... 直到某些事情变了。 - Nobody Tells The Truth
显示剩余4条评论

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