难以用弹簧处理proguard

时间:2012-01-23 10:55:12

标签: java spring proguard

我有一个使用spring annotations extensivley的web应用程序,我的proguard配置如下:

-printmapping out.map

-dontoptimize

-keepdirectories

-renamesourcefileattribute SourceFile

-keepattributes Exceptions,SourceFile,LineNumberTable,*Annotation*

-adaptresourcefilenames    **.xsd,**.wsdl,**.xml,**.properties,**.gif,**.jpg,**.png
-adaptresourcefilecontents **.xsd,**.wsdl,**.xml,**.properties,META-INF/MANIFEST.MF 

-dontshrink

-keepclassmembernames class * {
    java.lang.Class class$(java.lang.String); 
    java.lang.Class class$(java.lang.String, boolean);
}

-keepclassmembers enum * {
    public static **[] values(); 
    public static ** valueOf(java.lang.String);
}

-keepclassmembers class * implements java.io.Serializable { 
    static final long serialVersionUID; 
    private static final java.io.ObjectStreamField[] serialPersistentFields; 
    private void writeObject(java.io.ObjectOutputStream); 
    private void readObject(java.io.ObjectInputStream); 
    java.lang.Object writeReplace(); 
    java.lang.Object readResolve();
}

-keep @org.springframework.transaction.annotation.Transactional class *

-keep @org.springframework.stereotype.Service class *

-keep @org.springframework.stereotype.Controller class *

-keep @org.springframework.beans.factory.annotation.Autowired class *

-keep @org.springframework.web.bind.annotation.ResponseBody class *

-keep @org.springframework.web.bind.annotation.RequestMapping class *

-keep @org.springframework.stereotype.Repository class *

-keep @javax.annotation.Resource class *

-keep @javax.persistence.Entity class *

-keep @javax.persistence.Table class *

-keep @javax.persistence.Id class *

-keep @javax.persistence.GeneratedValue class *

-keep @javax.persistence.Column class *

-keep @javax.persistence.Transient class *

-keep @org.springframework.ws.server.endpoint.annotation.Endpoint class *

-keep @org.springframework.ws.server.endpoint.annotation.PayloadRoot class *

-keep @org.springframework.ws.server.endpoint.annotation.ResponsePayload class *

没有任何警告就建好了。 但是在tomcat中部署之后,在浏览器中打开页面它等待并等待没有任何结果,可能是什么问题?

2 个答案:

答案 0 :(得分:6)

我发现了问题:
proguard在运行时类型时不能特别处理带注释的类,方法和字段。如果你使用注释的-keep选项运行proguard,它仍然会搞乱配置文件,因为它只能替换完全引用包的资源中的类,方法和字段,即当且仅当以下列方式提及类/字段时:my.package.level.purpose.MyClass/my.package.level.purpose.MyClass.myField
回到注释, spring Web应用程序充满了注释,因此它将毫无用处甚至根本没有被混淆(可能只有util类会被混淆)。
Conlusion:
没有使用混淆现代spring(3.x.x +)Web应用程序与任何混淆器甚至商业混淆器,因为它们都在代码的字节码方面工作,不会处理注释并搞乱配置文件

答案 1 :(得分:2)

您需要检查服务器日志文件以查看发生了什么。如果没有明显错误,将日志记录级别更改为DEBUG将为您提供有关Spring正在做什么的更多信息。

FWIW,我希望基于Spring的应用程序在你尝试对它进行模糊处理时会给你带来很多问题。 Spring的DI和注释处理可能会被混淆器对类文件执行的转换所打破。例如,如果混淆器替换类/方法名称,则注释引用另一个类或方法的名称的任何位置都将中断。

我的建议是放弃混淆是一个坏主意。