ProGuard未混淆Spring项目XML中的Bean定义问题咨询
Spring XML Bean定义不会自动随类混淆更新
首先明确说:不会自动变成<bean id="employee" class="a.b.a.a"></bean>。
混淆工具(比如常用的ProGuard)默认只会处理编译后的字节码文件,它不会主动扫描、解析你的XML配置文件并更新里面的全类名引用。所以你现在的情况是,类文件已经被混淆成a.b.a.a,但XML里还写着原类名com.stack.request.Employee,直接启动项目的话,Spring会找不到对应的类,肯定会抛出ClassNotFoundException之类的错误。
给你几个解决思路:
- 利用映射文件批量替换:大部分混淆工具都会生成一个映射文件(比如ProGuard的
mapping.txt),里面记录了原类名、字段名和混淆后名称的对应关系。你可以写个简单的脚本(比如Python、Shell),读取这个映射文件,然后批量替换XML里的全类名和字段名(如果XML里有字段注入的话)。 - 保留指定类的名称:如果这个类的名称必须在XML里保持原样,你可以在混淆工具的配置里添加规则,让它不混淆这个类的全类名。比如ProGuard里可以加:
不过这样做的话,这个类的混淆程度就大打折扣了,适合那些必须对外暴露类名的场景。-keep class com.stack.request.Employee { *; } - 改用注解配置替代XML:如果可以的话,尽量用Spring的注解配置(比如
@Component标记类,用@Bean在配置类里定义Bean),因为注解是直接写在Java类里的,混淆工具处理字节码时会自动更新类内部的注解引用(当然,如果是用字符串写的全类名还是得手动处理),能减少很多配置文件的修改工作。
另外还要提醒一句:如果你的XML里还配置了字段注入(比如<property name="name" value="xxx"/>),那混淆后字段名变成a了,这部分配置也得同步替换,不然Spring会找不到对应的字段进行注入。
内容的提问来源于stack exchange,提问作者nikJ
相关产品推荐
相关产品推荐

