springboot项目中使用ClassFinal 进行代码加密

文章来源原创   作者:临窗旋墨   发布时间:2026-06-30   阅读:12   标签:maven,springboot 分类:系统架构 专题:解决方案

ClassFinal springboot项目中使用ClassFinal 进行代码加密

参见附录中的仓库的 readme 说明

1. ClassFinal 插件作用

用于 SpringBoot(或war等) 项目 class 文件加密 + 防反编译保护

  • 防止 .class 被直接反编译
  • 保护核心业务逻辑
  • 支持 Maven 构建流程自动加密
  • 可对 指定 package + 外部 jar 加密

版本选择

fork版本:com.gitee.lcm742320521/classfinal-maven-plugin:1.4.1

原因:

  • 原版 net.roseboy:classfinal 最高仅 1.2.1
  • 不支持 JDK17 / JDK21
  • fork 版本修复 JDK 高版本兼容问题

2. 父项目配置说明

2.1 基础参数

  1. <!--classfinal 版本 -->
  2. <classfinal.version>1.4.1</classfinal.version>
  3. <!-- 密码: 加密解密使用-->
  4. <classfinal.password>12345678</classfinal.password>
  5. <!--加密的包, 多个逗号分隔-->
  6. <classfinal.packages>cn.xuqiudong.blog</classfinal.packages>
  7. <!--加密的jar包, 多个逗号分隔-->
  8. <classfinal.libjars>
  9. lcxm-basic-framework:3.5.0-jdk21-3.0.0.jar,
  10. lcxm-basic-core:3.5.0-jdk21-3.0.0.jar
  11. </classfinal.libjars>

2.2 pluginManagement

  1. <pluginManagement>
  2. <plugins>
  3. <plugin>
  4. <groupId>com.gitee.lcm742320521</groupId>
  5. <artifactId>classfinal-maven-plugin</artifactId>
  6. <version>${classfinal.version}</version>
  7. <configuration>
  8. <!--加密打包之后pom.xml会被删除,不用担心在jar包里找到此密码-->
  9. <password>${classfinal.password}</password>
  10. <!--需要加密的包, 多个包用逗号分隔-->
  11. <packages>${classfinal.packages}</packages>
  12. <!-- 需要加密的配置文件, 多个文件用逗号分隔 -->
  13. <!--<cfgfiles>application.yml</cfgfiles>-->
  14. <!--<excludes>org.spring</excludes>-->
  15. <!-- 需要加密的jar包, 多个jar包用逗号分隔 -->
  16. <libjars>
  17. ${classfinal.libjars}
  18. </libjars>
  19. </configuration>
  20. <executions>
  21. <execution>
  22. <phase>package</phase>
  23. <goals>
  24. <goal>classFinal</goal>
  25. </goals>
  26. </execution>
  27. </executions>
  28. </plugin>
  29. </plugins>
  30. </pluginManagement>

2.3 profile(用于控制是否启用加密)

  1. <profiles>
  2. <profile>
  3. <id>classfinal</id>
  4. <build>
  5. <plugins>
  6. <plugin>
  7. <groupId>com.gitee.lcm742320521</groupId>
  8. <artifactId>classfinal-maven-plugin</artifactId>
  9. </plugin>
  10. </plugins>
  11. </build>
  12. </profile>
  13. </profiles>

3. 使用方式

3.1 启用加密构建

  1. mvn clean package -Pclassfinal

3.2 输出结果

  1. target/
  2. ├── xxx-encrypted.jar // 加密后的jar
  3. ├── xxx.jar // 原始jar 未加密

3.3 运行方式

  1. java -javaagent:xxx-encrypted.jar="-pwd 12345678" -jar xxx-encrypted.jar"

注意事项:

在 Spring Boot 项目中,classfinal-maven-plugin 需要在 spring-boot-maven-plugin 之后执行。

  • 其当父项目的 profile 中已经声明了 classfinal-maven-plugin 时,子项目激活该 profile 后,执行顺序通常不容易直接判断。

解决方案

  1. 将 classfinal-maven-plugin 只定义在实际启动模块中,并放在 spring-boot-maven-plugin 之后。
  2. 父项目仅通过 pluginManagement 管理公共配置,不直接下发 classfinal 的执行。
  3. 如果无法调整父 profile 结构,可将 classfinal-maven-plugin 的执行阶段从 package 改为 verify,避免早于 spring-boot:repackage 执行。
    (此时打包则 需要先mvn package, 再执行一次mvn verify )

  4. 或者直接在具体的项目内的springboot插件下新增classfinal插件, 因为package只会多出个加密的jar,按需使用即可

附录:


发表评论

目录