JAVA 部署包混淆 【proguard】

pom.xml引入proguar插件

<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>
      <!-- 就是输入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 jdk11 已经没有了-->
      <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>
              &lt;!&ndash; 可以在此处写option标签配置,不过我上面使用了proguardInclude,故而我更喜欢在proguard.cfg中配置 &ndash;&gt;
          </options>-->
    </configuration>
  </plugin>

引入proguar.cfg文件

这里有些springboot包的混淆被我注释掉了,留下简单的用例,如果你是用springboot架构部署则开起来根据实际引用的包去混淆。

# 指定不警告尚未解决的引用和其他问题
-dontwarn
# JDK目标版本1.8
-target 1.8
# 不做收缩(删除注释、未被引用代码)
-dontshrink
# 不做优化(变更代码实现逻辑)
-dontoptimize
# 混淆时不使用大小写混合,混淆后的类名为小写
-dontusemixedcaseclassnames
# 不去忽略非公共的库类
-dontskipnonpubliclibraryclasses
# 指定不跳过包可见的库类成员(字段和方法)。
# 默认情况下,proguard在解析库类时会跳过包可见的库类成员。当我们确实引用了包可见的类成员时,需要设置此项
-dontskipnonpubliclibraryclassmembers
# 确定统一的混淆类的成员名称来增加混淆
-useuniqueclassmembernames
# 优化时允许访问并修改有修饰符的类和类的成员
-allowaccessmodification
# 不混淆所有包名
#-keeppackagenames
# 需要保持的属性:异常,注解等
#-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod
# spring 相关的注解,不要混淆
#-keepclassmembers class * {
#     @org.springframework.** *;
#     @javax.annotation.PostConstruct *;
#     @javax.annotation.PreDestroy *;
#}
# spring 相关的注解,不要混淆
#-keepclassmembers class * {
#     @org.springframework.beans.factory.annotation.Autowired <fields>;
#     @org.springframework.beans.factory.annotation.Autowired <methods>;
#}
# 不混淆所有的set/get方法
-keepclassmembers public class * {void set*(***);*** get*();}

#混淆时是否记录日志
#-verbose
#忽略warn消息
-ignorewarnings
#忽略note消息
-dontnote
#打印配置信息
-printconfiguration
# 此选项将保存接口中的所有原始名称(不混淆)-->
-keepnames interface ** { *; }
#保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数
-keepparameternames
# 保留枚举成员及方法
-keepclassmembers enum * { *; }

# 不混淆本工程中的部分特殊类
#  -keep class com.lc.device.usedevicecloud.service.OCRService {*;}
# -keep class com.lc.device.usedevicecloud.service.IDCardReadService {*;}

# springboot 不混淆所有包含Component等注解的类
#-keep @org.springframework.stereotype.Component class * {*;}
#-keep @org.springframework.stereotype.Service class * {*;}
#-keep @org.springframework.web.bind.annotation.RestController class * {*;}
#-keep @org.springframework.context.annotation.Configuration class * {*;}
-keep public class com.jm.demo{
    public static void main(java.lang.String[]);
}
# springboot 启动注意类不要混淆了
#-keep public class org.springframework.boot.loader.** {
#    public *;
#}

mvn package

mvn执行可以看到插件正常工作了

混淆后的效果

在这里插入图片描述
添加关注获取用例!!回复 “混淆”
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值