我正在尝试使用ProGuard混淆一个Java应用程序,但我对一个特定主题有疑问,就在这里。
我的应用程序使用Java 1.7,Valkyrie RCP用于GUI,弹簧3.1.3用于bean容器,弹簧JDBC用于数据库通信,因此spring包含所有对象,从gui视图到jdbc的daos。
当我使用ProGuard 5.1对代码进行模糊处理时,spring遇到了实例化bean的问题。我正在使用ant目标,这里是代码:
<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>
我有很多配置类,并且proguard很好地模仿它们,但是目前它们中的一些被实例化,调用了一个错误的方法。对于exame,我的主要Configuration对象就像下一个:
@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({ 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:错误 创建名称为“rulesSource&#39;”的bean在课堂上定义 com.myjar.j.b:bean的实例化失败;嵌套异常 是org.springframework.beans.factory.BeanDefinitionStoreException: 工厂方法[public org.valkyriercp.rules.RulesSource com.myjar.j.b.rulesSource()]抛出异常;嵌套 异常是java.lang.ClassCastException: org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect 不能转发给com.myjar.n.g.b.b
对象com.myjar.ngbb(混淆之前的RulesContext)有一个方法a(),它返回一个适当的RulesObject,但由于某种原因,混淆的RulesContext对象中的方法a()不会被调用,但是方法a( )而在b对象(MainContext)中。因此,b(MainContext)对象中的方法a()返回AnnotationBeanConfigurerAspect对象,该对象不是Rules对象,因此是异常。
如果我避免对包含所有spring配置对象的包进行模糊处理,程序运行得很好,只有在出现问题时才会进行模糊处理。
你们有没有遇到类似的问题?你怎么解决的?或者,关于发生了什么的任何线索?
感谢您的时间