为了防止通过反编译获取源码,可以使用代码混淆来提高代码阅读的成本。
本文使用ProGuard进行混淆,Maven打包时混淆使用的插件:https://github.com/wvengen/proguard-maven-plugin
具体实现
1.在pom plugins中添加混淆插件
<!-- ProGuard混淆插件 -->
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.2.0</version>
<executions>
<execution>
<!-- 混淆时刻,这里是打包的时候混淆 -->
<phase>package</phase>
<goals>
<!-- 使用插件的什么功能,当然是混淆 -->
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 是否将生成的PG文件安装部署 -->
<attach>true</attach>
<!-- 是否混淆 -->
<obfuscate>true</obfuscate>
<!-- 指定生成文件分类 -->
<attachArtifactClassifier>pg</attachArtifactClassifier>
<!-- 混淆配置文件 -->
<proguardInclude>${basedir}/proguard.cfg</proguardInclude>
<injarNotExistsSkip>true</injarNotExistsSkip>
<!-- 要混淆的jar -->
<injar>${project.build.finalName}.jar</injar>
<!--混淆后输出的jar包,会默认生成为*-pg.jar -->
<outjar>${project.build.finalName}.jar</outjar>
<!-- 添加依赖,这里你可以按你的需要修改,这里测试只需要一个JRE的Runtime包就行了 -->
<libs>
<lib>${java.home}/lib/rt.jar</lib>
</libs>
<!-- 输出目录 -->
<outputDirectory>${project.build.directory}/</outputDirectory>
</configuration>
</plugin>2.整理proguard.cfg配置文件
<!-- 下面代码是通过直接配置plugin configuration的options配置,本文中是通过配置文件加载这些配置,这里粘出来是为了让大家了解注释及规则-->
<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>-keeppackagenames</option>-->
<!-- 需要保持的属性:异常,注解等-->
<option>-keepattributes
Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option>
<!-- 不混淆所有的set/get方法->
<!--<option>-keepclassmembers public class * {void set*(***);*** get*();}</option>-->
<!-- 不混淆包下的所有类名,且类中的方法也不混淆-->
<option>-keep class com.xxx.xxx.bboss.SystemConfig { <methods>; }</option>
<option>-keep class com.xxx.xxx.framework.** { *; }</option>
<option>-keep class com.xxx.xxx.xxx.controller.** { <methods>; }</option>
<option>-keep class com.xxx.xxx.xxx.dao.** { <methods>; }</option>
<option>-keep class com.xxx.xxx.xxx.exception { <methods>; }</option>
<option>-keep class com.xxx.xxx.xxx.model.** { <methods>; }</option>
</options>
作者:ming_Liu
链接:https://www.jianshu.com/p/f9132d3d1a47
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。proguard.cfg(配置文件放在和pom.xml同级即可)

-target 1.8
-dontshrink
-dontoptimize
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontusemixedcaseclassnames
-allowaccessmodification
-useuniqueclassmembernames
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod
-keepclassmembers public class * {void set*(***);*** get*();}
-keep class com.shouxun.contract.config.Start {*;}
-keepclassmembers class com.shouxun.contract.controller.* {
<methods>;
}
-keep class com.jfinal.** { *; }
-dontwarn org.apache.**
-dontwarn com.aliyun.**
-dontwarn com.dingtalk.**
-dontwarn com.taobao.**
-dontwarn com.jfinal.**配置中有几个地方需要注意
1.-keep class com.shouxun.contract.config.Start {*;} //不混淆入口启动项
2.-keepclassmembers public class * {void set*(***);*** get*();} //不混淆getter,setter方法
3.-keepclassmembers class com.shouxun.contract.controller.* {
<methods>;
} //不混淆控制层所有的方法名,如果混淆后action会导致404
4.其他需要排除的jar包和不需要的jar自己按需更改3.修改package.xml(把放到lib下面的原始jar排除,混淆后的jar包放入打包的lib目录)
//在package.xml中把maven依赖到的jar复制到lib下,并排除原始jar

//在package.xml中fileSets中添加把混淆后的jar复制到lib

然后进行maven打包,打包成功后在项目target目录下会有一个*-pg.jar的混淆后的jar包,用反编译工具打开此jar包

问题
混淆后日志报错无法直观定位问题位置
jfinal java8 Action参数注入无法注入,主要是此插件打包暂时还不知道怎么配置-parameters