springboot的maven多模块如何混淆jar包

springboot的maven多模块如何混淆jar包

    • 一.简介
    • 二. 示例
      • 2.1 基本配置
      • 2.2 结果
    • 三. 错误
      • 3.1 错误1
      • 3.2 错误2
    • 四. 参考文章

前言
这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。
作者:神的孩子都在歌唱

一.简介

proguard 是广为使用的混淆工具之一:

  • 它检测并删除未使用的类、字段、方法和属性。
  • 它优化字节码并删除未使用的指令。
  • 它使用简短的无意义名称重命名其余的类、字段和方法。

springboot可以使用proguard-maven-plugin 这个插件 在 pom.xml 中自定义proguard 的指令,本文基于 springboot + maven + proguard 的maven多模块架构进行代码混淆。

二. 示例

我的项目模块如下

chen-common  --公共模块
chen-start  --启动模块 里面有启动类ChenApplication
chen-system --逻辑处理模块

2.1 基本配置

你需要在你的启动类模块的pom.xml文件中添加如下配置,具体的配置解释可以去proguard-maven-plugin 官方文档了解

    <build>
        <finalName>cyz_navigate</finalName>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <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>
                    <!-- 防止本地编译的时候路径太长编译失败-->
                    <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>
                    <!--                    子模块-->
                    <assembly>
                        <inclusions>
                            <inclusion>
                                <groupId>com.chen</groupId>
                                <artifactId>chen-system</artifactId>
                            </inclusion>
                            <inclusion>
                                <groupId>com.chen</groupId>
                                <artifactId>chen-common</artifactId>
                            </inclusion>
                        </inclusions>
                    </assembly>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>com.guardsquare</groupId>
                        <artifactId>proguard-base</artifactId>
                        <version>7.1.0</version>
                        <scope>runtime</scope>
                    </dependency>
                    <dependency>
                        <groupId>com.guardsquare</groupId>
                        <artifactId>proguard-core</artifactId>
                        <version>7.1.0</version>
                        <scope>runtime</scope>
                    </dependency>
                </dependencies>
            </plugin>
            <!--  proguard 代码混淆配置  结束-->

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
                    <mainClass>
                        com.chen.ChenApplication
                    </mainClass>
                    <excludeGroupIds>com.chen</excludeGroupIds>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        
        </plugins>
    </build>

编写proguard.cfg文件,需要放在和启动类的pom.xml同级

image-20240308155430071

#指定Java的版本
-target 1.8
#proguard会对代码进行优化压缩,他会删除从未使用的类或者类成员变量等
-dontshrink
#是否关闭字节码级别的优化,如果不开启则设置如下配置  不做优化(变更代码实现逻辑)
-dontoptimize
#混淆时不生成大小写混合的类名,默认是可以大小写混合
-dontusemixedcaseclassnames
# 对于类成员的命名的混淆采取唯一策略
-useuniqueclassmembernames
#混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代
-adaptclassstrings
#保持目录结构
-keepdirectories
#对异常、注解信息予以保留
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod,Qualifier
# 此选项将保存接口中的所有原始名称(不混淆)-->
#-keepnames interface ** { *; }

# 此选项将保存所有软件包中的所有原始接口文件(不进行混淆)
#-keep interface * extends * { *; }
#保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数
-keepparameternames
# 保留枚举成员及方法
#-keepclassmembers enum * { *; }
# 不混淆所有类,保存原始定义的注释-
-keepclassmembers class * {
                        @org.springframework.context.annotation.Bean *;
                        @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 *;
                        @org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration *;
                        @org.springframework.boot.context.properties.ConfigurationProperties *;
                        @org.springframework.web.bind.annotation.RestController *;
                        @org.springframework.beans.factory.annotation.Qualifier *;
                        @io.swagger.annotations.ApiParam *;
                        @org.springframework.validation.annotation.Validated *;
                        @io.swagger.annotations.ApiModelProperty *;
                        @javax.validation.constraints.NotNull *;
                        @javax.validation.constraints.Size *;
                        @javax.validation.constraints.NotBlank *;
                        @javax.validation.constraints.Pattern *;

                        }
-keep class org.springframework.** {*;}
-keep public class ch.qos.logback.**{*;}
-keep class com.fasterxml.jackson.** { *; }

#忽略warn消息
-ignorewarnings
#打印配置信息
-printconfiguration

#入口程序类不能混淆,混淆会导致springboot启动不了
-keep public class com.chen.ChenApplication { *;}
#mybatis的mapper/实体类不混淆,否则会导致xml配置的mapper找不到 ( 保持该目录下所有类及其成员不被混淆)
-keep class com.chen.system.mapper.** {*;}

# 实体类,枚举方法不能混淆
-keep class com.chen.common.enums.** {*;}
-keep class com.chen.common.domain.** {*;}
# 保留特定框架或库的类,注解类
-keep class com.chen.common.elasticsearch.** { *; }
-keep class com.chen.common.annotation.** {*;}

