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

如何用ProGuard Maven插件混淆WAR包(仅指定代码)及解决警告

问题分析与解决方案

为什么会出现大量警告?

  1. 依赖类路径缺失:你的配置仅指定了rt.jar和jce.jar,但WAR包内的第三方依赖(如Spring、MyBatis等)未被加入ProGuard的类路径。ProGuard分析代码时,若找不到这些依赖的字节码,就会抛出“找不到类/方法”的警告。
  2. 规则匹配不精准:!my.package**的写法不符合ProGuard的包匹配规范(正确应为!my.package.**),可能导致部分依赖类的引用未被正确识别,触发不必要的警告。同时-dontskipnonpubliclibraryclassmembers会扫描依赖类的非公共成员,进一步增加警告数量。
  3. 警告范围未限定:-ignorewarnings是全局生效,而你只配置了忽略自有代码的note,依赖类的警告仍会大量触发。

是否需要逐一排查或抑制?

  • 不建议全盘用-ignorewarnings抑制:这会掩盖自有代码的真实问题(如错误引用)。应区分两类警告:
    • 和my.package相关的警告:必须排查,属于自有代码的潜在问题;
    • 依赖类的警告:确认依赖已存在后,可针对性批量抑制,无需逐一排查。

缺失的关键配置调整

针对“仅混淆自有代码、保留所有依赖”的需求,调整配置如下:

1. 自动引入Maven依赖到ProGuard类路径

替换手动指定libs的方式,让插件自动加载项目依赖,解决依赖类找不到的问题:

<configuration>
    <!-- 替换原有libs配置 -->
    <addMavenDependencies>true</addMavenDependencies>
    <addMavenDependenciesFilter>runtime</addMavenDependenciesFilter> <!-- 仅引入runtime依赖 -->
</configuration>

2. 修正保留规则写法

明确只混淆my.package.**下的类,精准保留其他代码:

<options>
    <!-- 正确匹配非自有包,保留所有非自有类 -->
    <option>-keep class !my.package.** { *; }</option>
    <!-- 保留所有接口(若不需要混淆自有接口可保留) -->
    <option>-keep interface * { *; }</option>
    <!-- 仅忽略自有代码的note,依赖类的note自动忽略 -->
    <option>-dontnote !my.package.**</option>
    <!-- 仅忽略依赖类的警告,自有代码警告保留 -->
    <option>-ignorewarnings !my.package.**</option>
</options>

3. 添加WAR包专属配置

WAR包包含WEB-INF目录结构,需添加规则保留配置文件、Servlet相关类:

<options>
    <!-- 保留WEB-INF目录结构和清单文件 -->
    <option>-keepdirectories</option>
    <option>-keepfileswithmanifest</option>
    <!-- 保留Servlet API相关类,避免Web容器加载失败 -->
    <option>-keep class javax.servlet.** { *; }</option>
</options>

4. 移除不必要配置

删除-dontskipnonpubliclibraryclassmembers,该选项会扫描依赖类非公共成员,无意义地增加警告数量。

最终调整后的完整插件配置

<plugin>
    <groupId>com.github.wvengen</groupId>
    <artifactId>proguard-maven-plugin</artifactId>
    <version>${proguard.maven.plugin.version}</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>proguard</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <proguardVersion>${proguard.version}</proguardVersion>
        <injar>${project.build.finalName}.war</injar>
        <outjar>${project.build.finalName}.obfuscated.war</outjar>
        <obfuscate>true</obfuscate>
        <addMavenDependencies>true</addMavenDependencies>
        <addMavenDependenciesFilter>runtime</addMavenDependenciesFilter>
        <options>
            <option>-dontnote !my.package.**</option>

            <option>-dontshrink</option>
            <option>-dontoptimize</option>

            <option>-adaptclassstrings</option>
            <option>-keepattributes
                Signature,
                *Annotation*
            </option>

            <option>-ignorewarnings !my.package.**</option>
            
            <option>-keep class !my.package.** { *; }</option>
            <option>-keep interface * { *; }</option>
            
            <option>-keepdirectories</option>
            <option>-keepfileswithmanifest</option>
            <option>-keep class javax.servlet.** { *; }</option>
        </options>
        <injarNotExistsSkip>true</injarNotExistsSkip>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>com.guardsquare</groupId>
            <artifactId>proguard-base</artifactId>
            <version>${proguard.version}</version>
        </dependency>
    </dependencies>
</plugin>

总结

  1. 警告核心原因是依赖类路径缺失、规则匹配不规范;
  2. 区分自有代码与依赖类警告,前者必须排查,后者可批量抑制;
  3. 关键调整是自动引入Maven依赖、修正包匹配规则、添加WAR专属保留配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 16:15:31