概述
首先感谢俩篇博文博主本文是基于以下俩个博文进行的,楼主也是忙活了大半天整这个混淆,本以为可以快速完成的,没成想耗时耗力。
详细的springboot结合proguard做代码混淆,感谢。
其他博主的踩坑锦集,感谢。
- 踩坑锦集
1.Caused by: org.apache.maven.plugin.MojoExecutionException: Obfuscation failed (result=1)
这个错误最常见 其实使用mvn插件最常见的错误都是这个的,使用插件失败,其实没什么用 可以使用mvn clean package -e -X
看的完整点 最主要的错误在这个异常上面 程序执行proguard插件抛出的异常
2.java.io.IOException: You have to specify '-keep' options for the shrinking step
3. proguard插件版本不兼容问题 百度搜的好多博文因为年代久远会出现版本跟jdk1.8不兼容https://mvnrepository.com
mvn 地址贴出来 方便大家去改最新版
4. 还要好多就不写了直接贴代码 需要更改的地方会加备注
<build>
<!-- 编译后的jar名称 可自定义 -->
<finalName>test-1.2.0-SNAPSHOT</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- 代码混淆插件 -->
<plugin>
<dependencies>
<dependency>
<groupId>net.sf.proguard</groupId>
<artifactId>proguard-base</artifactId>
<!-- 2019年7月15日 jdk1.8 兼容性还可以 -->
<version>6.0.2</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<!-- 2019年7月15日 jdk1.8 兼容性还可以 -->
<version>2.0.14</version>
<executions>
<execution>
<!-- 混淆时刻,这里是打包的时候混淆 -->
<phase>package</phase>
<goals>
<!-- 使用插件的什么功能,当然是混淆 -->
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 是否将生成的PG文件安装部署 -->
<attach>true</attach>
<!-- 是否混淆 -->
<obfuscate>true</obfuscate>
<!-- 指定生成文件分类 -->
<attachArtifactClassifier>pg</attachArtifactClassifier>
<!-- ProGuard配置参数(可引用cfg配置文件) -->
<options>
<!-- JDK目标版本1.8-->
<option>-target 1.8</option>
<!-- 不做收缩(删除注释、未被引用代码) -->
<option>-dontshrink</option>
<!-- 不做优化(变更代码实现逻辑) -->
<option>-dontoptimize</option>
<!-- 不路过非公用类文件及成员 -->
<option>-dontskipnonpubliclibraryclasses</option>
<option>-dontskipnonpubliclibraryclassmembers</option>
<!--不用大小写混合类名机制-->
<option>-dontusemixedcaseclassnames</option>
<!-- 优化时允许访问并修改有修饰符的类和类的成员 -->
<option>-allowaccessmodification</option>
<!-- 确定统一的混淆类的成员名称来增加混淆 -->
<option>-useuniqueclassmembernames</option>
<!-- 不混淆所有包名,整体混淆会出现各种各样的问题 程序又不会把你该引用的地方引用好 会直接修改类名 参数名的 建议不去除 有这个标签的话 <option>-keep class !com.package.** { *; }</option> 加入这个标签的报包名程序才会修改 -->
<option>-keeppackagenames</option>
<option>-adaptclassstrings</option>
<!-- <option>-keepdirectories</option> -->
<!-- 不混淆所有特殊的类 -->
<option>-keepattributes
Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option>
<!-- This option will save all original methods parameters in files defined
in -keep sections, otherwise all parameter names will be obfuscate. -->
<option>-keepparameternames</option>
<option>-keepclassmembers class * {
@org.springframework.beans.factory.annotation.Autowired *;
@org.springframework.beans.factory.annotation.Value *;
}
</option>
<!-- 混淆这个包下的类 此处需要更改为自己需要混淆的包名-->
<option>-keep class !com.package.service.** { *; }</option>
<!-- 不混淆main方法 此处需要更改为自己的启动类路径 -->
<option>-keep class com.package.Application { *; }</option>
<!-- 不混淆所有的set/get方法,毕竟项目中使用的部分第三方框架(例如Shiro)会用到大量的set/get映射 -->
<option>-keepclassmembers public class * {void set*(***);*** get*();}</option>
<!-- 不混淆包中的所有类以及类的属性及方法,实体包,混淆了会导致ORM框架及前端无法识别 -->
<!-- 不对包类的类名进行混淆,但对类中的属性和方法混淆 -->
<!--<option>-keep class com.package.util.** </option>-->
<!-- <option>-keep class com.example.service.** </option>-->
<!-- 不混淆包下的所有类名,且类中的方法和属性也不混淆 楼主已经把它注掉了 因为没用到 -->
<!--<option>-keep class com.example.redis.** { *; }</option>
<option>-keep class com.example.domain.** { *; }</option>
<option>-keep class com.example.dto.** { *; } </option>
<option>-keep class com.example.config.**{ *; }</option>
<option>-keep class com.example.dao.** { *; }</option>-->
<!-- 无视跳过警告 因为修改代码的过程程序检测到有些文件不能更改就会报警告导致失败 如果对自己写的代码比较有信心的话可以直接无视 -->
<option>-dontwarn **</option>
</options>
<!--class 混淆后输出的jar包 -->
<outjar>${project.build.finalName}-pg.jar</outjar>
<!-- 混淆时需要引用的java库,这些库的类不会做混淆 -->
<libs>
<lib>${java.home}/lib/rt.jar</lib>
<lib>${java.home}/lib/jce.jar</lib>
</libs>
<!-- 需要做混淆的jar或目录 -->
<injar>classes</injar>
<!-- 输出目录 -->
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</plugin>
</plugins>
</build>
楼主导入plugins后jar包一些部分标红 idea点击build-> rebuild project 重新变一下试下。其他的编码软件不清楚
然后 需要在同级目录下建个proguard.cfg 文件
里面的内容要跟pom文件对应
pom中option标签中的都要在文本中再体现一次 比如加了
<option>-keep class com.example.domain.** { *; }</option>
文本里就要加-keep class com.example.domain.** { *; }
# JDK目标版本1.8
-target 1.8
# 不做收缩(删除注释、未被引用代码)
-dontshrink
# 不做优化(变更代码实现逻辑)
-dontoptimize
-ignorewarnings
# 不路过非公用类文件及成员
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontusemixedcaseclassnames
# 优化时允许访问并修改有修饰符的类和类的成员
-allowaccessmodification
# 确定统一的混淆类的成员名称来增加混淆
-useuniqueclassmembernames
# 不混淆所有包名,本人测试混淆后WEB项目问题实在太多,毕竟Spring配置中有 大量固定写法的包名
-keeppackagenames
-adaptclassstrings
# -keepdirectories
# 不混淆所有特殊的类
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod
# This option will save all original methods parameters in files defined in -keep sections, otherwise all parameter names will be obfuscate.
-keepparameternames
-keep interface * extends * { *; }
-keepclassmembers class * {
@org.springframework.beans.factory.annotation.Autowired *;
@org.springframework.beans.factory.annotation.Value *;
}
# 混淆这个包下的类 此处需要更改
-keep class !com.package.service.** { *; }
-dontwarn **
# 不混淆main方法
-keep class com.package.Application { *; }
# 不混淆所有的set/get方法,毕竟项目中使用的部分第三方框架(例如Shiro)会用到大量的set/get映射
-keepclassmembers public class * {void set*(***);*** get*();}
# 不对包类的类名进行混淆,但对类中的属性和方法混淆
# 不混淆包下的所有类名,且类中的方法和属性也不混淆
执行mvn clean package
成功后 target目录
classes-pg.jar 是编译后的代码jar war里面的class文件还是没有变动的 ,是先生成的war才执行的mvn插件 可以手动更换。
更换class步骤
- 下载windowsrar
- 打开classes-pg.jar 把里面的文件拽出来 建个文件夹classes
- 打开war 在WEB-INF里面把classes文件替换掉就可以了
最后
以上就是辛勤小猫咪为你收集整理的[进来复制]springboot项目代码混淆,帮你安排的明白的混淆代码!的全部内容,希望文章能够帮你解决[进来复制]springboot项目代码混淆,帮你安排的明白的混淆代码!所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复