1. 背景
在交付 Spring Boot 项目时,JAR 包很容易被反编译工具(如 JD-GUI、FernFlower)直接打开,业务代码、配置文件中的数据库密码、云密钥等敏感信息将暴露无遗。为了提升代码被逆向分析的难度,我们需要对 JAR 包进行加密。
本文介绍一款简单易用的开源工具 ------ ClassFinal,它通过 Java Agent 机制在类加载时解密,可清空方法体或整体加密,同时支持配置文件保护。我们将以一个真实的多模块 Spring Boot 项目为例,完整演示集成、打包、运行的全过程,并解决常见坑点。
2. ClassFinal 简介
ClassFinal 是一个 Java 字节码加密工具,支持:
-
方法体清空 :保留类结构和方法签名,但方法内代码被替换为
return或throw,反编译后看不到任何业务逻辑。 -
配置文件加密 :对
application.yml等配置文件内容进行加密,运行时自动解密。 -
机器绑定:可绑定 CPU、主板等硬件信息,防止 JAR 包被复制到其他机器运行。
原理 :在打包阶段修改 Class 文件,并在启动时通过 -javaagent 参数注入解密逻辑,解密发生在内存中,不影响运行性能。
3. 环境准备
-
JDK 1.8+
-
Maven 3.x
-
Spring Boot 2.5.x(其他版本亦可)
4. 集成 ClassFinal 插件
假设你的项目是一个多模块 Maven 工程,最终可执行 JAR 由 job-admin 模块产生。不要 在父 POM 中配置 ClassFinal,否则会因父模块不生成 JAR 而报错 jar/war文件格式有误。
4.1 在 ruoyi-admin/pom.xml 中添加插件
bash
<build>
<plugins>
<!-- Spring Boot 打包插件(必须放在 ClassFinal 之前) -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- ClassFinal 加密插件 -->
<plugin>
<groupId>net.roseboy</groupId>
<artifactId>classfinal-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<!-- 加密密码,生产环境建议从环境变量读取 -->
<password>${env.CLASSFINAL_PWD}</password>
<!-- 需要加密的包名(业务代码根包) -->
<packages>com.gig.**</packages>
<!-- 需要加密的配置文件(多个用逗号分隔) -->
<cfgfiles>application.yml,application-dev.yml,application-prod.yml,application-druid.yml</cfgfiles>
<!-- 是否开启调试模式 -->
<debug>false</debug>
<!-- 是否绑定机器(可选) -->
<!-- <bind>true</bind> -->
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>classFinal</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
关键点:
-
packages:支持通配符,com.gig.**会加密该包及其子包下的所有类。 -
cfgfiles:列出所有需要保护的配置文件。必须显式列出,否则文件将保持明文(初学者常犯的错误)。 -
password:建议通过环境变量传入,避免硬编码在 POM 中。
4.2 设置环境变量(或直接写死测试)
在打包前导出密码:
bash
# Linux/Mac
export CLASSFINAL_PWD=abcd2026
# Windows (cmd)
set CLASSFINAL_PWD=abcd2026
5. 打包与加密
在项目根目录执行:
bash
mvn clean package -pl ruoyi-admin -am
-pl job-admin -am 表示只构建 job-admin 模块及其依赖的模块。打包成功后,在 job-admin/target/ 目录下会生成两个 JAR:
-
ruoyi-admin-3.9.0.jar(原始包,可删除) -
ruoyi-admin-3.9.0-encrypted.jar(加密后的可运行包)
6. 运行加密后的 JAR
6.1 Windows 环境(CMD)
bash
正确的 Windows 命令写法
java "-javaagent:ruoyi-admin-encrypted.jar=-pwd abcd2026" -jar ruoyi-admin-encrypted.jar
6.2 Linux / Mac 环境
bash
Linux 命令写法
java -javaagent:ruoyi-admin-encrypted.jar='-pwd abcd2026' -jar ruoyi-admin-encrypted.jar
java -javaagent:ruoyi-admin-encrypted.jar="-pwd abcd2026" -jar ruoyi-admin-encrypted.jar
nohup java -javaagent:ruoyi-admin-encrypted.jar='-pwd abcd2026' -jar ruoyi-admin-encrypted.jar > app.log 2>&1 &
6.4 验证加密效果
用解压工具打开加密后的 JAR,查看 BOOT-INF/classes/ 下的配置文件:
bash
application.yml -> classfinal:U2FsdGVkX18Kj7vZ...
再反编译一个业务 Controller,方法体内只剩 return null;。