#还有一些配置类和Bean不能混淆 比如logPointCut   prefix 这些   @Pointcut  @ConfigurationProperties(prefix = "redisson")
-keep class com.chen.common.aspectj.** {*;}

# 全放开
#-keep class com.ugdsec.** {*;}
#保留Serializable序列化的类不被混淆
# controller 层映射前台参数的类、后端返回的 bean 属性类等,不能混淆类的成员属性(如变成 string a;#-keepclassmembers  class * implements java.io.Serializable {*;}
-dontwarn

通过maven clean install 打包完后就可以了,切记一定要通过java -jar跑一下,看能否正常运行

image-20240308170624550

2.2 结果

打开jar包发现文件名都变成了abcd的字母,说明已经混淆成功了

image-20240308164902263

三. 错误

3.1 错误1

com.alibaba.fastjson.JSONException: default constructor not found. class com.ugdsec.lams.admin.audit.plugin.d.a
        at com.alibaba.fastjson.util.JavaBeanInfo.build(JavaBeanInfo.java:574)
        at com.alibaba.fastjson.parser.ParserConfig.createJavaBeanDeserializer(ParserConfig.java:993)
        at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:879)
        at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:584)
        at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:696)
        at com.alibaba.fastjson.JSON.parseObject(JSON.java:394)
        at com.alibaba.fastjson.JSON.parseObject(JSON.java:298)
        at com.alibaba.fastjson.JSON.parseObject(JSON.java:588)
        at com.ugdsec.lams.admin.common.g.f.a.b(FastJsonUtils.java:69)
        at com.ugdsec.lams.admin.audit.plugin.shared.kafka.consumer.KafkaConsumer.beatsUdp(KafkaConsumer.java:110)

代码中使用这种工具类通过反射赋值参数,不能将这个RawMessage混淆,不然找不到

            RawMessage raw = FastJsonUtils.toObject(String.valueOf(rawMessage), RawMessage.class);

给他放开了

-keep class com.ugdsec.lams.admin.audit.plugin.journal.RawMessage {*;}

3.2 错误2

"Name for argument of type [java.lang.Long] not specified, and parameter name information not found in class file either."

这个报错是因为混淆后前端传入参数的值也变了,需要通过@PathVariable指定以下就好

修改前

public ResultData<Boolean> delete(Long id) 

修改后

