【问题标题】:How can I test if my jar file has any unresolved dependencies?如何测试我的 jar 文件是否有任何未解决的依赖项?
【发布时间】:2012-01-03 08:05:32
【问题描述】:

我正在编写一个自定义工具来从我们的构建树构建 jar 文件。我们喜欢构建“最小” jar 文件,其中仅包含实际从“根”类(main() 所在的位置)引用的 .class 文件——依此类推,递归地遵循依赖关系。

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

好消息是,我的代码可以满足我的需求。但我需要绝对确定我没有搞砸,即我想确保我正在构建内部一致的 jar 文件,其中“一致”意味着所有未解析的引用都可以通过我们已知的第三方 jar 之一。

所以理想情况下,我想要一个可以运行的 MagicTool

MagicTool \
  --classpath commons-lang.jar:commons-collections.jar:[...etc...] \
  myapp.jar

这将检查myapp.jar 中每个未解析的引用,并确保它可以被传递给--classpath 的第三方jar 之一解析。如果没有,请呕吐。

【问题讨论】:

    标签: java jar dependencies classpath .class-file


    【解决方案1】:

    最好希望这条路径中没有任何东西包含任何类型的反射,forName 等。

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

    其他工具(如 ProGuard)会剔除未使用的类(除其他外),并带有相同的反射警告。

    我非常谨慎地尝试努力创建最小的 jar 文件;存在收益递减/风险增加的点。

    【讨论】:

      【解决方案2】:

      我很确定 ProGuard 是你的魔法工具,即使我现在不知道确切的调用语法。

      【讨论】:

        【解决方案3】:

        在几年前的某个阶段,尝试使用 jar -i 索引 JAR 文件会在存在未解决的依赖项时引发异常。我无法快速测试事物的当前状态。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-28
          • 2015-05-02
          • 2018-11-25
          • 2011-03-22
          • 2021-05-15
          • 1970-01-01
          • 2021-02-18
          相关资源
          最近更新 更多