使用ProGuard混淆Maven测试框架时出现错误求助
问题解决:Maven打包时ProGuard找不到Java核心类错误
错误核心
从日志能明确看到,ProGuard无法识别java.lang.Object、java.lang.String这类Java基础类,本质是ProGuard没有正确关联JDK标准库文件,导致无法解析代码里对Java核心API的引用。再加上你的proguard.cfg为空,没有配置必要的处理规则,最终触发打包失败。
解决步骤
1. 修正ProGuard Maven插件配置
修改pom.xml中的proguard-maven-plugin配置,补充JDK标准库引用,同时调整参数避免路径问题:
<build> <plugins> <plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.6.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>proguard</goal> </goals> </execution> </executions> <configuration> <proguardVersion>7.2.2</proguardVersion> <obfuscate>true</obfuscate> <injar>${project.build.finalName}.jar</injar> <outjar>${project.build.finalName}-small.jar</outjar> <proguardInclude>src/main/resources/proguard.cfg</proguardInclude> <!-- 关联Java14模块化标准库 --> <libraryjars>${java.home}/jmods/java.base.jmod</libraryjars> <!-- 自动引入项目依赖 --> <includeDependency>true</includeDependency> <!-- 移除临时目录配置,避免路径异常 --> </configuration> </plugin> </plugins> </build>
注:如果是JDK8及以下版本,把libraryjars路径改为${java.home}/lib/rt.jar即可。
2. 配置proguard.cfg规则
在src/main/resources/proguard.cfg中添加基础规则,确保核心类和入口方法不被混淆:
# 保留主类入口方法,保证打包后可运行 -keep class org.example.Main { public static void main(java.lang.String[]); } # 保留测试类的公开方法(按需调整) -keep class org.example.test { public <methods>; } # 屏蔽Java核心类的警告(确认无依赖问题时使用) -dontwarn java.lang.** -dontwarn java.io.**
3. 修正maven-jar-plugin的位置
你的pom.xml错误地将maven-jar-plugin放在了<dependencies>节点下,它是构建插件,必须移到<build><plugins>中:
<build> <plugins> <!-- 正确配置maven-jar-plugin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <mainClass>org.example.Main</mainClass> </manifest> </archive> </configuration> </plugin> <!-- 上面的proguard插件配置 --> </plugins> </build>
4. 重新执行打包命令
mvn clean package
内容的提问来源于stack exchange,提问作者Dheeraj Kumar Rajak
相关产品推荐
相关产品推荐