public ResultData<Boolean> delete(@PathVariable Long id) {

这是个接口,混淆后id就变成其他值了,前端找不到这个值

四. 参考文章

springboot+proguard+maven 实现代码混淆 看这一篇就够了

github文档

作者:神的孩子都在歌唱
本人博客:https://blog.csdn.net/weixin_46654114
转载说明:务必注明来源,附带本人博客连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/454360.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

王道机试C++第6章 数学问题和22年蓝桥杯省赛选择题Day34

6.1 进制转换 二进制数&#xff08;十转二&#xff09; 习题描述 大家都知道&#xff0c;数据在计算机里中存储是以二进制的形式存储的。 有一天&#xff0c;小明学了C语言之后&#xff0c;他想知道一个类型为unsigned int 类型的数字&#xff0c;存储在计算机中的二进制串是…

个人博客系统(测试报告)

一、项目背景 一个Web网站程序&#xff0c;你可以观看到其他用户博客也可以登录自己的账号发布博客&#xff0c;通过使用Selenium定位web元素、操作测试对象等方法来对个人博客系统的进行测试&#xff0c;测试的核心内容有用户登录、博客列表及博客数量的展示、查看全文、写博客…

Vue-Vben-Admin:中大型项目后台解决方案及如何实现页面反向传值

Vue-Vben-Admin&#xff1a;中大型项目后台解决方案及如何实现页面反向传值 摘要&#xff1a; Vue-Vben-Admin是一个基于Vue3.0、Vite、Ant-Design-Vue和TypeScript的开源项目&#xff0c;旨在为开发中大型项目提供一站式的解决方案。它涵盖了组件封装、实用工具、钩子函数、动…

Python逆向:pyc字节码转py文件

一、 工具准备 反编译工具&#xff1a;pycdc.exe 十六进制编辑器&#xff1a;010editor 二、字节码文件转换 在CTF中&#xff0c;有时候会得到一串十六进制文件&#xff0c;通过010editor使用查看后&#xff0c;怀疑可能是python的字节码文件。 三、逆向反编译 将010editor得到…

链路聚合实验(思科)

华为设备参考&#xff1a; 一&#xff0c;技术简介 网络设备的链路聚合技术&#xff08;Link Aggregation&#xff09;是一种将多个物理链路捆绑在一起&#xff0c;形成一个逻辑链路的技术。这样做可以增加带宽、提高可靠性和实现负载均衡。 二&#xff0c;实验目的 橙色的阻…

使用Sourcetree推送本地仓库至远程仓库时报错The host key is not cached for this server

原因是SSH没配置好 点击工具→选项→ 改成OpenSSH&#xff0c;密钥改成配置Git和本地仓库时生成的.ssh文件夹下的id_rsa文件。

Spring boot 集成netty实现websocket通信

一、netty介绍 Netty 是一个基于NIO的客户、服务器端的编程框架&#xff0c;使用Netty 可以确保你快速和简单的开发出一个网络应用&#xff0c;例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程&#xff0c;例如&#xff1a;基于TCP和U…

力扣-[700. 二叉搜索树中的搜索]

递归法 确定递归函数的参数和返回值 递归函数的参数传入的就是根节点和要搜索的数值&#xff0c;返回的就是以这个搜索数值所在的节点。 代码如下&#xff1a; public TreeNode searchBST(TreeNode root, int val) 确定终止条件 如果root为空&#xff0c;返回null&#xff0c…

【前端】HTML常用标签

因为想当个全栈&#xff0c;所以巩固了一下HTML与CSS和JS基础&#xff0c;这一篇博客是HTML部分 文章目录 HTML 基础标签 1HTML 基础框架HTML 基础标签语义标签文本格式化标签div 与 span 标签图像标签超链接特殊字符 基础标签 2 | 表格表格的使用表格标签表格属性表格的头部与…

JavaEE:网络编程

网络编程&#xff1a;通过代码完成基于网络的跨主机通信 跨主机通信方式&#xff1a; 1.TCP/IP网络 2.蓝牙通信 3.近场通信NFC 4.毫米波通信&#xff1a;功率高&#xff0c;带宽高&#xff0c;抗干扰能力差 其中TCP/IP网络是日常编程中最常涉及到的&#xff0c;最通用的跨主机通…

蓝桥杯 2022 dp 背包

蓝桥杯 2022 dp 背包 题目链接&#xff1a; https://www.lanqiao.cn/problems/2186/learning/?subject_code1&group_code4&match_num13&match_flow2&origincup 题目&#xff1a; 代码&#xff1a; #include<bits/stdc.h> using namespace std;#defi…

代码随想录算法训练营第七天| 454.四数相加II、383.赎金信、15.三数之和、18.四数之和

系列文章目录 目录 系列文章目录454.四数相加II使用HashMap法 383.赎金信哈希解法&#xff08;数组&#xff09; 15.三数之和双指针法 18.四数之和双指针法 454.四数相加II 题解&#xff1a;该题和1.两数之和的方法是一样的&#xff0c;这个题的难点在于key和value分别是什么。…

网络建设与运维培训介绍和能力介绍

1.开过的发票 3.培训获奖的证书 4合同签署 5.实训设备

垃圾回收器介绍

java堆内存结构包括&#xff1a;新生代和老年代&#xff0c;其中新生代由一个伊甸区和2个幸存区组成&#xff0c;2个幸存区是大小相同&#xff0c;完全对称的&#xff0c;没有任何差别。我们把它们称为S0区和S1区&#xff0c;也可以称为from区和to区。 JVM的垃圾回收主要是针对…

Spring具体拓展点:后置处理器

一图胜千言 mermaid示例图&#xff1a; #mermaid-svg-YEqFb5JcEk5FWkwO {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YEqFb5JcEk5FWkwO .error-icon{fill:#552222;}#mermaid-svg-YEqFb5JcEk5FWkwO .error-text{fi…

详细分析Mysql中的LOCATE函数(附Demo)

目录 1. 基本概念2. Demo3. 实战 1. 基本概念 LOCATE()函数在SQL中用于在字符串中查找子字符串的位置 它的一般语法如下&#xff1a; LOCATE(substring, string, start)LOCATE()函数返回子字符串在主字符串中第一次出现的位置 如果未找到子字符串&#xff0c;则返回0 具体的…

stm32学习笔记:SPI通信协议原理(未完)

一、SPI简介(serial Peripheral Interface&#xff08;串行 外设 接口&#xff09;) 1、电路模式&#xff08;采用一主多从的模式&#xff09;、同步&#xff0c;全双工 1 所有SPI设备的SCK、MOSI、MISO分别连在一起 2 主机另外引出多条SS控制线&#xff0c;分别接到各从机的S…

数据集成工具 ---- datax 3.0

1、datax: 是一个异构数据源离线同步工具&#xff0c;致力于实现关系型数据库&#xff08;mysql、oracle等&#xff09;hdfs、hive、hbase等各种异构数据源之间的数据同步 2、参考网址文献&#xff1a; https://github.com/alibaba/DataX/blob/master/introduction.mdhttps:/…

代码随想录算法训练营Day46 ||leetCode 139.单词拆分 || 322. 零钱兑换 || 279.完全平方数

139.单词拆分 class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(), wordDict.end());vector<bool> dp(s.size() 1, false);dp[0] true;for (int i 1; i < s.size(); …

【Linux】-Linux下的软件商店yum工具介绍(linux和windows互传文件仅仅一个拖拽搞定!!!!)

目录 1.Linux 软件包管理器yum 1.1快速认识yum 1.2 yumz下载方式&#xff08;如何使用yum进行下载&#xff0c;注意下载一定要是root用户或者白名单用户&#xff08;可提权&#xff09;&#xff09; 1.2.1下载小工具rzsz 1.2.2 rzsz使用 1.2.2查看软件包 1.3软件的卸载 2.yum生…