【问题标题】:ProGuard doesn't obfuscate JAR with dependenciesProGuard 不会用依赖项混淆 JAR
【发布时间】:2016-04-22 15:40:36
【问题描述】:

我有一个带有下面给出的pom.xml 文件的项目。当我发出命令mvn clean compile assembly:single install 时,我希望 Maven 生成一个 JAR,其中包含

  • 所有的依赖和
  • 我的代码的混淆版本。

它不起作用 - 我的代码在“jar-with-dependencies”文件中没有被混淆。

当我运行 mvn clean compile install 时,生成的文件包含我的应用程序的混淆代码,但没有依赖项。

如何才能拥有一个包含所有依赖项和我的混淆代码的 JAR 文件?

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mycompany</groupId>
    <artifactId>myproduct</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <restlet-version>2.3.5</restlet-version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.spongepowered</groupId>
            <artifactId>spongeapi</artifactId>
            <version>3.0.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.easytesting</groupId>
            <artifactId>fest-assert-core</artifactId>
            <version>2.0M8</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>1.10.19</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.restlet.jse</groupId>
            <artifactId>org.restlet</artifactId>
            <version>${restlet-version}</version>
        </dependency>
        <dependency>
            <groupId>org.restlet.jse</groupId>
            <artifactId>org.restlet.ext.jackson</artifactId>
            <version>${restlet-version}</version>
        </dependency>
        <dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>${project.basedir}/src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>templating-maven-plugin</artifactId>
                <version>1.0-alpha-3</version>
                <executions>
                    <execution>
                        <id>filter-src</id>
                        <goals>
                            <goal>filter-sources</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.github.wvengen</groupId>
                <artifactId>proguard-maven-plugin</artifactId>
                <version>2.0.8</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals><goal>proguard</goal></goals>
                    </execution>
                </executions>
                <configuration>
                    <proguardVersion>5.2</proguardVersion>
                    <options>
                        <option>-allowaccessmodification</option>
                        <option>-dontoptimize</option>
                        <option>-dontshrink</option>
                        <option>-dontnote</option>
                        <option>-keepattributes Signature</option>
                        <option>-keep class com.mycompany.MyPlugin { *; }</option>
                    </options>
                    <libs>
                        <lib>${java.home}/lib/rt.jar</lib>
                    </libs>
                    <dependencies>
                        <dependency>
                            <groupId>net.sf.proguard</groupId>
                            <artifactId>proguard-base</artifactId>
                            <version>5.2</version>
                            <scope>runtime</scope>
                        </dependency>
                    </dependencies>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

更新 1 (17.01.2016 19:54 MSK): 更改了 ProGuard 配置,如下所示,但 mvn clean compile assembly:single 仍会生成带有未混淆类文件的 JAR。

<plugin>
    <groupId>com.github.wvengen</groupId>
    <artifactId>proguard-maven-plugin</artifactId>
    <version>2.0.8</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals><goal>proguard</goal></goals>
        </execution>
    </executions>
    <configuration>
        <proguardVersion>5.2</proguardVersion>
        <options>
            <option>-allowaccessmodification</option>
            <option>-dontoptimize</option>
            <option>-dontshrink</option>
            <option>-dontnote</option>
            <option>-keepattributes Signature</option>
            <option>-keep class com.mycompany.MyPlugin { *; }</option>
        </options>
        <injar>${project.build.finalName}-jar-with-dependencies.jar</injar>
        <libs>
            <lib>${java.home}/lib/rt.jar</lib>
        </libs>
        <dependencies>
            <dependency>
                <groupId>net.sf.proguard</groupId>
                <artifactId>proguard-base</artifactId>
                <version>5.2</version>
                <scope>runtime</scope>
            </dependency>
        </dependencies>
    </configuration>
</plugin>

更新 2(17.01.2016 20:29 MSK): mvn clean compile assembly:single install 失败。可以看到最后的消息here

