Java Ant任务只在JAR中保留某些类-使用依赖项检查?

Java Ant任务只在JAR中保留某些类-使用依赖项检查?,java,ant,jar,Java,Ant,Jar,我想知道是否有可能编写一个Ant任务(必要时使用其他库)来简化JAR文件,使其只包含某些类以及它们所依赖的类 例如,我有一个包含类a、B、C和D的JAR,其中a和B都扩展了C。D独立于其他类。我想做的是指定一个我只需要B类的Ant任务,并最终得到一个只包含B和C的JAR文件 我已经看到,它提供了一种简单的方式来表示“我不想要a和D”,我想用“包含”替换“排除”将允许我指定“我确实想要B和C”,如下所示: <jar destfile="stripped.jar"> <zi

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

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

我已经看到,它提供了一种简单的方式来表示“我不想要a和D”,我想用“包含”替换“排除”将允许我指定“我确实想要B和C”,如下所示:

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


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

您可以看看模糊处理工具,它们通常也可以删除死代码,即代码中任何地方都没有引用的类、方法等

例如,您可以使用

从文件中:

ProGuard是一个免费的Java类文件收缩器、优化器、混淆器和预验证器。它检测并删除未使用的类、字段、方法和属性。它优化字节码并删除未使用的指令。它使用无意义的短名称重命名其余的类、字段和方法。最后,它预先验证了Java 6或Java Micro Edition的已处理代码。 您可以将其配置为仅执行收缩器步骤。在您的情况下,您可以使用
-keep
选项告诉
ProGuard
您想要B类,并按照您的描述以B和C结束。但是,这可能不是您想要的,因为
ProGuard
还将删除未使用的方法等,修改JAR文件中的类(我不知道有什么选项可以关闭它)。此外,您还需要告诉ProGuard不要执行它通常执行的任何其他操作,例如模糊处理

如果
ProGuard
不适合您的需要,您可以寻找其他模糊处理和/或收缩工具。希望这有帮助,祝你好运

As可能是一种选择

另一个可能更接近您所寻找的选项是。已经有几年没有太多的活动了,但听起来它能满足你的需要。你可以找到一些例子。没有太多

您可能需要研究的另一个工具是。它似乎没有Ant任务,但您可能可以使用该任务来启动它


我从来没有使用过这些工具,但不需要花太多的时间来尝试一下,看看什么对你有用。如果需要,可以使用源代码进行调整。

请注意,答案中提到的所有工具只会找到显式依赖项,而不会找到通过反射获得的依赖项(包括依赖项注入和许多应用程序框架采用的类似机制)。