Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在处理弹簧方面有困难_Java_Spring_Proguard - Fatal编程技术网

Java 在处理弹簧方面有困难

Java 在处理弹簧方面有困难,java,spring,proguard,Java,Spring,Proguard,我有一个使用spring注解扩展的web应用程序,我的proguard配置如下: -printmapping out.map -dontoptimize -keepdirectories -renamesourcefileattribute SourceFile -keepattributes Exceptions,SourceFile,LineNumberTable,*Annotation* -adaptresourcefilenames **.xsd,**.wsdl,**.x

我有一个使用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中部署并在浏览器中打开页面后,它会一直等待,没有任何结果,这可能是什么问题?

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

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

我的建议是放弃混淆,因为这是个坏主意。

我发现了问题:
proguard不能特别处理带注释的类、方法和字段,因为它们是运行时类型。如果您运行proguard,即使带有注释的
-keep
选项,它仍然会弄乱配置文件,因为它只能替换类、方法、,资源中完全引用包的字段,即当且仅当类/字段按以下方式提及时:
my.package.level.purpose.MyClass/my.package.level.purpose.MyClass.myField

回到注释,SpringWeb应用程序中充满了注释,因此它将毫无用处,甚至根本不会被混淆(可能只有util类会被混淆)。
结论:

将现代spring(3.x.x+)web应用程序与任何模糊器(甚至是商业模糊器)混淆是没有用的,因为它们都在代码的字节码端工作,不会处理注释并弄乱配置文件。

在等待期间,您可以使用
jstack
JVisualVM
进行线程转储吗?此外,可能浏览器会以静默方式记录一些错误?如果您在unix/linux上运行,则可以通过发出
killall-QUIT java
来进行线程转储。线程转储将出现在
catalina.out
中。WEB-INF/下是否有.class文件。。。?上次我在论坛上与Proguard的开发人员交谈时,Proguard无法在.war文件中处理WEB-INF中未打包的.class文件(在com/yourcompany/yourpackage下):它只能正确处理.jar文件。查看tomcat日志有助于诊断problem@Harout:这不是100%正确,这个问题的答案是一样的:我们需要更多的信息:日志、转储或其他任何信息!目前,这个问题有点像:“有些东西不工作,请帮助。”模糊器可能把事情搞得一团糟,以至于日志系统无法初始化。是的,这就是我认为log4j在其过程中会如此糟糕地死去的原因!但是开始,因为它必须根据我从其他使用proguard和spring的人那里读到的内容来工作!真奇怪@哈洛特-我建议你参考我答案的最后一句:-)。说真的,模糊处理并不能为您提供任何真正的保护,以防有人对您的代码进行反向工程。从长远来看,它给你(以及你的诚实的付费客户)的只是痛苦。@GingerHead你能发布你找到的解决方案吗@AbelRoussi看看这个,我有点陷入了类似的情况,面临着spring将带注释的实现名称与其接口混淆的情况。。可能是混淆弄乱了注释。这是一个在技术上对我的老板很有挑战性的尴尬局面,他坚持要混淆。你需要想出新的技术@你做了什么?如果我记得很清楚的话,我用了-dontoptimize