项目混淆

ProGuard 是一个混淆代码的开源项目,它的主要作用是混淆代码,ProGuard 包括以下 4 个功能:

  • 压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute)

  • 优化(Optimize):对字节码进行优化,移除无用的指令

  • 混淆(Obfuscate):使用 a,b,c,d 这样简短而无意义的名称,对类、字段和方法进行重命名

  • 预检(Preveirfy):在 Java 平台上对处理后的代码进行预检,确保加载的 class 文件是可执行的

使用 proguard 混淆代码只能增加阅读和理解的难度, 并不能百分百保证代码安全。常用的应用场景是项目需要部署到客户机器上,一定程度上防止代码泄露

具体实现

1.在原本的SpringBoot项目的pom.xml文件里面加上以下配置

    <!--经过修改后,能够混淆的build段--><build><plugins><!--maven打包插件--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.0.2</version><configuration><archive><manifest><addClasspath>true</addClasspath><mainClass>com.mmg.Main</mainClass> <!-- 此处为主入口--></manifest></archive></configuration></plugin><!--proguard混淆插件--><plugin><groupId>com.github.wvengen</groupId><artifactId>proguard-maven-plugin</artifactId><version>2.5.3</version><executions><execution><!--打包的时候开始混淆--><phase>package</phase></execution></executions><configuration><proguardVersion>${proguard.version}</proguardVersion><injar>${project.build.finalName}.jar</injar><!--输出的jar--><outjar>${project.build.finalName}.jar</outjar><!--是否混淆--><obfuscate>true</obfuscate><proguardInclude>${basedir}/proguard.cfg</proguardInclude><options><!--默认开启,不做收缩(删除注释、未被引用代码)--><option>-dontshrink</option><!--默认是开启的,这里关闭字节码级别的优化--><option>-dontoptimize</option><!--对于类成员的命名的混淆采取唯一策略--><option>-useuniqueclassmembernames</option><!--混淆时不生成大小写混合的类名,默认是可以大小写混合--><option>-dontusemixedcaseclassnames</option><!--混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代--><option>-adaptclassstrings</option><!--对异常、注解信息在runtime予以保留,不然影响springboot启动--><option>-keepattributesExceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod</option><!--此选项将保存接口中的所有原始名称(不混淆)--><option>-keepnames interface ** { *; }</option><!--此选项将保存所有软件包中的所有原始接口文件(不进行混淆)--><!--<option>-keep interface * extends * { *; }</option>--><!--此选项将保留所有原始方法参数,controller如果参数也混淆会导致传参映射不上  --><option>-keepparameternames</option><!--保留枚举成员及方法--><option>-keepclassmembers enum * { *; }</option><!--不混淆所有类,保存原始定义的注释--><!--<option>-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 *;}</option>--><!--忽略warn消息--><option>-ignorewarnings</option><!--忽略note消息--><option>-dontnote</option></options><!--java 11--><libs><lib>${java.home}/jmods/</lib></libs><!--java 8--><!-- <libs><lib>${java.home}/lib/rt.jar</lib><lib>${java.home}/lib/jsse.jar</lib></libs>--></configuration><dependencies><dependency><groupId>com.guardsquare</groupId><artifactId>proguard-base</artifactId><version>7.2.1</version></dependency></dependencies></plugin><!--将自己加入的jar也打包插件 可加可不加--><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><archive><manifest><mainClass>com.mmg.Main</mainClass></manifest><manifestEntries><Class-Path>.</Class-Path></manifestEntries></archive><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>

2.在与pom.xml文件同级目录下新建一个proguard.cfg文件,这个文件是混淆的核心配置文件,根据需求进行配置

#所有类(包括接口)的方法参数不混淆(包括没被keep的),如果参数混淆了,mybatis的mapper参数绑定会出错(如#{id})
-keepattributes MethodParameters#入口程序类不能混淆,混淆会导致springboot启动不了
-keep class com.langyastudio.edu.admin.Application {public static void main(java.lang.String[]);}#mybatis的mapper/实体类不混淆,否则会导致xml配置的mapper找不到
-keep class com.langyastudio.edu.admin.dao.*
-keeppackagenames com.langyastudio.edu.admin.dao#考虑到scanBasePackages,需要包名不被修改
-keeppackagenames com.langyastudio.edu
-keeppackagenames com.langyastudio.edu.admin.common#一些配置类比如datasource,aopconfig如果混淆会导致各种启动报错
# 比如用@Pointcut("execution(public * com.langyastudio.edu.*.controller..*.*(..))")
# 指定webLog方法对应的@Pointcut作为切入点,所以包的名字不能修改
-keeppackagenames com.langyastudio.edu.*.controller.**
-keep class com.langyastudio.edu.admin.config.*#保留Serializable序列化的类不被混淆
#例如传入/输出的Bean属性
-keepclassmembers class * implements java.io.Serializable {*;}#保留空的构造函数
#-keepclassmembers class com.hacfin.* {
# public <init>(...);
#}

3.点击maven生命周期中的package将项目进行打包,然后点击maven插件中的proguard插件对打出来的jar进行混淆。值得注意的是,如果你使用将自己加入的jar也打包插件,他会把加入自己jar包的命名为xxxxx-jar-with-dependencies.jar,而混淆只能混淆原jar包,这时候需要你把xxxxx-jar-with-dependencies.jar修改为正常打包出来的jar名字(xxx-1.0-SNAPSHOT),不然会混淆不了

