如何测试我的jar文件是否有任何未解析的依赖项?

时间:2011-11-21 20:47:37

标签: java jar dependencies classpath .class-file

我正在编写一个自定义工具来构建来自构建树的jar文件。我们喜欢构建“最小”jar文件,其中只包含实际从“root”类引用的.class文件(其中main()存在) - 依此类推,递归跟随依赖项。

从历史上看,我们通过让javac遵循源依赖关系来完成此操作,但这意味着要多次重新编译公共文件。 (我们从单个源代码树构建60或70个不同的应用程序jar。)我正在编写一个新的构建系统,只编译每个源文件一次,但这意味着我们需要通过解析.class文件来遵循依赖项。

好消息是,我有能够完成我想要的工作代码。但我需要绝对确定我没有搞砸它,即我想确保我正在构建内部一致的jar文件,其中“一致”意味着所有未解析的引用都可以解决我们已知的第三方罐子之一。

理想情况下,我想要一个可以像

一样运行的MagicTool
MagicTool \
  --classpath commons-lang.jar:commons-collections.jar:[...etc...] \
  myapp.jar

将检查myapp.jar中的每个未解析的引用,并确保它可以通过传递给--classpath的第三方jar解析。如果没有,barf。

3 个答案:

答案 0 :(得分:2)

更好的希望,在这条道路上没有任何东西包括任何形式的反思,forName等等。

我使用depfind(如果我没有使用我自己的Java探险工具),它可能会或可能不会以对您有帮助的方式提供输出。 jdepend是另一种选择,尽管我从未将它用于除包级依赖之外的任何其他选项。

像ProGuard这样的其他工具会删除未使用的类(以及其他内容),并使用相同的反射警告。

我非常谨慎地尝试太多难以创建最小的jar文件;有一个收益递减/风险增加的点。

答案 1 :(得分:1)

我很确定ProGuard是你的神奇工具,即使我现在还没有确切的调用语法。

答案 2 :(得分:0)

在几年前的某个阶段,尝试使用jar -i索引JAR文件,如果存在未解析的依赖项,则会抛出异常。我无法快速测试当前的状态。