Android 5.1中使用networknt json-schema-validator遇NoClassDefFoundError
Android 5.1中networknt json-schema-validator抛出NoClassDefFoundError问题
我使用networknt json-schema-validator校验JSON Schema,以下代码在Android 11(API 30)运行正常:
val mapper = ObjectMapper(YAMLFactory()) val jsonNodeReader = JsonNodeReader.builder().yamlMapper(mapper).build() val factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V4) { it.jsonNodeReader(jsonNodeReader).build() } val config = SchemaValidatorsConfig.builder().build() val schema = factory.getSchema(schemaFile, InputFormat.YAML, config) val messages = schema.validate(yamlFile, InputFormat.YAML, Consumer { it.executionConfig.formatAssertionsEnabled = true })
但在Android 5.1(API 22)运行时抛出如下错误:
Uncaught Exception in Thread ID: 1 - Thread name: main java.lang.NoClassDefFoundError: Failed resolution of: Ljava/lang/BootstrapMethodError; at com.fasterxml.jackson.databind.util.ExceptionUtil.isFatal(ExceptionUtil.java:51) at com.fasterxml.jackson.databind.util.ExceptionUtil.rethrowIfFatal(ExceptionUtil.java:31) at com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector.<clinit>(JacksonAnnotationIntrospector.java:70) at com.fasterxml.jackson.databind.ObjectMapper.<clinit>(ObjectMapper.java:402) at com.genedrive.print.SchemaValidator.validateSchema(SchemaValidator.kt:44) at com.genedrive.account.login.LoginFragment$onViewCreated$1.onClick(LoginFragment.kt:117) at android.view.View.performClick(View.java:4780) at android.view.View$PerformClick.run(View.java:19866) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135)
当前Gradle配置:
minSdkVersion 18 targetSdkVersion 28 dependencies { implementation('com.networknt:json-schema-validator:1.4.1') { exclude group: 'org.slf4j', module: 'slf4j-api' } implementation 'org.slf4j:slf4j-api:2.0.0' }
问题原因
BootstrapMethodError的出现是因为Android 5.1(API 22)原生不支持Java 8的部分特性(如接口默认方法、静态方法),而你依赖的jackson-databind或networknt库中使用了这些特性,同时项目未启用Java 8 desugar支持来兼容低版本Android。
解决方案
启用Java 8编译与Desugar支持
在app模块的build.gradle(或build.gradle.kts)中添加以下配置:
Groovy DSL:android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 coreLibraryDesugaringEnabled true } kotlinOptions { jvmTarget = "1.8" } } dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' // 保留原有依赖 }Kotlin DSL:
android { compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 isCoreLibraryDesugaringEnabled = true } kotlinOptions { jvmTarget = "1.8" } } dependencies { coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.4") // 保留原有依赖 }强制兼容的Jackson版本
networknt 1.4.1依赖的Jackson版本可能对低版本Android支持不佳,可强制指定兼容API 22的Jackson版本:implementation('com.networknt:json-schema-validator:1.4.1') { exclude group: 'org.slf4j', module: 'slf4j-api' exclude group: 'com.fasterxml.jackson.core' exclude group: 'com.fasterxml.jackson.dataformat' } implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.7' implementation 'com.fasterxml.jackson.core:jackson-core:2.12.7' implementation 'com.fasterxml.jackson.core:jackson-annotations:2.12.7' implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.12.7' implementation 'org.slf4j:slf4j-api:2.0.0' }清理重建项目
执行命令./gradlew clean build,确保依赖和编译配置完全生效。
内容的提问来源于stack exchange,提问作者Vignesh
相关产品推荐
相关产品推荐

