ProGuard и динамические прокси с пружиной 3

Я пытаюсь запутать Java-приложение с ProGuard, но у меня есть проблема с одной конкретной темой, вот она.

Мое приложение использует Java 1.7, Valkyrie RCP для графического интерфейса пользователя, Spring 3.1.3 для контейнера бинов и Spring JDBC для связи с базой данных, поэтому Spring содержит все объекты, от представлений GUI до Daos JDBC.

Когда я запутываю код в 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>

У меня есть много классов конфигурации, и proguard ofuscate их очень хорошо, но в момент, когда некоторые из них создаются, вызывается неправильный метод. Для exame мой основной объект конфигурации выглядит следующим образом:

@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', определенным в классе com.myjar.jb: Ошибка создания компонента; вложенным исключением является 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 (RulesContext перед запутыванием) имеет метод a(), который возвращает соответствующий RulesObject, но по какой-то причине метод a() в обфусцированном объекте RulesContext не вызывается, а метод a() в b объект (MainContext) вместо этого. Поэтому метод a() в объекте b (MainContext) возвращает объект AnnotationBeanConfigurerAspect, который не является объектом Rules и, следовательно, исключением.

Если я избегаю запутывания в пакете, который содержит все весенние конфигурационные объекты, программа работает очень хорошо, это просто запутывание, когда проблема присутствует.

Кто-нибудь из вас сталкивался с подобной проблемой? как ты это решаешь? или какая-нибудь подсказка о том, что происходит?

Спасибо за ваше время

0 ответов

Другие вопросы по тегам