gitblit.cmd&java.lang.VerifyError: class org.bouncycastle.asn1.ASN1Primitive overrides final method

本文介绍了在搭建gitblit-1.8.0过程中遇到的闪退问题及其解决方案。通过删除特定的bcprov-jdk15-135.jar文件,可以有效解决java.lang.VerifyError异常。

问题:

在搭建gitblit-1.8.0时候点击gitblit.cmd出现闪退,在点击authority.cmd还好输出了日志,没有闪退,提示如下:

java.lang.VerifyError: class org.bouncycastle.asn1.ASN1Primitive overrides final method。。。

解决方法:

删除jdk>jre>lib>ext>bcprov-jdk15-135.jar 


<think> 我们之前讨论的是Protocol Buffers相关的ClassNotFoundException,现在用户转向了Android开发中的java.lang.VerifyError,具体是关于TimestampsOuterClass$Timestamps的验证错误。根据用户提供的引用内容(关于时间戳的文件系统操作)实际上与当前问题无关,因此我们应该忽略这些引用,专注于解决VerifyErrorjava.lang.VerifyError通常发生在Android运行时验证类文件时发现类文件不符合规范。这可能由以下原因引起: 1. 类文件编译时使用了更高版本的Java特性(如Java 8+的特性),而运行时的Android版本不支持。 2. 依赖冲突,同一个类有多个版本,导致类结构不一致。 3. 混淆(ProGuard)或D8/R8优化导致的问题。 4. 类文件损坏或不完整。 针对用户提到的具体类名(gatewayprotocol.v1.TimestampsOuterClass$Timestamps),这是一个Protocol Buffers生成的类,因此问题可能与Protobuf相关。 ### 解决方案步骤: #### 1. **检查Java版本兼容性** - 确保Protobuf生成的代码与Android项目的Java版本兼容。在Android中,通常使用Java 8特性时需要配置desugar。 - 在模块的`build.gradle`中设置Java 8并启用desugar: ```groovy android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } ``` - 同时,确保依赖了Android的desugar库(在AGP 4.0+中默认包含,但需要确认)。 #### 2. **检查Protobuf插件配置** - 在Android项目中,通常使用`protobuf-gradle-plugin`来生成代码。请确认插件版本和配置正确: ```groovy buildscript { dependencies { classpath 'com.google.protobuf:protobuf-gradle-plugin:0.9.4' } } ``` 然后在模块中应用插件: ```groovy apply plugin: 'com.google.protobuf' ``` - 配置protobuf生成任务,确保生成正确版本的代码。例如: ```groovy protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.21.12' // 使用与依赖匹配的版本 } generateProtoTasks { all().each { task -> task.builtins { java { option "lite" } // 如果需要Kotlin支持,添加kotlin kotlin { option "lite" } } } } } ``` #### 3. **解决依赖冲突** - 使用`./gradlew :app:dependencies`(将`:app`替换为你的模块名)检查依赖树,查看是否有多个Protobuf版本。 - 如果存在冲突,强制指定版本: ```groovy configurations.all { resolutionStrategy { force 'com.google.protobuf:protobuf-java:3.21.12' force 'com.google.protobuf:protobuf-kotlin:3.21.12' } } ``` #### 4. **检查混淆规则** - 如果启用了ProGuard/R8,确保Protobuf生成的类不被混淆。添加以下规则: ```proguard -keep class gatewayprotocol.v1.** { *; } -keep class com.google.protobuf.** { *; } ``` #### 5. **清理并重建项目** - 删除`build`目录和`.gradle`目录,然后重新构建: ```bash ./gradlew clean build ``` #### 6. **检查Protobuf生成代码的完整性** - 确保生成代码的任务已执行。可以尝试删除生成的源代码目录(通常是`build/generated/source/proto`)然后重新同步项目。 ### 根本原因分析 此错误通常是因为生成的Protobuf类使用了Android运行时无法识别的字节码。在Protobuf生成代码中,特别是使用`Timestamps`(可能涉及Java 8的时间API),在没有正确desugar的情况下会导致问题。另外,如果Protobuf生成器使用了不兼容的Java版本(如生成了Java 11的字节码)也可能导致此错误。 ### 相关问题 1. 如何在Android中配置Protobuf? 2. 如何解决Android中的java.lang.VerifyError? 3. 什么是desugar,它在Android开发中起什么作用? 4. 如何排查Android中的依赖冲突? </think> ### 解决Android开发中的`java.lang.VerifyError: Verifier rejected class gatewayprotocol.v1.TimestampsOuterClass$Timestamps`报错 该错误通常由**字节码验证失败**引起,表示Android运行时检测到类结构不符合规范。以下是系统化的解决方案: --- #### 1. **检查Protocol Buffers依赖版本冲突(首要步骤)** ```gradle // 在app/build.gradle中添加配置 configurations.all { resolutionStrategy { force 'com.google.protobuf:protobuf-java:3.21.12' // 显式指定版本 force 'com.google.protobuf:protobuf-kotlin:3.21.12' } } ``` **关键点**: - 使用`./gradlew :app:dependencies`检查依赖树 - 确保所有`protobuf-*`依赖版本**严格一致** - 常见冲突源:gRPC、Firebase库中的旧版Protobuf[^1] --- #### 2. **启用Java 8 desugar支持** 在`app/build.gradle`中启用: ```gradle android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 coreLibraryDesugaringEnabled true // 关键开关 } } dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' // 最新版本 } ``` **原因**:Protobuf生成的`Timestamps`类依赖Java 8 API(如`java.time.*`),需desugar转换[^2] --- #### 3. **清理构建缓存** ```bash # 终端执行 ./gradlew clean rm -rf ~/.gradle/caches/ # 彻底清理Gradle全局缓存 ``` 随后在Android Studio执行: **File > Invalidate Caches / Restart** --- #### 4. **检查Protobuf代码生成配置** 确保protobuf Gradle插件配置一致: ```gradle plugins { id "com.google.protobuf" version "0.9.4" // 与Protobuf库版本兼容 } protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.21.12' // 必须与依赖版本相同 } } ``` --- #### 5. **禁用R8优化(临时测试)** 在`gradle.properties`中添加: ```properties android.enableR8=false android.enableR8.libraries=false ``` **作用**:排查是否由代码优化引起,若解决则需添加ProGuard规则: ```proguard -keep class gatewayprotocol.v1.** { *; } -keep class com.google.protobuf.** { *; } ``` --- ### 根本原因分析 此错误通常由以下场景触发: 1. **版本不一致**:Protobuf编译器(`protoc`)与运行时库(`protobuf-java`)版本不匹配 2. **Java 8 API缺失**:Android未正确配置对`java.time.Instant`等API的支持 3. **字节码污染**:构建缓存包含旧版本生成的类文件 4. **优化冲突**:R8优化移除Protobuf必需的注解信息[^1] > 典型案例表明:Android中的`VerifyError`多由依赖版本冲突或Java 8+特性支持缺失导致[^1][^2]。 --- ### 相关问题 1. 如何检测Android项目的依赖版本冲突? 2. Java 8 desugar在Android中是如何工作的? 3. Protobuf在Android项目中的最佳配置实践是什么? 4. R8与ProGuard规则有哪些关键区别?
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值