ProGuard を使用して Java アプリを難読化しようとしていますが、特定のトピックに問題があります。
私のアプリは Java 1.7、GUI 用の Valkyrie RCP、Bean コンテナー用の spring 3.1.3、データベース通信用の spring 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>
私は多くの構成クラスを持っており、プロガードはそれらを非常にうまく使用していますが、それらの一部がインスタンス化される瞬間に、間違ったメソッドが呼び出されます。たとえば、私のメインの構成オブジェクトは次のようになります。
@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: ファクトリ メソッド [パブリック org.valkyriercp.rules.RulesSource com.myjar.jbrulesSource()] が例外をスローしました。ネストされた例外は java.lang.ClassCastException: org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect は com.myjar.ngbb にキャストできません
オブジェクト com.myjar.ngbb (難読化前の RulesContext) には、適切な RulesObject を返すメソッド a() がありますが、何らかの理由で、難読化された RulesContext オブジェクトのメソッド a() は呼び出されませんが、代わりに b オブジェクト (MainContext) を使用します。したがって、b (MainContext) オブジェクトのメソッド a() は AnnotationBeanConfigurerAspect オブジェクトを返しますが、これは Rules オブジェクトではないため例外です。
すべてのSpring構成オブジェクトを含むパッケージの難読化を回避すると、プログラムは非常にうまく動作します。問題が存在する場合、それは単なる難読化です。
同様の問題に遭遇した人はいますか?どのように解決しますか?または、何が起こっているかについての手がかりはありますか?
お時間をいただきありがとうございます