Java 部署ProGuard模糊化jar后未检测到Spring注释

Java 部署ProGuard模糊化jar后未检测到Spring注释,java,spring-mvc,annotations,proguard,obfuscation,Java,Spring Mvc,Annotations,Proguard,Obfuscation,过去3-4天我一直在尝试ProGuard。由于命令行调用将相当长,因此我尝试使用proguardgui 在我了解到默认情况下,注释在模糊处理后被删除之后,我尝试了-keep选项,但输出jar不起作用 所以接下来我尝试禁用所有的处理步骤,比如缩小、模糊、优化和生成jar,但仍然不起作用!我通过反编译输出jar中的类来确认输出jar具有springmvc注释 如果我禁用了所有的处理步骤,那么输出jar应该与输入jar相同,但是我看到当我部署输入jar时,会检测到注释,而当我部署输出jar时,则不会

过去3-4天我一直在尝试ProGuard。由于命令行调用将相当长,因此我尝试使用proguardgui

在我了解到默认情况下,注释在模糊处理后被删除之后,我尝试了-keep选项,但输出jar不起作用

所以接下来我尝试禁用所有的处理步骤,比如缩小、模糊、优化和生成jar,但仍然不起作用!我通过反编译输出jar中的类来确认输出jar具有springmvc注释

如果我禁用了所有的处理步骤,那么输出jar应该与输入jar相同,但是我看到当我部署输入jar时,会检测到注释,而当我部署输出jar时,则不会

朋友们,非常感谢你们的帮助。 如果需要,我将发布示例代码和依赖项以重新创建此问题。 谢谢 --尼勒斯

2015/01/08: 以下是我将遵循的步骤:

  • 我的jar是位于C:/test目录中的xyz.jar
  • 使用MVC web应用程序部署xyz.jar
  • 确认错误日志显示:
  • 信息:正在刷新命名空间的WebApplicationContext “TestDataImport servlet”:启动日期[Sun Jan 04 19:37:45 IST 2015]; 上下文层次结构的根2015年1月4日下午7:37:45 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息:从 ServletContext资源[/WEB-INF/TestDataImport servlet.xml]2004年1月, 2015年7:37:46下午 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod信息:已映射 {[/dataimportcontroller/setconfig],方法=[POST],参数=[],头=[],使用=[],产生=[application/json],自定义=[] 打开公共java.lang.String com.dn.controller.DataImportController.setconfig(java.lang.String[]) 2015年1月4日下午7:37:46 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod信息:已映射 {[/dataimportcontroller/insertRegion],方法=[POST],参数=[],头=[],使用=[],产生=[application/json],自定义=[] 进入公共空间 com.dn.controller.DataImportController.insertRegion(java.lang.String) 2015年1月4日下午7:37:47 org.springframework.web.servlet.view.ContentNegotiatingViewResolver initServletContext

  • 这意味着可以检测到注释,并且可以通过http调用带注释的方法
  • 启动Proguardgui
  • 在“输入/输出”选项卡上,选择“添加输入”,然后选择要混淆的jar文件
  • 在input/Output选项卡上,选择AddOutput directry和输出jar的名称,在我的例子中是C:/temp/xyzob.jar
  • 单击“下一步”转到“收缩”选项卡
  • 取消选中“收缩”复选框,然后单击“下一步”转到“模糊处理”选项卡
  • 取消选中“模糊”复选框,然后单击“下一步”转到“优化”选项卡
  • 取消选中“优化”复选框,然后单击“下一步”转到“信息”选项卡
  • 取消选中“预验证”复选框,然后单击“下一步”转到“流程”选项卡
  • 点击“过程”
  • 使用反编译器并确认注释保存在输出jar中
  • 在mvc web应用程序中,将xyz.jar替换为xyzob.jar
  • 重新部署web应用程序
  • 日志如下所示
  • 信息:正在刷新命名空间的WebApplicationContext “TestDataImport servlet”:启动日期[Sun Jan 04 19:33:39 IST 2015]; 上下文层次结构的根2015年1月4日下午7:33:39 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息:从 ServletContext资源[/WEB-INF/TestDataImport servlet.xml]2004年1月, 2015年7:33:41下午 org.springframework.web.servlet.view.ContentNegotiatingViewResolver initServletContext

  • 信息:映射消息不存在,这意味着未检测到批注
  • 我的问题是,如果我取消选中所有选项,输入和输出jar应该有相同的内容

  • 请说明您使用的是哪一版本的ProGuard和哪一版本的Java。早期的v5 ProGuard在Java 8.ProGuard 5.1和JDK 1.7中遇到了严重的问题。为了保留一些东西,特别是注释,我使用了以下行:
    -keepattributes innerclass,SourceFile,LineNumberTable,弃用,Signature,*Annotation*,EnclosingMethod,Exceptions
    注释
    周围的星号似乎很重要。看你是对的,这是应该发生的,我看到注释保存在输出jar中,但是没有检测到注释,就像我在查询中所说的。也许发布你正在使用的确切选项是有帮助的。