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 и, следовательно, исключением.
Если я избегаю запутывания в пакете, который содержит все весенние конфигурационные объекты, программа работает очень хорошо, это просто запутывание, когда проблема присутствует.
Кто-нибудь из вас сталкивался с подобной проблемой? как ты это решаешь? или какая-нибудь подсказка о том, что происходит?
Спасибо за ваше время