难以用弹簧处理proguard

Gin*_*ead 3 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 *
Run Code Online (Sandbox Code Playgroud)

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

Gin*_*ead 6

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

  • 我有点陷入类似的情况,面对一种情况,春天将注释的实现名称与其界面混淆.可能是混淆搞砸了注释..这是一个真正具有挑战性的对我的老板的坚持不懈的情况,他坚持混淆. (3认同)
  • @FrozenFlame 那么你做了什么? (2认同)
  • 如果我记得很清楚我使用-dontoptimize (2认同)