ProGuard能够作为maven的插件使用,让我们在原来的项目结构中,能够方便的实现代码混淆。但是网上ProGuard的资料通常都是单应用的实现,因此本文基于dubbo分布式项目,简单描述一下如何实现服务提供者的代码混淆。

服务提供者代码混淆

项目作为dubbo服务提供者,以jar的方式发布服务。

pom中添加ProGuard插件

 1            <!-- ProGuard混淆插件-->
 2            <plugin>
 3                <groupId>com.github.wvengen</groupId>
 4                <artifactId>proguard-maven-plugin</artifactId>
 5                <version>2.0.11</version>
 6                <executions>
 7                    <execution>
 8                        <!-- 打包的时候混淆-->
 9                        <phase>package</phase>
10                        <goals>
11                            <!-- 使用混淆功能-->
12                            <goal>proguard</goal>
13                        </goals>
14                    </execution>
15                </executions>
16                <configuration>
17                    <!-- 是否将生成的PG文件安装部署-->
18                    <attach>true</attach>
19                    <!-- 是否混淆-->
20                    <obfuscate>true</obfuscate>
21                    <!-- 指定生成文件分类 -->
22                    <attachArtifactClassifier>pg</attachArtifactClassifier>
23                    <!-- 指定配置文件的路径,不在pom文件中配置,放在配置文件中方便管理 -->
24                    <proguardInclude>${basedir}/proguard.conf</proguardInclude>
25                    <!-- 添加依赖,添加jdk的依赖即可 -->
26                    <libs>
27                        <lib>${java.home}/lib/rt.jar</lib>
28                        <lib>${java.home}/lib/jce.jar</lib>
29                    </libs>
30                </configuration>
31            </plugin>

pom同级目录下添加proguard.conf混淆配置文件

 1# ----------------------------------
 2# JDK目标版本
 3# ----------------------------------
 4-target 1.7
 5
 6# ----------------------------------
 7# 忽略所有告警
 8# ----------------------------------
 9-ignorewarnings
10
11# ----------------------------------
12# 混淆时应用侵入式重载
13# ----------------------------------
14-overloadaggressively
15
16# ----------------------------------
17# 优化时允许访问并修改有修饰符的类和类的成员
18# ----------------------------------
19-allowaccessmodification
20
21# ----------------------------------
22#确定统一的混淆类的成员名称来增加混淆
23# ----------------------------------
24-useuniqueclassmembernames
25
26# ----------------------------------
27# 不略过非公用类文件及成员
28# ----------------------------------
29-dontskipnonpubliclibraryclasses
30-dontskipnonpubliclibraryclassmembers
31
32# ----------------------------------
33# 不输出通知
34# ----------------------------------
35-dontnote
36
37# ----------------------------------
38# 不混淆所有包名Spring配置中有大量固定写法的包名
39# ----------------------------------
40-keeppackagenames
41
42# ----------------------------------
43# 不混淆所有特殊的类
44# ----------------------------------
45-keepattributes SourceFile,Exceptions,InnerClasses,*Annotation*,Signature,LineNumberTable
46
47# ----------------------------------
48# 不混淆对外服务的类
49# 实体类daoservice枚举类不混淆类名和属性方法
50# 实现类不混淆类名
51# ----------------------------------
52-keep class xxx.dao.** {*;}
53-keep class xxx.domain.** {*;}
54-keep class xxx.enums.** {*;}
55-keep class xxx.service.** {*;}
56-keep class xxx.impl.**
57
58# ----------------------------------
59# 不混淆spring配置文件中定义的类
60# ----------------------------------
61按照项目配置

打包,并替换class文件

经过以上配置后,执行maven打包命令mvn package,在项目的target文件夹中会得到两个jar:项目名.jar、项目名-pg.jar。 然后我们要将这两个解压:

1PROJ=项目名
2PROJPG=${PROJ}"-pg"
3
4unzip $PROJ.jar
5unzip $PROJPG.jar

并将“项目名-pg”文件夹中的cn目录拷贝到原项目中,然后把它打成jar包:

1rm -rf $PROJ/cn/
2cp -avpf $PROJPG/cn/ $PROJ/
3jar cvfm $PROJPG.jar $PROJ/META-INF/MANIFEST.MF -C $PROJ/ .

此时得到的“项目名.jar”就是混淆后的可执行jar包。执行它即可发布服务到dubbo注册中心。 以上操作可写成shell脚本,添加到自动部署流程中,实现自动化管理。

  • 本文的配置请参照自身的项目做相应的调整