1

我正在尝试使用 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 配置对象的包进行混淆,程序运行得很好,当问题出现时它只是混淆。

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

感谢您的时间

4

0 回答 0