Codename One集成GTFS实时数据时ProGuard重复Jar条目问题求助
Codename One接入GTFS实时数据时ProGuard重复类错误解决方案
问题详情
我有一个Codename One应用,需要接入GTFS实时数据接口,添加解析代码后本地构建失败,ProGuard抛出重复类错误。
解析代码
try { FeedMessage.parseDelimitedFrom(byteArrayInputStream); } catch (IOException ex) { Log.p("transitSelected,ex," + ex); }
ProGuard报错信息
ProGuard, version 7.2.0-beta2 Error: Can't write [D:\data\Netbeans\HHT\common\target\compliance-check.jar] (Can't read [C:\Users\Still\.m2\repository\com\google\protobuf\protobuf-javalite\3.24.2\protobuf-javalite-3.24.2.jar(;;;;;;;;!META-INF\**)] (Duplicate jar entry [com/google/protobuf/AbstractMessageLite$Builder$LimitedInputStream.class])) Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate jar entry [META-INF/MANIFEST.MF])Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate jar entry [META-INF/MANIFEST.MF])
已尝试操作
- 设置Codename One构建参数
android.enableProguard=false,无效 - 移除pom.xml中的compliance-check配置可解决问题,但希望保留该配置,寻求其他方案
项目依赖配置(pom.xml)
<dependencies> <dependency> <groupId>com.codenameone</groupId> <artifactId>codenameone-core</artifactId> <scope>provided</scope> </dependency> <dependency> <artifactId>myapplication-CN1CircleProgress</artifactId> <groupId>com.stylsy.app</groupId> <version>1.0-SNAPSHOT</version> <type>pom</type> </dependency> <dependency> <groupId>com.codenameone</groupId> <artifactId>googlemaps-common</artifactId> <version>1.1.2</version> <type>jar</type> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.24.2</version> <type>jar</type> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-javalite</artifactId> <version>3.24.2</version> <type>jar</type> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java-util</artifactId> <version>3.24.2</version> </dependency> </dependencies>
可行解决方案
1. 移除重复Protobuf依赖(推荐)
protobuf-java和protobuf-javalite包含大量重复类,这是错误根源。Codename One是移动开发框架,推荐使用轻量的protobuf-javalite:
- 删除pom.xml中
protobuf-java的依赖项 - 为
protobuf-java-util排除protobuf-java的传递依赖,避免间接引入重复类
修改后的依赖片段:
<dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-javalite</artifactId> <version>3.24.2</version> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java-util</artifactId> <version>3.24.2</version> <exclusions> <exclusion> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> </exclusion> </exclusions> </dependency>
2. 配置ProGuard规则排除冲突类
若必须保留两个依赖(不推荐),可在项目的proguard.cfg中添加规则,跳过冲突类的检查:
# 忽略Protobuf相关警告 -dontwarn com.google.protobuf.** # 保留轻量版Protobuf的所有类 -keep class com.google.protobuf.javalite.** { *; } # 排除标准版Protobuf的冲突类 -dontkeep class com.google.protobuf.AbstractMessageLite$Builder$LimitedInputStream
3. 调整compliance-check插件的排除规则
无需完全移除compliance-check,可在插件配置中排除重复的Protobuf jar包,在pom.xml的Codename One Maven插件中添加:
<plugin> <groupId>com.codenameone</groupId> <artifactId>codenameone-maven-plugin</artifactId> <!-- 其他原有配置 --> <configuration> <complianceCheck> <exclusions> <exclusion>com.google.protobuf:protobuf-java</exclusion> </exclusions> </complianceCheck> </configuration> </plugin>
4. 清理Maven本地缓存
本地仓库的损坏jar包也可能导致重复条目错误,执行命令强制更新依赖:
mvn clean install -U
内容的提问来源于stack exchange,提问作者stylsy
相关产品推荐
相关产品推荐

