Maven、Proguard 和组装问题

Posted

技术标签:

【中文标题】Maven、Proguard 和组装问题【英文标题】:Maven, Proguard and assembly issues 【发布时间】:2010-10-27 05:18:07 【问题描述】:

我正在尝试让 Maven 与 ProGuard 一起工作。

我想要达到的目标如下:

对我的源文件运行 ProGuard 并生成混淆类

创建一个引用主类的清单文件,以便我可以将其作为 jar 执行

解压所有关联的库 jar 并创建一个包含所有这些的巨大 jar。此文件应仅联系 .class 和 .xml 文件。

将它们组装成 .zip 和 tar.gz 文件,其中包括各种 README.txt 文件等。

到目前为止,我有这样的东西:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.class.path.MainClass</mainClass>
                    </manifest>
                </archive>
                <includes>
                    <include>**/*.class</include>
                    <include>**/*.xml</include>
                </includes>
            </configuration>
        </plugin>

        <plugin>
            <groupId>com.pyx4me</groupId>
            <artifactId>proguard-maven-plugin</artifactId>
            <configuration>
                <options>
                    <option>-allowaccessmodification</option>
                </options>
                <obfuscate>true</obfuscate>
                <injar>classes</injar>
                <outjar>$project.build.finalName.jar</outjar>
                <outputDirectory>$project.build.directory</outputDirectory>
                <proguardInclude>src/main/assembly/proguard.conf</proguardInclude>
                <libs>
                    lib/rt.jar</lib>
                </libs>
            </configuration>
            <executions>
                <execution>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>proguard</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <id>assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>assembly</goal>
                    </goals>
                    <configuration>
                        <descriptors>
                            <descriptor>
                                src/main/assembly/bin.xml
                            </descriptor>
                        </descriptors>
                    </configuration>
                </execution>
            </executions>
        </plugin>

但我没有快乐。任何人都可以给我任何模糊的指示吗?

提前致谢, 马特

【问题讨论】:

@starblue Maven 没有任何 [assemblies] 概念。但是,[assembly] 是非常有效的。因此,请不要再表现得像标签是针对唯一域的那样,不包括与您的使用愿景不符的所有内容。标签用于设置,添加更多约束。不要禁止我使用也适用于 Maven 的标签。这太烦人了。 maven.apache.org/plugins/maven-assembly-plugin :此插件生成“程序集”。 【参考方案1】:

这是对我有用的配置

<plugin>
    <groupId>com.pyx4me</groupId>
    <artifactId>proguard-maven-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>proguard</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <obfuscate>true</obfuscate>
        <options>
            <option>-allowaccessmodification</option>
            <option>-keep public class com.class.path.MainClass  public *; public static *; </option>
        </options>
        <injar>$project.build.finalName.jar</injar>
        <outjar>$project.build.finalName-small.jar</outjar>
        <outputDirectory>$project.build.directory</outputDirectory>
        <libs>
            <lib>$java.home/lib/rt.jar</lib>
            <lib>$java.home/lib/jsse.jar</lib>
        </libs>
        <addMavenDescriptor>false</addMavenDescriptor>
    </configuration>
</plugin>

最终的jar是finalName-small.jar

【讨论】:

您使用包阶段而不是流程类阶段是否有原因?进程类在编译之后但在打包之前运行,因此您可以在目标/类被 jarred 之前访问它们。 已经有一段时间了,但据我记得我发现该插件基本上运行proguard,所以它喜欢得到一个罐子并发出另一个罐子。换句话说 - 许多试验和错误,这个工作...... 如何处理同一个项目中的多个 Maven 模块?你是在根 pom.xml 中运行插件,还是在 web ui 模块程序集中运行它? 抱歉,从未在同一个项目中处理过多个工件。

以上是关于Maven、Proguard 和组装问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 Proguard 进行改造警告

Android Proguard 跳过外部 jar

Spring boot使用ProGuard实现代码混淆

为啥我在使用 Proguard 时会从 Play Services lib 获得 ClassNotFoundException?

Proguard Maven 插件不使用指定的 Proguard 版本

在构建“maven-plugin”包时如何使用 Proguard 混淆?