我有一个使用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中部署之后,在浏览器中打开页面它等待并等待没有任何结果,可能是什么问题?
答案 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和注释处理可能会被混淆器对类文件执行的转换所打破。例如,如果混淆器替换类/方法名称,则注释引用另一个类或方法的名称的任何位置都将中断。
我的建议是放弃混淆是一个坏主意。