【问题标题】:ProGuard : Obfuscated jar is not working but un-obfuscated jar is workingProGuard:混淆的 jar 不起作用,但未混淆的 jar 正在工作
【发布时间】:2016-11-18 05:24:40
【问题描述】:

我有一个项目是另一个项目的一部分。我正在使用 ma​​ven 构建过程来制作项目的 jar。我使用 ProGuard 来混淆它。我有一些处理 UI 请求的控制器。

问。我的问题是未混淆的 jar 正在工作。所有控制器都被击中,但混淆的 jar 不起作用(没有控制器被击中)。混淆有什么问题?

我的 Servlet.XML:

<context:component-scan base-package="myPackage.controllers" />
<mvc:annotation-driven />

示例控制器代码:

package myPackage.controllers.information;

import myPackage.beans.InfoBean;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@RestController
@RequestMapping("/information")
public class InformationController {

    @RequestMapping(method = RequestMethod.GET)
    public return_bean getAllInformation() {
        //some logic
    }

    @RequestMapping(value = "/{infoId}", method = RequestMethod.PUT)
    public return_bean updateInformation(@PathVariable String InfoId, @RequestBody InfoBean info) {
        // some logic
    }
}

我与 ProGuard 相关的 POM.XML 内容:

<plugin>
    <groupId>com.github.wvengen</groupId>
    <artifactId>proguard-maven-plugin</artifactId>
    <version>2.0.13</version>
    <dependencies>
        <dependency>
            <groupId>net.sf.proguard</groupId>
            <artifactId>proguard-base</artifactId>
            <version>5.2.1</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>proguard</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <maxMemory>576m</maxMemory>
        <obfuscate>true</obfuscate>
        <!-- File with proguard configuration -->
        <proguardInclude>${basedir}/proguard.conf</proguardInclude>
        <libs>
            <lib>${java7home}/jre/lib/rt.jar</lib>
            <lib>${java7home}/jre/lib/jce.jar</lib>
        </libs>
    </configuration>
</plugin>

我的 ProGuard.conf 文件内容:

-dontnot
-dontwarn
-dontshrink
-dontoptimize
-keep public class * { public protected *;}
-keep class myPackage.controllers.** { public protected *;}
-keepattributes SourceFile,Signature,LineNumberTable,Exceptions, *Annotation*
-keepparameternames
-printmapping '${logFilesPath}/${project.artifactId}.log'

我检查了我的混淆 jar,所有注释都被保留了。 同样在我的信息包中,我还有一些其他类仅具有包级访问权限。所以那些也被混淆了。但是我所有具有 RequestMappings 的类都是公开的,不会被混淆。

我的运行环境:

1) 我的项目使用 Java 1.7。但是这个 jar 被放置在在 Java 1.8 上运行的项目中

2) ProGuard 版本:5.2.1

3) 春天:4.0.9

4) 杰克逊:1.9.11

注意:未混淆的 jar 可以工作,但经过混淆的 jar 在上述环境中不起作用)

【问题讨论】:

  • 混淆 jar 启动时是否收到任何错误?您收到超时了吗?
  • 没有。它只是说阅读和阅读,然后准备输出罐子。我错过了什么?它还需要一些 .m2 文件夹中的罐子。

标签: java spring maven proguard obfuscation


【解决方案1】:

我需要在 ProGuard.conf 文件中添加以下内容

-keepdirectories

目录条目在混淆过程中默认被删除。这样做是为了减小 jar 的大小。当我使用 Spring 的“组件扫描”功能(可能需要目录结构)时,我需要让它正常工作。

【讨论】:

  • 我只是想深入了解ClassPathBeanDefinitionScanner 并猜测您的提示为我节省了很多时间。谢谢 - 现在可以了。
  • 谢谢!在提取和重新打包后,我一直在努力找出 Proguard 输出 jar 和同一个 jar 之间真正的内在差异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 2016-11-11
相关资源
最近更新 更多