技术博客 技术博客
  • JAVA
  • 仓颉
  • 设计模式
  • 人工智能
  • Spring
  • Mybatis
  • Maven
  • Git
  • Kafka
  • RabbitMQ
  • RocketMQ
  • Redis
  • Zookeeper
  • Nginx
  • 数据库套件
  • MySQL
  • Elasticsearch
  • MongoDB
  • Hadoop
  • ClickHouse
  • Hbase
  • Hive
  • Flink
  • Flume
  • SQLite
  • linux
  • Docker
  • Jenkins
  • Kubernetes
  • 工具
  • 前端
  • AI
GitHub (opens new window)
  • JAVA
  • 仓颉
  • 设计模式
  • 人工智能
  • Spring
  • Mybatis
  • Maven
  • Git
  • Kafka
  • RabbitMQ
  • RocketMQ
  • Redis
  • Zookeeper
  • Nginx
  • 数据库套件
  • MySQL
  • Elasticsearch
  • MongoDB
  • Hadoop
  • ClickHouse
  • Hbase
  • Hive
  • Flink
  • Flume
  • SQLite
  • linux
  • Docker
  • Jenkins
  • Kubernetes
  • 工具
  • 前端
  • AI
GitHub (opens new window)
  • JAVA

    • 基础

      • JAVA 锁 及 线程
      • JAVA NIO API
      • JVM 模块介绍
    • 版本

      • JAVA8 新特性总结
      • JAVA9 新特性总结
      • JAVA 10/11/12/13/14/15/16/17 新特性总结
    • 其他

      • jar 打包成.exe可执行文件
      • java代码混淆之 ProGuard
        • 添加依赖
        • 配置ProGuard
      • JAVA 性能监控(jvisualvm)及测试(JMeter)
      • Alibaba Arthas
      • jar启动脚本
  • 仓颉

    • 基础

      • 仓颉介绍
  • 设计模式

    • 代理模式
  • 人工智能

    • 线性回归
    • Pytorch
目录

java代码混淆之 ProGuard

ProGuard 是一个用于 Java 应用程序的代码混淆和优化工具,通常用于 Android 应用程序,但同样适用于 Spring Boot 应用程序。混淆代码可以增强安全性,并减小应用程序的体积。使用 proguard 混淆代码只能增加阅读和理解的难度,并不能百分百保证代码安全。也即是达到让开发人员看到这头痛的代码有 99.99999% 的冲动放弃阅读,拍桌子说还不如我重写一遍逻辑。但是如果一些重要的静态数据依然会暴漏

# 添加依赖

首先,你需要在项目的构建文件(通常是 build.gradle 或 pom.xml)中添加 ProGuard 的依赖。

<!-- 混淆 -->
<plugin>
  <groupId>com.github.wvengen</groupId>
  <artifactId>proguard-maven-plugin</artifactId>
  <version>2.6.0</version>
  <executions>
    <!-- 以下配置说明执行mvn的package命令时候,会执行proguard-->
    <execution>
      <phase>package</phase>
      <goals>
        <goal>proguard</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <!--  CreateProcess error=206, 文件名或扩展名太长 -->
    <putLibraryJarsInTempDir>true</putLibraryJarsInTempDir>
    <!-- 就是输入Jar的名称,我们要知道,代码混淆其实是将一个原始的jar,生成一个混淆后的jar,那么就会有输入输出。 -->
    <injar>${project.build.finalName}.jar</injar>
    <!-- 输出jar名称,输入输出jar同名的时候就是覆盖,也是比较常用的配置。 -->
    <outjar>${project.build.finalName}.jar</outjar>
    <!-- 是否混淆 默认是true -->
    <obfuscate>true</obfuscate>
    <!-- 配置一个文件,通常叫做proguard.cfg,该文件主要是配置options选项,也就是说使用proguard.cfg那么options下的所有内容都可以移到proguard.cfg中 -->
    <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
    <!-- 额外的jar包,通常是项目编译所需要的jar -->
    <libs>
      <lib>${java.home}/lib/rt.jar</lib>
      <lib>${java.home}/lib/jce.jar</lib>
      <lib>${java.home}/lib/jsse.jar</lib>
    </libs>
    <!-- 对输入jar进行过滤比如,如下配置就是对META-INFO文件不处理。 -->
    <inLibsFilter>!META-INF/**,!META-INF/versions/9/**.class</inLibsFilter>
    <!-- 这是输出路径配置,但是要注意这个路径必须要包括injar标签填写的jar -->
    <outputDirectory>${project.basedir}/target</outputDirectory>
    <!--这里特别重要,此处主要是配置混淆的一些细节选项,比如哪些类不需要混淆,哪些需要混淆-->
    <options>
      <!-- 可以在此处写option标签配置,不过我上面使用了proguardInclude,故而我更喜欢在proguard.cfg中配置 -->
    </options>
  </configuration>
</plugin>
<!-- spring,注意一定要放在混淆插件之后 -->
<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
    <excludes>
      <exclude>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
      </exclude>
    </excludes>
  </configuration>
  <executions>
    <execution>
      <!-- spingboot 打包需要repackage否则不是可执行jar -->
      <goals>
        <goal>repackage</goal>
      </goals>
      <configuration>
        <mainClass>com.aizuda.easyManagerTool.ToolBootApplication</mainClass>
      </configuration>
    </execution>
  </executions>
</plugin>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

# 配置 ProGuard

#指定Java的版本
-target 1.8
#proguard会对代码进行优化压缩,他会删除从未使用的类或者类成员变量等
-dontshrink
#是否关闭字节码级别的优化,如果不开启则设置如下配置
-dontoptimize
#混淆时不生成大小写混合的类名,默认是可以大小写混合
-dontusemixedcaseclassnames
# 对于类成员的命名的混淆采取唯一策略
-useuniqueclassmembernames
#混淆时不生成大小写混合的类名,默认是可以大小写混合
-dontusemixedcaseclassnames
#混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代
-adaptclassstrings

#对异常、注解信息予以保留
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
# 此选项将保存接口中的所有原始名称(不混淆)-->
#-keepnames interface ** { *; }
# 此选项将保存所有软件包中的所有原始接口文件(不进行混淆)
#-keep interface * extends * { *; }
#保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数
-keepparameternames
# 保留枚举成员及方法
-keepclassmembers enum * { *; }
# 不混淆所有类,保存原始定义的注释-
-keepclassmembers class * {
    @org.springframework.context.annotation.Bean *;
    @org.springframework.beans.factory.annotation.Autowired *;
    @org.springframework.beans.factory.annotation.Value *;
    @org.springframework.stereotype.Service *;
    @org.springframework.stereotype.Component *;
}

#忽略warn消息
-ignorewarnings
#忽略note消息
-dontnote
#打印配置信息
-printconfiguration
-keep public class com.aizuda.easyManagerTool.ToolBootApplication {
        public static void main(java.lang.String[]);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
上次更新: 6/11/2025, 4:10:30 PM
jar 打包成.exe可执行文件
JAVA 性能监控(jvisualvm)及测试(JMeter)

← jar 打包成.exe可执行文件 JAVA 性能监控(jvisualvm)及测试(JMeter)→

Theme by Vdoing | Copyright © 2023-2025
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式