使用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
相关产品推荐
相关产品推荐

