【问题标题】:How to obfuscate one jar from war using proguard and maven如何使用 proguard 和 maven 从战争中混淆一个罐子
【发布时间】:2012-12-28 12:18:25
【问题描述】:

我对proguard有点疑惑。 我的 pom.xml 中有这个设置 首先, 标签不起作用......如果我使用这个标签,proguard 的最终调用不包含 -injars 。 其次,我不确定是否可以只混淆 WEB-INF/lib 中发生的一个 jar(我在一个 jar 中编译所有代码)并过滤所有其他 lib。

<plugin>
        <groupId>com.pyx4me</groupId>
        <artifactId>proguard-maven-plugin</artifactId>
        <version>2.0.4</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>proguard</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <proguardVersion>4.8</proguardVersion>
            <obfuscate>true</obfuscate>
            <maxMemory>1024m</maxMemory>
            <includeDependency>false</includeDependency> 
            <options>
                <option>-injars target/Test.war</option>
                <option>-ignorewarnings</option>
            </options>
            <outjar>target/Test-obf.war</outjar> 

            <attach>false</attach>
            <outputDirectory>${project.build.directory}</outputDirectory>
                <proguardInclude>${basedir}\proguard.conf</proguardInclude>
        <libs>
            <lib>${java.home}/lib/rt.jar</lib>
        </libs>
        <addMavenDescriptor>false</addMavenDescriptor>
        <skip>false</skip>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>net.sf.proguard</groupId>
            <artifactId>proguard</artifactId>
            <version>4.4</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
</plugin>

使用该配置我有很多警告,因为 proguard 似乎试图混淆 WEB-INF/lib 中的每个 jar 有人可以对此进行传播吗?提前谢谢你。

添加: 位于所有参数前面的输出问题对我来说非常棘手。据我了解,当您在 pom.xml 中同时指定 injars 和 outjars 时,不应使用 ${basedir}。原因 ${basedir} 转向绝对路径,并且 intenaly proguard 也放置了绝对路径。

【问题讨论】:

  • 顺便说一句,对外部库的引用应使用-libraryjars 选项指定!

标签: java maven obfuscation proguard


【解决方案1】:

首先,我从未使用过来自 Maven 的 ProGuard,仅来自于 Ant。

我将您的配置文件与here中的配置文件进行比较

 <options>
     <option>-allowaccessmodification</option>
     <option>-keep public class com.degoo.ui.ClientBackendStarter { public *; public static *; }</option>
 </options>
 <injar>${project.build.finalName}.jar</injar>
 <outjar>${project.build.finalName}-small.jar</outjar>

在您的情况下,您以不同的方式配置 injarsoutjar,这很奇怪。

(我在一个 jar 中编译所有代码)并过滤所有其他库。 我有很多警告,因为 proguard 似乎试图混淆 WEB-INF/lib 中的每个 jar

在这种情况下,警告不是来自 ProGuard 尝试编译所有库的事实,而是因为当它混淆过滤后的代码时,它希望看到对外部库的引用。 See this.

您需要为代码中引用的每个外部 jar 添加

<lib>path/lib.jar</lib>

这可能会帮助您避免许多警告,但真正的艺术始于您配置-keep 选项。 我建议从这个配置开始https://stackoverflow.com/a/7511926/1360074 如果这最终可行,请尝试进行更多混淆。

【讨论】:

  • 关于 injar 和 outjar 的不同方式 - 这是我问题的第一部分。使用 标签,我在最后的 proguard 调用中没有 -injar 选项。关于 当我需要混淆 1 个单独的 jar 时,我很清楚。但是我所有的库和代码都是洞察战争文件。如何只过滤一个我的罐子?或者也许我需要在将 jar 打包成战争之前对其进行混淆?
  • @FedorSkrynnikov 在你把它放入战争之前混淆那个罐子。
  • 我已将阶段更改为准备包,但 com.pyx4me 仍然没有传递我在 outjar 之前指定的 injar。这会导致 java.io.IOException: The input does not contain any classes。您是否指定了正确的“-injars”选项?
  • @FedorSkrynnikov,首先尝试在没有 Maven 的情况下进行混淆,而普通 Proguard 在答案中使用配置文件。运行后,将配置移至 Maven。
  • 是的。我这样做了。在 gui 工具中,proguard 混淆了,没有任何错误。但是,当我尝试通过 maven 使用它时,它会在我在 pom.xml 中指定的任何内容之前传递 -outputjar。它会导致“输入不包含任何类”错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 2019-01-21
相关资源
最近更新 更多