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

使用ProGuard混淆胖JAR时出现IncompleteClassHierarchyException错误的解决方法

解决ProGuard混淆Fat Jar时的IncompleteClassHierarchyException错误

错误原因分析

报错提示找不到freemarker.ext.jsp.JspWriterAdapter和java.io.Writer的共同父类,本质是因为JspWriterAdapter继承自javax.servlet.jsp.JspWriter(属于Java EE的Servlet API),而ProGuard在分析类层次时找不到JspWriter类——即便你已经包含了freemarker的jar,这个依赖类并不在freemarker包内,所以ProGuard无法解析继承关系,导致预验证失败。

解决方案

1. 添加Servlet JSP API到ProGuard类路径

在你的Gradle ProGuard任务配置中,明确引入javax.servlet.jsp-api的jar包作为ProGuard的依赖库。如果是通过Gradle依赖管理,可以直接引用该依赖并添加到ProGuard的类路径:

proguard {
    configurations {
        runtimeClasspath {
            resolutionStrategy {
                force 'javax.servlet.jsp:javax.servlet.jsp-api:2.3.3'
            }
        }
    }
    libraryjars configurations.runtimeClasspath.files
    // 其他ProGuard配置...
}

或者如果已经有本地jar包,直接指定路径:

proguard {
    libraryjars file('path/to/javax.servlet.jsp-api-2.3.3.jar')
    // 其他配置...
}

2. 跳过Freemarker相关类的混淆

如果你的业务代码不需要混淆freemarker的类,可以直接添加-keep规则让ProGuard忽略这些类的处理,从根源避免类层次分析错误:

# 保留freemarker所有类和接口
-keep class freemarker.** { *; }
-keep interface freemarker.** { *; }

将这段规则添加到你的ProGuard配置文件(比如proguard-rules.pro)中即可。

3. 检查Fat Jar的打包内容

确认你的fat jar中是否包含javax.servlet.jsp.JspWriter类:如果打包时没有将Servlet JSP API的内容包含进去,要么调整打包任务(比如用Shadow插件时配置包含该依赖),要么确保ProGuard能通过类路径访问到这个类。

内容的提问来源于stack exchange,提问作者Vikas Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:53:24