无法访问'java.lang.Object'这是...检查模块类路径中是否存在缺失或冲突的依赖项



我认为通过实现自己的自定义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
}

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(自定义皮棉类(:

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

我一直在学习这个教程

我看到了同样的大便。这种事经常发生在我身上。

迟早,我会回到一个旧的代码库,它会再次工作一段时间。

但我知道总有一天我的build.gradle.kts会变成血红色,ideaj开始失去Object和Comparable之类的东西。。。但是,不知怎么的,它奇迹般地成功了。。。没有java.lang.Object…并且它一直在工作,直到它不工作为止。

然后我又开始跳舞了。

TL;DR:这是安卓工作室某些版本的错误。进行升级。

在几个项目中,在每个build.gradle.kts文件中,我让整个代码都用红色下划线(显示错误(,这似乎是没有原因的,因为就在几天前,这个代码还可以正常工作。

我发现这是由安卓工作室本身的一个错误引起的

事实上,我发现它在某个论坛上被报道。

为了存储IDE,我使用Jetbrains Toolbox。我曾经使用安卓工作室Flamingo 2022.2.1 Patch 2,但也可能是工具箱在幕后自动将AS升级到了这个版本,带来了错误。

它可能是由某种IDE损坏引起的,所以重新安装IDE可能会有所帮助(您可以保留设置(。

对我来说,这个错误是通过删除旧版本并安装新版本的Android Studio Giraffe 2022.3.1 RC 1来解决的。

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

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

现在,虽然存在lint-apilint-checks的25.3.0版本,但它的依赖声明使其不适合用作编译时依赖。所以我已经将版本升级到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文件。然后我添加了一个相同版本的新Gradle Wrapper(7.4.2(

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

相关内容

最新更新