Ant任务只保留JAR中的某些类 - 具有依赖性检查?

时间:2012-03-01 09:20:20

标签: java ant jar

我想知道是否可以编写一个Ant任务(必要时使用其他一些库)来减少JAR文件,使其只包含某些类及其所依赖的类。

例如,我有一个包含A,B,C和D类的JAR,其中A和B都扩展C.D独立于其他。我想要做的是指定一个Ant任务,我只需要B类,最后得到一个只包含B和C的JAR文件。

我看过this answer提供了一种简单的方式来说“我不想要A和D”,我想用“包含”替换“排除”将允许我指定“我确实想要” B和C“像这样:

<jar destfile="stripped.jar">
    <zipfileset src="full.jar" includes="path/B.class;path/C.class"/>
</jar>

...但是有一种依赖感知的方式这样做,以便我可以说“我想要B”但最终得到一个包含B及其依赖项的JAR?

2 个答案:

答案 0 :(得分:3)

你可以看一下混淆工具,他们也可以经常删除死代码,即代码中没有引用的类,方法等。

例如,您可以使用ProGuard

来自文档:

ProGuard是一个免费的Java类文件收缩器,优化器,混淆器和预验证器。它检测并删除未使用的类,字段,方法和属性。它优化字节码并删除未使用的指令。它使用简短的无意义名称重命名剩余的类,字段和方法。最后,它预先验证了Java 6或Java Micro Edition的已处理代码。

您可以将其配置为仅执行收缩步骤。在您的情况下,您将使用-keep选项告诉ProGuard您想要B类,并按照您的描述结束B和C.这可能不是您想要的,但是因为ProGuard还将删除未使用的方法等,修改JAR文件中的类(我不知道任何关闭此选项的选项)。此外,您需要告诉ProGuard不要执行其通常执行的任何其他操作,例如混淆。

如果ProGuard不符合您的需求,您可以查找其他混淆和/或缩小工具。希望这有帮助,祝你好运!

答案 1 :(得分:3)

作为user829876 suggestsProGuard可以是一个选项。

另一个可能更接近您所寻找的选项是GenJar。多年来没有太多的活动,但听起来它会做你需要的。您可以找到一些示例here。没有many alternatives

您可能想要研究的另一个工具是Autojar。它似乎没有Ant任务,但您可以使用Java任务来实现它。

我从来没有使用过这些工具,但尝试一下并看看哪些适合你并不需要花太多时间。如果需要,可以使用这些来源进行调整。