【问题标题】:Statically checking a Java app for link errors静态检查 Java 应用程序的链接错误
【发布时间】:2010-05-25 11:34:23
【问题描述】:

我有一个场景,我针对库的版本 1 编写了代码,但我想发布库的版本 2。代码已发货,因此不可更改。我担心它可能会尝试访问 v1 中存在但在 v2 中已被删除的库的类或成员。

我认为可以编写一个工具来做一个简单的检查,看看代码是否会链接到新版本的库。我很欣赏即使代码链接,代码仍然可能非常破碎。我正在从另一面考虑这个问题 - 如果代码无法链接,那么我可以确定存在问题。

据我所知,我需要运行字节码检查对库类的引用、方法调用和字段访问,然后使用反射来检查类/成员是否存在。

我有三个问题:

(1)这样的工具已经存在了吗?

(2) 我有一种琐碎的感觉,它比我想象的要复杂得多,而且我错过了一些重要的事情 - 是这样吗?

(3)你知道一个方便的库,它可以让我检查字节码,以便我可以找到方法调用、引用等?

谢谢!

【问题讨论】:

标签: java reflection static-analysis backwards-compatibility bytecode-manipulation


【解决方案1】:

我认为Clirr - 一个二进制兼容性检查器 - 可以在这里提供帮助:

Clirr 是一个工具,用于检查 Java 库与旧版本的二进制和源代码兼容性。基本上,你给它两组 jar 文件,Clirr 会转储出公共 api 中的更改列表。 Clirr Ant 任务可以配置为在检测到不兼容的 api 更改时中断构建。在持续集成过程中,Clirr 可以自动防止意外引入二进制或源代码兼容性问题。

【讨论】:

  • @monorailkitty 除了接受它,您还可以投票赞成答案;)
【解决方案2】:

更改 IDE 中的库将导致所有可能的编译时错误。

您不需要其他任何东西,除非您的代码使用另一个库,而后者又使用更新后的库。

【讨论】:

    【解决方案3】:

    要特别小心 Spring 配置文件。类名配置为 text,直到运行时才会显示为缺失。

    【讨论】:

      【解决方案4】:

      如果您可以访问源代码,则可以针对新库编译源代码。如果它不编译,你肯定有问题。如果它编译你可能仍然有问题,如果程序使用反射,某种 IoC 的东西,如 Spring 等。

      如果您有单元测试,那么您可能有更好的更改来捕获任何链接错误。

      如果您只有一个程序的 .class 文件,那么除了将类文件反编译为源代码并针对新库再次编译源代码之外,我不知道有任何工具可以提供帮助,但这听起来不太健康.

      【讨论】:

        【解决方案5】:

        您提到的检查是由 JVM/Java 类加载器完成的,参见例如Linking of Classes and Interfaces.

        所以“尝试链接”可以通过尝试运行应用程序来简单地实现。当然,您可以自行对 .class/.jar 文件集合进行检查以运行它们。我猜像BCEL 这样的一些第三方字节码操作器也会为你做类似的检查。

        我注意到您在标签中提到了反射。如果你通过反射加载类/调用方法,一般是没有办法分析的。

        祝你好运!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多