Maven项目混淆、瘦身、打包exe
项目混淆
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相关推荐
- spring boot项目精简瘦身打包
1.背景介绍 当网络不是很给力的时候,一个大的jar包传输是费时的,往往存在修改1分钟,传包10分钟的尴尬时刻. 1)正常打包出来的jar 2)解压出来后的包大小98M 3)lib的jar包大小 综上 ...
- Maven打包(瘦身打包部署),不包含第三方依赖jar包
方式1 pom 配置 <properties><startClass>com.answer.jaemon.Application</startClass> < ...
- springboot项目推荐的打包方式以及springboot项目的瘦身!!!!
1.springboot项目推荐的打包方式 springboot有两种打包方式,分别是打包成war包和打包成jar包.打包成war包放在tomcat的webapp目录下,随着tomcat的启动,即可访 ...
- maven jar包瘦身
springCloud项目系统瘦身记录 第一章 **尝试spring-boot-thin-launcher** Spring Boot项目可以通过spring-boot-maven-plugin插件打 ...
- springboot瘦身打包
为什么瘦身打包:Spring Boot把整个项目打包成一个可运行的Jar包(即所谓的Fat Jar),导致了这个Jar包很大(通常有40M+).如今迭代发布时常有的事情,每次都上传一个如此庞大的文件, ...
- Spring Boot Gradle 瘦身打包 thinJar,分离 lib jar 依赖
原文地址:weiku.co/article/135/ ,欢迎转载 需求背景: srping boot 2.0+ 打包生产的 fat jar 虽然部署起来很方便,但将所有依赖都打包到一个 jar 包中使 ...
- Springboot 瘦身打包
分离 lib 依赖和资源文件 在实际生产过程中,常常会遇到资源打包文件太大,在部署的时候很不方便,传统的打包方式会将所有的文件(jar 和 资源配置文件)都打包在了一个 jar 文件中,这样后期在修改 ...
- SpringBoot瘦身打包部署
一.前言 最近做的项目由于引入第三方库导致在运行mvn clean package 打jar时,编译出来的 Jar 包很大(服务器多达500MB). 二.瘦身前的Jar包 SpringBoot编译出来 ...
- ASP.NET Core 3.0 项目开始“瘦身”
新的 ASP.NET Core 项目使用名为Microsoft.AspNetCore.App的综合包.该包也可以称为"ASP.NET Core 共享框架",其背后的基本思想是,包括 ...
最新文章
- IDC数据中心机房该如何节能
- 如何修改Vue打包后文件的接口地址配置
- ceph rgw java_ceph rgw multisite基本用法
- ZOJ 3631 Watashi's BG
- C/C++编程操作Redis数据库,hiredis包装redis数据库操作接口及测试(增删改查与连接)
- pycharm vim 插件IdeaVIM
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
- 数组最大子数组和(续)之动态规划
- 经典的HTML5游戏及其源码分析
- VS2013密钥 VS2013专业版密钥 VS2013旗舰版密钥
- excel服务器导出文件,excel服务器导出文件夹
- MSP430开发环境配置
- 使用“#define _GNU_SOURCE” 是什么意思?
- linux dolphin模拟器,dolphin模拟器32位64位
- Pollard-Rho Algorithm简述
- Cairo学习(一)
- 学习VR技术要学哪些内容?VR全景如何制作?
- python:水果与设计模式-原型模式
- 单纯形法和单纯形表法
- 怎样记账简单明白,实用记账技巧