我认为通过实现我自己的自定义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
关于这个错误有很多这样的帖子,少数已经解决的问题已经通过使用可用依赖关系的最新版本来解决,在我的例子中,这个版本回到了本文中描述的第一个错误。
项目级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
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")
}
}
App模块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-api
和lint-checks
jar文件。Gradle在请求25.3.0版本时已经解决并下载了这些依赖项。为什么我在访问java.lang.Object
和检查类路径时出错?
我一直在跟踪这个教程
发布于 2022-04-06 12:20:20
我不清楚,您配置了哪些依赖关系解析存储库,因为您没有提供settings.gradle
文件。因此,我假设您已经在这里配置了以下内容:
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
}
}
现在,虽然存在lint-api
和lint-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.ktimport com.android.tools.lint.detector.api.CURRENT_API
中添加一个缺失的导入。.idea/
。gradle/
、gradlew
和gradlew.bat
文件。然后我添加了一个相同版本(7.4.2)的新的Gradle包装器。你能不能试着做同样的事情,重新导入这个项目,看看它是否能修复它?另一件值得尝试排除与Android有关的问题的事情是:看看从命令行构建是否有效,例如使用./gradlew lint-checks:build
。
发布于 2022-05-06 08:44:05
我看到的都是同样的东西。这种事一直发生在我身上。
迟早,我会回到一个旧的代码库,并且它会再次工作一段时间。
但我知道,总有一天,我的build.gradle.kts会变成血红的,而ideaj开始失去物体和可比的东西.但不知怎么的,奇迹般地成功了.没有java.lang.Object ..。它一直在工作直到它不起作用。
然后我又开始跳舞了。
https://stackoverflow.com/questions/71654531
复制相似问题