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 时会从 Play Services lib 获得 ClassNotFoundException?