我正在尝试使用 ProGuard 混淆 Java 应用程序,但我对某个特定主题有疑问,就是这样。
我的应用程序使用 Java 1.7,用于 GUI 的 Valkyrie RCP,用于 bean 容器的 spring 3.1.3 和用于数据库通信的 spring JDBC,因此 spring 包含所有对象,从 gui 视图到 jdbc 的 daos。
当我使用 ProGuard 5.1 混淆代码时,spring 在实例化 bean 时遇到问题。我正在使用蚂蚁目标,这里是代码:
<proguard
optimize="false"
shrink="false"
obfuscate="true"
allowaccessmodification="false"
usemixedcaseclassnames="false"
skipnonpubliclibraryclasses="false"
printseeds="obfuscateseeds.txt"
printusage="obfuscateusage.txt"
printmapping="obfuscatemapping.txt">
<keepattribute name="*Annotation*"/>
<injar name="${proj.output}/app/lib/myjar.jar"/>
<outjar name="${proj.output}/app/lib/myjar-ofuscated.jar"/>
<keep name="com.myjar.Main">
<method name="main"/>
</keep>
<libraryjar name="${env.JAVA_HOME}/jre/lib/rt.jar"/>
...
</proguard>
我有很多配置类,并且很好地使用它们,但是在它们中的一些被实例化时,调用了错误的方法。例如,我的主要配置对象如下:
@Configuration
@EnableTransactionManagement
@Import({ RulesContext.class })
public class MainContext implements ApplicationConfig{
@Autowired private RulesContext rulesContext;
@Bean public AnnotationBeanConfigurerAspect annotationBeanConfigurerAspect(){
logger.debug("annotationBeanConfigurerAspect");
return AnnotationBeanConfigurerAspect.aspectOf();
}
/* lot of methods between */
@Bean @Override public RulesSource rulesSource() {
logger.debug("rulesSource");
DefaultRulesSource rules = new DefaultRulesSource();
rules.addRules(rulesContext.enterpriseRules());
rules.addRules(rulesContext.coinRules());
rules.addRules(rulesContext.bankRules());
}
/* lot of methods after */
}
当它被混淆时,结果是:
@Configuration
@EnableTransactionManagement
@Import({o.class})
public class b
implements ApplicationConfig
{
@Autowired
private o f;
@Bean
public AnnotationBeanConfigurerAspect a()
{
this.a.debug("annotationBeanConfigurerAspect");
return AnnotationBeanConfigurerAspect.aspectOf();
}
@Bean
public RulesSource rulesSource()
{
this.a.debug("rulesSource");
DefaultRulesSource localDefaultRulesSource = new DefaultRulesSource();
localDefaultRulesSource.addRules(this.f.a());
localDefaultRulesSource.addRules(this.f.b());
localDefaultRulesSource.addRules(this.f.c());
}
}
当我执行该应用程序时,它会引发异常:
org.springframework.beans.factory.BeanCreationException:创建类 com.myjar.jb 中定义的名称为“rulesSource”的 bean 时出错:bean 的实例化失败;嵌套异常是 org.springframework.beans.factory.BeanDefinitionStoreException: 工厂方法 [public org.valkyriercp.rules.RulesSource com.myjar.jbrulesSource()] 抛出异常;嵌套异常是 java.lang.ClassCastException:org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect 不能转换为 com.myjar.ngbb
com.myjar.ngbb 对象(混淆之前的 RuleContext)有一个方法 a(),它返回一个适当的 RulesObject,但由于某种原因,混淆的 RulesContext 对象中的方法 a() 没有被调用,但在b 对象 (MainContext) 代替。因此 b (MainContext) 对象中的方法 a() 返回一个 AnnotationBeanConfigurerAspect 对象,该对象不是 Rules 对象,因此例外。
如果我避免对包含所有 spring 配置对象的包进行混淆,程序运行得很好,当问题出现时它只是混淆。
你们中有人遇到过类似的问题吗?你怎么解决的?或者,关于发生了什么的任何线索?
感谢您的时间