如何检测Java类路径中缺失符号的使用情况

时间:2016-05-19 12:02:06

标签: java

我有时在Java中面临依赖地狱。这是众所周知的问题:库A依赖于版本2.5中的库C而库B也依赖于C,但是版本2.6。然后我必须解决问题:两个版本的C库是否向后兼容?我可以在一个应用程序类路径中使用库A,B和C吗?或者我应该用旧版本的C创建A的“阴影束”吗?

如果两个版本的C库不兼容并且我使用它,通常可以启动应用程序。但是经过几个小时或几天后,“没有这种方法”的例外情况就会发生!我希望在应用程序启动之前检测此问题,而不是在运行时。

问题:是否存在一些可以列出课堂中所有已使用符号的工具以及所有按类提供的符号?然后我可以创建检测已使用但缺少符号的脚本......

3 个答案:

答案 0 :(得分:1)

javap命令可以列出一个类定义的所有符号

javap -c命令将类使用的外部方法和字段显示为反汇编字节码中的注释。你也许可以取消它们。

答案 1 :(得分:1)

一位同事建议我迁移管理器(https://www.lightbend.com/community/core-tools/migration-manager),它显示了类路径中的二进制不兼容性(一个库的两个版本)。这不是我想要的,但它有很多帮助......

$java -jar migration-manager-cli-0.1.9.jar \
  --prev ~/.m2/repository/com/google/protobuf/protobuf-java/2.4.1/protobuf-java-2.4.1.jar  \
  --curr ~/.m2/repository/com/google/protobuf/protobuf-java/2.5.0/protobuf-java-2.5.0.jar \
  --direction both

Found 393 binary incompatibilities
==================================
 * abstract method getNameBytes()com.google.protobuf.ByteString in interface
   com.google.protobuf.DescriptorProtos#ServiceDescriptorProtoOrBuilder is
   present only in current version

...

答案 2 :(得分:1)

此处讨论的类似问题:

How to identify a missing method (Binary Compatibility) in a JAR statically

快速谷歌搜索显示了可能的解决方案:

http://vongosling.github.io/dependency-mediator/

(但我没有使用该工具的经验)