编译
简略就是把代码跑一哈,而后咱们的代码 .java文件 就被编译成了 .class 文件
反编译
就是针对编译生成的 jar/war 包 外面的 .class 文件 逆向还原回来,能够看到你的代码写的啥。
比拟罕用的反编译工具 JD-GUI ,间接把编译好的jar丢进去,大部分都能反编译看到源码:
那如果不想给他人反编译看本人写的代码呢?
怎么做?
混同
该篇玩的代码混同 ,是其中一种伎俩。
我给你看,但你反编译看到的不是真正的代码。
先看一张成果示例图 :
开搞
注释
先看一下咱们混同一个我的项目代码,要做啥?
一共就两步
举荐一个开源收费的 Spring Boot 最全教程:
https://github.com/javastacks/spring-boot-best-practice
第一步, 在我的项目门路下,新增一份文件 proguard.cfg :
proguard.cfg
#指定Java的版本-target 1.8#proguard会对代码进行优化压缩,他会删除从未应用的类或者类成员变量等-dontshrink#是否敞开字节码级别的优化,如果不开启则设置如下配置-dontoptimize#混同时不生成大小写混合的类名,默认是能够大小写混合-dontusemixedcaseclassnames# 对于类成员的命名的混同采取惟一策略-useuniqueclassmembernames#混同时不生成大小写混合的类名,默认是能够大小写混合-dontusemixedcaseclassnames#混同类名之后,对应用Class.forName('className')之类的中央进行相应代替-adaptclassstrings#对异样、注解信息予以保留-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod# 此选项将保留接口中的所有原始名称(不混同)-->-keepnames interface ** { *; }# 此选项将保留所有软件包中的所有原始接口文件(不进行混同)#-keep interface * extends * { *; }#保留参数名,因为控制器,或者Mybatis等接口的参数如果混同会导致无奈承受参数,xml文件找不到参数-keepparameternames# 保留枚举成员及办法-keepclassmembers enum * { *; }# 不混同所有类,保留原始定义的正文--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 *; }#疏忽warn音讯-ignorewarnings#疏忽note音讯-dontnote#打印配置信息-printconfiguration-keep public class com.example.myproguarddemo.MyproguarddemoApplication { public static void main(java.lang.String[]); }
留神点:
其余的看正文,能够配置哪些类不参加混同,哪些枚举保留,哪些办法名不混同等等。
第二步,在pom文件上 退出proguard 混同插件 :
build标签外面改变退出一下配置:
<build> <plugins> <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 --> <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> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <mainClass>com.example.myproguarddemo.MyproguarddemoApplication</mainClass> </configuration> </execution> </executions> </plugin> </plugins></build>
留神点:
而后能够看到:
而后点击package,失常执行编译打包流程就能够 :
而后能够看到jar的生成:
看看成果:
好了,该篇就到这。
本文链接:https://blog.csdn.net/qq_35387940/article/details/127426354
近期热文举荐:
1.1,000+ 道 Java面试题及答案整顿(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!
5.《Java开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞+转发哦!