使用Proguard混淆Spring Boot项目代码
项目中需要对代码进行混淆处理,由于项目是标准的maven项目,便使用了proguard-maven-plugin
来自动化混淆过程,但是在使用过程中也不免踩到了一些坑,网上也很少有提及,在此记录一下。
踩过的坑
spring bean名称冲突问题
默认proguard混淆后的类名类似a.class,b.class,但是不同包路径下类名可能发生重名,在spring中默认会把类名作为bean的名称,导致会报spring bean名称冲突的问题,可以通过重新实现BeanNameGenerator
接口来解决:
@SpringBootApplication @ComponentScan("com.abc.def") public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class) .beanNameGenerator(new CustomBeanNameGenerator()) .run(args); } private static class CustomBeanNameGenerator implements BeanNameGenerator { @Override public String generateBeanName(BeanDefinition d, BeanDefinitionRegistry r) { return d.getBeanClassName(); } } }
spring获取不到jar包里的包路径
spring boot启动后实现ApplicationRunner
接口的初始化类并没有执行,也没有错误日志产生。后来把spring容器注册的Bean打印出来发现除了入口类和spring自己的类都没有加载。spring启动debug模式并调整日志级别为TRACE
,发现spring没有解析出包含basePackage的jar包来,假设basePackage为com/abc/def/
,不混淆代码的日志如下:
2019-11-24 19:33:49.703 [TRACE] [main] [o.s.c.i.s.PathMatchingResourcePatternResolver : 323] Resolved classpath location [com/abc/def/] to resources [URL [jar:file:/tmp/foo/lib/service-facade-1.0.jar!com/abc/def/], URL [jar:file:/tmp/foo/lib/service-impl-1.0.jar!com/abc/def/]]
经proguard混淆后日志如下:
2019-11-24 19:33:49.703 [TRACE] [main] [o.s.c.i.s.PathMatchingResourcePatternResolver : 323] Resolved classpath location [com/abc/def/] to resources []
但是将混淆后jar包先解压后再压缩处理,却可以正常加载。也就是说proguard在打包过程中把包路径信息丢失了。需要配置keepdirectories
参数。
JDK9编译的jar包类冲突
JDK9编译出来的jar包会和一些类冲突,需要配置inLibsFilter
排除掉。
多jar包混淆
默认proguard-maven-plugin
插件只能通过injar
参数将一个jar包混淆,而常见的项目都是多模块项目,这时就需要通过配置assembly
参数来实现。
参考配置
Pom.xml:
<plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.2.0</version> <executions> <execution> <id>release</id> <phase>package</phase> <goals> <goal>proguard</goal> </goals> <configuration> <assembly> <inclusions> <inclusion> <groupId>com.abc.def</groupId> <artifactId>lib1</artifactId> </inclusion> <inclusion> <groupId>com.abc.def</groupId> <artifactId>lib2</artifactId> </inclusion> </inclusions> </assembly> <!--exclude jdk9--> <inLibsFilter>!META-INF/versions/9/**.class</inLibsFilter> <proguardInclude>proguard.conf</proguardInclude> <libs> <lib>${java.home}/lib/rt.jar</lib> <lib>${java.home}/lib/jce.jar</lib> </libs> <!--<silent>true</silent>--> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>net.sf.proguard</groupId> <artifactId>proguard-base</artifactId> <version>6.2.0</version> </dependency> </dependencies> </plugin>
proguard.conf:
-dontshrink -dontoptimize -keepdirectories -adaptclassstrings -dontusemixedcaseclassnames -flattenpackagehierarchy 'com.abc.def' -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod -keep class com.abc.def.Application -keep class * extends org.springframework.boot.ApplicationRunner # Keep - Applications. Keep all application classes, along with their 'main' # methods. -keepclasseswithmembers public class * { public static void main(java.lang.String[]); } # Also keep - Enumerations. Keep the special static methods that are required in # enumeration classes. -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # Keep names - Native method names. Keep all native class/method names. -keepclasseswithmembers,includedescriptorclasses,allowshrinking class * { native <methods>; }
参考
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
自定义组件v-model记录
在其他一些框架语言中并没有v-model这么强大的指令,这么方便。在react使用value,onchange的方式实现双向绑定明显麻烦很多。所以在学习vue的基础语言语法相对其他来说确实简单了很多了。在写这篇文章前,因为业务需要自定义组件的封装,就去看了这个关于v-model的自定义组件的实现,我们先看看官方文档的说明。从官方和技术文章中我们可以知道,v-model是v-bind以及v-on配合使用的语法糖,举个例子 <input v-model="value"/> <input v-bind:value="value" v-on:input="value=$event.target.value"> 这两种方式实现是等价的现在我们已经了解了v-model是什么东西了,我们除了能在表单组件上实现v-model,能不能在自定义组件实现双向绑定呢呢?? 答案是可以的。vue官方文档的v-model的说明:一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框、复选框等类型的输入控件可能会将 value 特性用...
- 下一篇
Web 前端矢量小图标的使用方法
前言 在写前端页面时,我们经常会用到一些小图标之类的图片,如果使用图片的话代码写起来比较麻烦,最近发现一个方便实用的方法,直接引用就可以了。 一、引入图片操作方法 首先我们输入网址:https://www.iconfont.cn/ 可以百度搜索:阿里巴巴矢量图,就会出来这个网址以下我推荐两种比较常用也是比较方便的方法。 方法1:font-class引用 兼容性良好,支持ie8+,及所有现代浏览器。 因为使用class来定义图标,所以当要替换图标时,只需要修改class里面的图片名称引用。 不过因为本质上还是使用的字体,所以多色图标还是不支持的。 第一步: 进入网站我们可以看到一个搜索框,直接输入你想要的图标名称,也可以在图标库找。 第二步:然后加入购物车。 第三步:点击购物车创建一个新项目,确定,如果同一个项目后面要追加图片就不需要再重新创建了。 第四步:接下来就会出现以下这个页面,复制代码,引用到代码的文档。 <link rel="stylesheet" href="http://at.alicdn.com/t/font_1587841_2580lrwj551.js"> ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- 设置Eclipse缩进为4个空格,增强代码规范
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7安装Docker,走上虚拟化容器引擎之路