2012-03-01 50 views
4

我想知道是否可以编写一个Ant任务(如果需要,使用其他库)来减少JAR文件,以便它只包含某些类以及它们所依赖的类。例如,我有一个包含类A,B,C和D的JAR,其中A和B都扩展C. D与其他类无关。我想要做的是指定一个Ant任务,我只需要B类,最后得到一个只包含B和C的JAR文件。Ant任务只保留JAR中的某些类,并进行依赖性检查?

我见过this answer它提供了一种简单的方式来说“I不希望A和d”,和我想象代替‘’用‘排除包括’可以让我指定‘我想B和C’这样的:

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

...但有这样做的依赖感知方式,以便我可以说“我想要B”但结束了包含B及其依赖项的JAR?

+1

请注意,答案中提到的所有工具只能找到显式依赖关系,而不能通过反射获取依赖关系(其中包括依赖注入和许多应用程序框架采用的类似机制)。 – 2012-03-02 13:32:17

回答

3

你可以看看混淆工具,它们也可以经常删除死代码,也就是类,方法之类的代码中没有引用的代码。

例如,您可以使用ProGuard

从文档:

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

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

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

3

由于user829876suggests,ProGuard可能是一种选择。

另一个选项,可能更接近您要查找的是GenJar。几年来没有太多的活动,但它听起来像它会做你所需要的。你可以找到一些例子here。有没有非常manyalternatives

您可能想要考虑的另一个工具是Autojar。它似乎没有Ant任务,但您可以使用Java任务来完成任务。

我从来没有使用这些工具,但它不应该花太多的尝试,看看什么对你有用。如果需要,这些来源可用于您的调整。