OpenJDK 11与ProGuard 7.3.2构建时类找不到及重复类问题求助
OpenJDK 11 + ProGuard 7.3.2 构建问题排查
问题现象
构建时出现两类核心问题:
- 重复类定义提示:大量
jdk.internal.jrtfs和jdk.internal.jimage包下的类被标记为重复定义,共57个类。 - 依赖类/方法找不到:
com.test.UtilPanel和com.test.Utils中无法找到Swing、AWT相关的类(如javax.swing.JFrame)及方法(如getContentPane())。
已尝试两种Ant配置但未解决:
- 配置1:直接引入JMOD文件,添加
jarfilter="!**.jar"和filter="!module-info.class" - 配置2:引入
java-rt-jar-stubs-1.5.0.jar
问题原因分析
重复类问题:
- 配置中的
jarfilter="!**.jar"是错误的。JMOD文件中的类直接存储在classes/目录下,而非内嵌JAR,该过滤规则会干扰ProGuard对JMOD内类的正常读取,可能导致类被重复加载。 - 构建路径中可能存在重复的JDK类来源(如残留的旧版
rt.jar),与JMOD中的类产生冲突。
- 配置中的
依赖缺失问题:
java-rt-jar-stubs-1.5.0.jar版本过于老旧,仅适配JDK 1.5,完全不匹配JDK 11的类结构,无法提供Swing/AWT等类的正确定义。- 配置1中的
jarfilter阻止了ProGuard读取java.desktop.jmod内的Swing/AWT类,导致依赖无法解析。
解决方案
1. 修正JMOD配置,解决重复类
移除jarfilter="!**.jar",让ProGuard正确读取JMOD内的类:
<libraryjar file="/opt/jdk-11/jmods/java.base.jmod" filter="!module-info.class" /> <libraryjar file="/opt/jdk-11/jmods/java.desktop.jmod" filter="!module-info.class" /> <libraryjar file="/opt/jdk-11/jmods/java.management.jmod" filter="!module-info.class" />
同时清理构建目录,检查是否存在旧版JDK JAR(如rt.jar),确保构建路径仅包含JDK 11的JMOD文件。
2. 替换老旧stub包,修复依赖缺失
完全弃用java-rt-jar-stubs-1.5.0.jar,依赖JDK 11的java.desktop.jmod提供Swing/AWT类定义,上述修正后的JMOD配置已包含该模块。
3. 添加ProGuard Keep规则(可选)
为避免Swing相关类被ProGuard误移除,添加以下规则:
-keep class javax.swing.** { *; } -keep class java.awt.** { *; } -keep class javax.swing.event.** { *; } -keep class javax.swing.text.** { *; }
4. 验证构建
清理构建缓存后重新执行Ant构建,检查是否仍有重复类提示及依赖缺失错误。
内容的提问来源于stack exchange,提问作者user4888455
相关产品推荐
相关产品推荐

