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

如何用ProGuard混淆Spring Boot应用?运行Jar遇压缩异常

解决ProGuard混淆Spring Boot Jar后运行时嵌套Jar压缩的问题

这个错误我之前帮朋友排查过,本质是Spring Boot的可执行Jar对内部嵌套的依赖Jar有严格要求——必须以未压缩(存储)的方式存在,而ProGuard默认会对所有文件进行压缩处理,刚好踩中了这个坑。

下面给你几个靠谱的解决步骤:

1. 修改ProGuard配置,禁用压缩并保留目录结构

在你的ProGuard配置(不管是单独的proguard.cfg还是pom.xml里的插件配置)中,添加两个关键参数:

如果是在pom.xml的proguard-maven-plugin里配置,示例如下:

<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>
        <injar>${project.build.finalName}.jar</injar>
        <outjar>${project.build.finalName}-obfuscated.jar</outjar>
        <options>
            <!-- 必须保留Spring Boot的入口类 -->
            -keep public class com.yourpackage.YourApplication {
                public static void main(java.lang.String[]);
            }
            <!-- 核心:禁止压缩所有文件,包括嵌套的依赖Jar -->
            -dontcompress
            <!-- 保留Jar内的目录结构,确保Spring Boot Loader能找到嵌套Jar -->
            -keepdirectories
            <!-- 补充:保留Spring和JPA相关的核心类,避免混淆后功能异常 -->
            -keep @org.springframework.stereotype.Component class *
            -keep @org.springframework.data.jpa.repository.Repository class *
            -keepclassmembers class * {
                @javax.persistence.* *;
            }
            <!-- 必须保留Spring Boot Loader的所有类,否则无法启动 -->
            -keep class org.springframework.boot.loader.** { *; }
        </options>
        <libs>
            <lib>${java.home}/lib/rt.jar</lib>
            <lib>${java.home}/lib/jce.jar</lib>
        </libs>
    </configuration>
</plugin>

这里重点说下两个关键参数:

  • -dontcompress:直接告诉ProGuard不要对任何输入文件(包括嵌套Jar)进行压缩,保持原始的存储状态。
  • -keepdirectories:确保Jar内的目录结构不被破坏,Spring Boot Loader依赖这个结构定位嵌套的依赖Jar。

2. 调整打包顺序(如果需要)

如果你的项目是先通过spring-boot-maven-plugin生成可执行Jar,再用ProGuard处理,一定要确保ProGuard是基于已生成的Spring Boot可执行Jar进行混淆,而不是重新打包整个项目。这样能最大程度保留Spring Boot的Jar结构。

3. 验证处理后的Jar状态

混淆完成后,你可以用命令jar tf your-obfuscated.jar查看内部lib目录下的依赖Jar,或者用解压工具打开Jar文件,检查这些嵌套Jar的压缩状态——如果显示为“存储”而非“已压缩”,就说明配置生效了。这时候再运行Jar,应该就能正常启动了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:40:30