You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 08:19:54