Proguard Maven Plugin未使用指定版本导致类版本不兼容报错如何解决
解决方法
问题根因
你当前使用的2.0.14版本proguard-maven-plugin内置了低版本Proguard,你将proguard-base依赖声明在项目全局<dependencies>节点中无法覆盖插件自身的依赖,同时该版本插件的<proguardVersion>参数优先级不足,导致实际运行时还是使用内置的旧版Proguard,最高仅支持Java 8(类版本号52.0),无法处理Java 10编译的54.0版本类。
修复步骤
- 移除项目全局
<dependencies>中声明的proguard-base依赖 - 将proguard-base依赖声明到proguard-maven-plugin的内部
<dependencies>节点下,覆盖插件内置的Proguard版本
修改后的pom.xml配置示例
<plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.0.14</version> <!-- 插件内部依赖,覆盖内置Proguard版本 --> <dependencies> <dependency> <groupId>net.sf.proguard</groupId> <artifactId>proguard-base</artifactId> <version>6.2.2</version> <scope>runtime</scope> </dependency> </dependencies> <executions> <execution> <phase>package</phase> <goals> <goal>proguard</goal> </goals> <configuration> <injar>${project.build.finalName}-jar-with-dependencies.jar</injar> <proguardVersion>6.2.2</proguardVersion> <options> <option>-allowaccessmodification</option> <option>-dontoptimize</option> <option>-dontshrink</option> <option>-dontnote</option> <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option> <option>-flattenpackagehierarchy ''</option> <option>-dontwarn</option> <option>-keepattributes Signature</option> <option>-keep public class com.myproject.** { *; }</option> <option>-keepclassmembernames class * { @javafx.fxml.FXML *; }</option> </options> <libs> <lib>${java.home}/lib/rt.jar</lib> <lib>${java.home}/lib/jfxrt.jar</lib> </libs> </configuration> </execution> </executions> </plugin>
补充说明
如果修改后仍然存在版本不匹配问题,可以升级proguard-maven-plugin到更高的稳定版本,对高版本Proguard的适配性更好。如果后续需要处理更高版本Java编译的类,也可以将Proguard版本升级到7.x系列,支持到最新的Java版本。
内容的提问来源于stack exchange,提问作者DeveloperKurt
相关产品推荐
相关产品推荐

