ProGuard和弹簧3的动态代理

时间:2015-01-05 20:51:59

标签: java spring proguard proxies

我正在尝试使用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配置对象的包进行模糊处理,程序运行得很好,只有在出现问题时才会进行模糊处理。

你们有没有遇到类似的问题?你怎么解决的?或者,关于发生了什么的任何线索?

感谢您的时间

0 个答案:

没有答案