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

Spring Boot项目ProGuard混淆后WAR包缺失自有类问题求助

解决Spring Boot项目ProGuard混淆后WAR包缺失自有类的问题

1. 修正ProGuard的类保留规则

ProGuard默认会移除未被直接引用的类,但Spring Boot大量依赖注解反射加载类,必须显式指定保留规则:

  • 保留Spring Boot启动类:
    -keep class com.yourpackage.YourApplication {
        public static void main(java.lang.String[]);
    }
    
  • 保留所有带Spring核心注解的类:
    -keep @org.springframework.stereotype.Component class *
    -keep @org.springframework.stereotype.Service class *
    -keep @org.springframework.stereotype.Controller class *
    -keep @org.springframework.boot.autoconfigure.SpringBootApplication class *
    
  • 保留实体类、DTO类(避免序列化/反序列化失败):
    -keep class com.yourpackage.entity.** { *; }
    -keep class com.yourpackage.dto.** { *; }
    
  • 保留配置类及Bean定义类:
    -keep @org.springframework.context.annotation.Configuration class *
    -keepclassmembers class * {
        @org.springframework.context.annotation.Bean *;
    }
    

2. 调整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>
        <!-- 指向maven-war-plugin生成的原始WAR包 -->
        <injar>${project.build.finalName}.war</injar>
        <outjar>${project.build.finalName}-obfuscated.war</outjar>
        <proguardInclude>${project.basedir}/proguard-rules.pro</proguardInclude>
        <!-- 明确引入依赖库,避免ProGuard误删依赖相关类 -->
        <libraryjars>
            <path>${java.home}/lib/rt.jar</path>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- 其他项目依赖 -->
        </libraryjars>
        <!-- 先关闭压缩/优化,验证是否是规则导致类被移除 -->
        <options>
            <option>-dontshrink</option>
            <option>-dontoptimize</option>
        </options>
    </configuration>
</plugin>

3. 确认插件执行顺序

即使移除spring-boot-maven-plugin的repackage配置,也要保证插件执行顺序正确:

  • 若保留spring-boot-maven-plugin,需让ProGuard在repackage目标之后执行,确保处理的是完整的Spring Boot包
  • 若删除repackage,需确保maven-war-plugin正常打包项目类后,再由ProGuard处理:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.3.2</version>
    <configuration>
        <warSourceDirectory>src/main/webapp</warSourceDirectory>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
</plugin>

4. 排查ProGuard日志

执行mvn clean package -X查看详细日志,重点关注:

  • 搜索Reading input...,确认ProGuard是否读取了项目编译后的自有类
  • 查看是否有Note: ... is not used的提示,这类信息说明类被标记为未引用,会被ProGuard移除
  • 检查是否有Warning: ...的警告,比如反射调用的类未被保留

5. 验证中间产物

  • 查看target目录下的原始WAR包(未混淆),确认自有类是否存在
  • 检查target/proguard目录下的临时文件,确认ProGuard是否生成了混淆后的类
  • 若临时文件有类但最终WAR缺失,检查proguard-maven-plugin的<outjar>配置是否正确合并到最终包

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:52:01