【问题标题】:Having difficulties dealing proguard with spring与弹簧打交道有困难
【发布时间】:2012-01-23 10:55:12
【问题描述】:

我有一个使用 spring 注释扩展的 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中部署后,在浏览器中打开页面就一直等待,没有任何结果,可能是什么问题?

【问题讨论】:

  • 你可以在等待期间使用jstackJVisualVM 进行线程转储吗?另外,也许浏览器会默默地记录一些错误?
  • 如果您在 unix/linux 上运行,您可以通过发出 killall -QUIT java 进行线程转储。线程转储将出现在catalina.out
  • WEB-INF/...下有.class文件吗?上次我在论坛上与 Pr​​oguard 的开发人员交谈时,Proguard 无法在 .war 文件中处理 WEB-INF(在 com/yourcompany/yourpackage 下)中解压的 .class 文件:它只能正确处理 .jar 文件
  • 显示您的 tomcat 日志将有助于诊断问题
  • @Harout:这不是 100% 正确的,对于那个问题有同样的答案:我们需要更多信息:日志、转储或其他任何东西!目前这个问题有点像:“有什么不行,请帮忙。”

标签: java spring proguard


【解决方案1】:

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

【讨论】:

  • 我有点陷入类似的境地,面临这样一种情况,即 spring 将带注释的实现名称与它的接口混淆..可能混淆了注释..这是一个真正技术上具有挑战性的尴尬情况对我的老板,他坚持混淆视听。
  • 你需要想出新技术!
  • @FrozenFlame 你做了什么?
  • 如果我记得我用过-dontoptimize
【解决方案2】:

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

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

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

【讨论】:

  • 混淆器可能把事情搞砸了,以至于日志系统无法初始化。
  • 是的,这就是我认为 log4j 在它的进程下死得很惨!但是很奇怪,因为它必须根据我从其他使用 proguard 和 spring 的人那里读到的内容来工作!确实很奇怪!
  • @Harout - 请参考我回答的最后一句话:-)。说真的,混淆并不能真正保护您免受有人对您的代码进行逆向工程。从长远来看,它给您(以及您诚实的付费客户)带来的只是痛苦。
  • @GingerHead 你能发布你找到的解决方案吗!
  • @AbelRoussi 看看这个stackoverflow.com/questions/9129689/…
猜你喜欢
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 2011-09-19
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
相关资源
最近更新 更多