You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot项目Proguard混淆打包报错:不支持Java版本53.0

解决Proguard不支持Java 9类版本(53.0)的报错问题

首先咱们明确问题根源:你使用的Proguard 5.3.3最高仅支持Java 8的类版本(对应版本号52.0),但项目依赖的log4j包中包含了针对Java 9编译的类文件(版本号53.0,路径为META-INF/versions/9/org/apache/logging/log4j/util/ProcessIdUtil.class),导致Proguard在打包时无法处理这些类,进而触发报错。

下面给你两个最优解决方案,按优先级排序:

方案一:升级Proguard及Maven插件(长期最优解)

Proguard从6.0版本开始正式支持Java 9及以上版本,同时你需要把对应的Maven插件升级到兼容版本(比如proguard-maven-plugin 2.1.0及以上)。

修改你的Maven插件配置如下:

<plugin>
    <groupId>com.github.wvengen</groupId>
    <artifactId>proguard-maven-plugin</artifactId>
    <!-- 升级到支持Proguard 6+的插件版本 -->
    <version>2.1.1</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>proguard</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <!-- 指定使用Proguard 6.2.2版本(可根据需求调整为更高兼容版本) -->
        <proguardVersion>6.2.2</proguardVersion>
        <!-- 你的其他Proguard配置 -->
        <options>
            <option>-keep public class com.yourpackage.MainClass { public static void main(java.lang.String[]); }</option>
            <!-- 其他规则 -->
        </options>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>net.sf.proguard</groupId>
            <artifactId>proguard-base</artifactId>
            <version>6.2.2</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
</plugin>

升级后,Proguard不仅能正确处理Java 9的类文件,还能兼容后续更高版本的Java,是最彻底的解决方式。

方案二:配置Proguard忽略Java 9专属类文件(临时快速解决)

如果暂时不想升级Proguard,也可以通过配置让它跳过META-INF/versions/9/路径下的所有类——这些是log4j为Java 9及以上版本提供的兼容类,在Java 8环境下根本不会被加载,所以忽略它们不会影响项目运行。

修改Maven插件配置,添加过滤规则:

<plugin>
    <groupId>com.github.wvengen</groupId>
    <artifactId>proguard-maven-plugin</artifactId>
    <version>2.0.14</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>proguard</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <!-- 添加过滤规则,排除META-INF/versions/9下的所有类 -->
        <injarFilter>!META-INF/versions/9/**</injarFilter>
        <!-- 你的其他Proguard配置 -->
    </configuration>
</plugin>

或者直接在Proguard的options里添加排除规则:

<options>
    <option>-injars ${project.build.finalName}.jar(!META-INF/versions/9/**)</option>
    <!-- 其他规则 -->
</options>

这样Proguard就会跳过那些不支持的类文件,顺利完成打包。

额外说明

你之前尝试升级到Java 9但失败,是因为Proguard 5.x系列确实不支持Java 9,所以升级Proguard版本才是解决Java版本兼容问题的根本。

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

火山引擎 最新活动