【问题讨论】:

    标签: java maven maven-3 proguard obfuscation


    【解决方案1】:

    proguard-maven-plugin 将混淆您项目的主要工件,而不是 maven-assembly-plugin 生成的次要工件 jar-with-dependencies

    您需要通过指定injar 属性来配置插件以混淆jar-with-dependencies

    指定要处理的应用程序的输入 jar 名称(或 wars、ears、zips)。

    <injar>${project.build.finalName}-jar-with-dependencies.jar</injar>
    

    现在,您的 POM 中插件的执行顺序也存在问题:我们需要确保 maven-assembly-pluginproguard-maven-plugin 之前执行。因此,最好为绑定到package 阶段的maven-assembly-plugin 定义显式执行,而不是使用assembly:single 从命令行手动调用它。这将是配置:

    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <executions>
            <execution>
                <id>assembly</id>
                <goals>
                    <goal>single</goal>
                </goals>
                <phase>package</phase>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    然后,您只需要确保 proguard-maven-plugin 插件配置在您的 POM 之后。

    完成后,使用 mvn clean install 调用 Maven 将产生一个带有依赖项的混淆 jar。


    为了使用您的实际 POM 进行测试,我添加了两个存储库:

    • https://repo.spongepowered.org/maven 解决 spongeapi 依赖关系。
    • http://maven.restlet.com 解决 org.restlet.jse 依赖关系。

    对于这 2 个依赖项,ProGuard 会生成警告,因为 org.restlet.ext.jackson 依赖项使用了不在构建路径上的 com.sun.msv.* 类。由于我认为您的代码当前正在运行,这意味着不需要包含这些类,并且可以忽略这些警告。因此,我添加了 -dontwarn 选项,以便 ProGuard 在出现警告时不会出错。

    我能够成功使用依赖项混淆 jar 的最终 POM 如下:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.mycompany</groupId>
        <artifactId>myproduct</artifactId>
        <version>1.0-SNAPSHOT</version>
        <repositories>
           <repository>
               <id>spongepowered</id>
               <url>https://repo.spongepowered.org/maven</url>
           </repository>
           <repository>
               <id>restlet</id>
               <url>http://maven.restlet.com</url>
           </repository>
        </repositories>
        <properties>
            <restlet-version>2.3.5</restlet-version>
        </properties>
        <build>
           <resources>
                <resource>
                    <directory>${project.basedir}/src/main/resources</directory>
                    <filtering>true</filtering>
                </resource>
            </resources>
            <plugins>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.3</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>templating-maven-plugin</artifactId>
                    <version>1.0-alpha-3</version>
                    <executions>
                        <execution>
                            <id>filter-src</id>
                            <goals>
                                <goal>filter-sources</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>assembly</id>
                            <goals>
                                <goal>single</goal>
                            </goals>
                            <phase>package</phase>
                            <configuration>
                                <descriptorRefs>
                                    <descriptorRef>jar-with-dependencies</descriptorRef>
                                </descriptorRefs>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>com.github.wvengen</groupId>
                    <artifactId>proguard-maven-plugin</artifactId>
                    <version>2.0.8</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals><goal>proguard</goal></goals>
                            <configuration>
                                <injar>${project.build.finalName}-jar-with-dependencies.jar</injar> <!-- make sure to obfuscate the jar with dependencies -->
                                <proguardVersion>5.2</proguardVersion>
                                <options>
                                    <option>-allowaccessmodification</option>
                                    <option>-dontoptimize</option>
                                    <option>-dontshrink</option>
                                    <option>-dontnote</option>
                                    <option>-dontwarn</option> <!-- added option to ignore com.sun missing classes -->
                                    <option>-keepattributes Signature</option>
                                    <option>-keep class com.mycompany.MyPlugin { *; }</option>
                                </options>
                                <libs>
                                    <lib>${java.home}/lib/rt.jar</lib>
                                </libs>
                                <dependencies>
                                    <dependency>
                                        <groupId>net.sf.proguard</groupId>
                                        <artifactId>proguard-base</artifactId>
                                        <version>5.2</version>
                                        <scope>runtime</scope>
                                    </dependency>
                                </dependencies>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
        <dependencies>
           <dependency>
                <groupId>org.spongepowered</groupId>
                <artifactId>spongeapi</artifactId>
                <version>3.0.0</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
            <dependency>
                <groupId>org.easytesting</groupId>
                <artifactId>fest-assert-core</artifactId>
                <version>2.0M8</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-core</artifactId>
                <version>1.10.19</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.restlet.jse</groupId>
                <artifactId>org.restlet</artifactId>
                <version>${restlet-version}</version>
            </dependency>
            <dependency>
                <groupId>org.restlet.jse</groupId>
                <artifactId>org.restlet.ext.jackson</artifactId>
                <version>${restlet-version}</version>
            </dependency>
            <dependency>
                <groupId>com.googlecode.json-simple</groupId>
                <artifactId>json-simple</artifactId>
                <version>1.1.1</version>
            </dependency>
        </dependencies>
    </project>
    

    【讨论】:

    • 我遇到了同样的问题,没有得到您的答案。为什么需要添加存储库?依赖项已在 pom.xml 中指定。为什么 Proguard 需要更多?此外,您在哪里可以找到每个依赖项的存储库?你介意看看stackoverflow.com/questions/36150297/…
    • @tunaki ,我收到此错误,清理未关闭的 ZipFile 存档 /Users/sulhadin/.m2/repository/org/bouncycastle/bcprov-jdk15on/1.56/bcprov-jdk15on-1.56.jar [ INFO] 总时间:03:10 min [INFO] 完成时间:2019-04-05T09:56:40+03:00 [INFO] -------------------- -------------------------------------------------- --- [ERROR] GC 开销限制超出 -> [Help 1] java.lang.OutOfMemoryError: GC 开销限制超出
    • @sulhadin 该错误表明您的 zip 文件太大,以至于在使用默认分配大小时内存不足。因此,您将需要使用更多内存来运行 Maven。有关如何告诉 Maven 告诉 JVM 使用 MAVEN_OPTS 变量分配更多堆空间的信息,请参阅stackoverflow.com/questions/12498738/…
    猜你喜欢
    • 2013-06-07
    • 1970-01-01
    • 2012-06-09
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    相关资源
    最近更新 更多