项目瘦身

什么是瘦身?

瘦身: thin Body 又称 "减肥"、"减重"。 就是合理、科学的减轻自身重量的。SpringBoot 应用瘦身顾名思议:就是将 SpringBoot 应用打包的 jar 利用合理的方式、方法减小体积。

为什么要瘦身?

场景: 现有的应用开发中,不论是单体架构、微服务架构,如果项目采用的是 springboot、springcloud 来作为底层框架,打包时最终都会以jar包的方式打包、部署。这是就会面临一个问题,就是 jar 包非常大,单体应用还好,但是如果是微服务就非常痛苦,几十个微服务就要拆分打包几十个 jar 包,每个 jar 包都很大(几百M),合起来就好几个 GB,非常占用空间。如果是内网部署,遇到动辄GB的升级包还能勉强接受,最多就是运维心里默默地吐槽一下,但是如果在外网云环境、或者客户现场,那令人痛不欲生的带宽加上各种网络转换限制,运维心里各种

Maven项目混淆、瘦身、打包exe相关推荐

  1. spring boot项目精简瘦身打包

    1.背景介绍 当网络不是很给力的时候,一个大的jar包传输是费时的,往往存在修改1分钟,传包10分钟的尴尬时刻. 1)正常打包出来的jar 2)解压出来后的包大小98M 3)lib的jar包大小 综上 ...

  2. Maven打包(瘦身打包部署),不包含第三方依赖jar包

    方式1 pom 配置 <properties><startClass>com.answer.jaemon.Application</startClass> < ...

  3. springboot项目推荐的打包方式以及springboot项目的瘦身!!!!

    1.springboot项目推荐的打包方式 springboot有两种打包方式,分别是打包成war包和打包成jar包.打包成war包放在tomcat的webapp目录下,随着tomcat的启动,即可访 ...

  4. maven jar包瘦身

    springCloud项目系统瘦身记录 第一章 **尝试spring-boot-thin-launcher** Spring Boot项目可以通过spring-boot-maven-plugin插件打 ...

  5. springboot瘦身打包

    为什么瘦身打包:Spring Boot把整个项目打包成一个可运行的Jar包(即所谓的Fat Jar),导致了这个Jar包很大(通常有40M+).如今迭代发布时常有的事情,每次都上传一个如此庞大的文件, ...

  6. Spring Boot Gradle 瘦身打包 thinJar,分离 lib jar 依赖

    原文地址:weiku.co/article/135/ ,欢迎转载 需求背景: srping boot 2.0+ 打包生产的 fat jar 虽然部署起来很方便,但将所有依赖都打包到一个 jar 包中使 ...

  7. Springboot 瘦身打包

    分离 lib 依赖和资源文件 在实际生产过程中,常常会遇到资源打包文件太大,在部署的时候很不方便,传统的打包方式会将所有的文件(jar 和 资源配置文件)都打包在了一个 jar 文件中,这样后期在修改 ...

  8. SpringBoot瘦身打包部署

    一.前言 最近做的项目由于引入第三方库导致在运行mvn clean package 打jar时,编译出来的 Jar 包很大(服务器多达500MB). 二.瘦身前的Jar包 SpringBoot编译出来 ...

  9. ASP.NET Core 3.0 项目开始“瘦身”

    新的 ASP.NET Core 项目使用名为Microsoft.AspNetCore.App的综合包.该包也可以称为"ASP.NET Core 共享框架",其背后的基本思想是,包括 ...

最新文章

  1. IDC数据中心机房该如何节能
  2. 如何修改Vue打包后文件的接口地址配置
  3. ceph rgw java_ceph rgw multisite基本用法
  4. ZOJ 3631 Watashi's BG
  5. C/C++编程操作Redis数据库,hiredis包装redis数据库操作接口及测试(增删改查与连接)
  6. pycharm vim 插件IdeaVIM
  7. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
  8. 数组最大子数组和(续)之动态规划
  9. 经典的HTML5游戏及其源码分析
  10. VS2013密钥 VS2013专业版密钥 VS2013旗舰版密钥
  11. excel服务器导出文件,excel服务器导出文件夹
  12. MSP430开发环境配置
  13. 使用“#define _GNU_SOURCE” 是什么意思?
  14. linux dolphin模拟器,dolphin模拟器32位64位
  15. Pollard-Rho Algorithm简述
  16. Cairo学习(一)
  17. 学习VR技术要学哪些内容?VR全景如何制作?
  18. python:水果与设计模式-原型模式
  19. 单纯形法和单纯形表法
  20. 怎样记账简单明白,实用记账技巧

热门文章

  1. 九味羌活汤的理解---王幸福
  2. 从LFS到BLFS轻松上手
  3. Jmeter性能监控(一)
  4. php运算符取整_PHP运算符及php取整函数
  5. Linux 命令行与shell编程 第10章 构建基本脚本
  6. 【flask】04.wtf表单的全部用法实现
  7. 变量液压马达比例控制器
  8. Ubuntu20.04安装docker简易教程
  9. Access 类型转换函数
  10. Magento 账单地址里要去掉某些州