从已编译的 类 中推导出公开可用的 Java 代码的版本

Deducing the version of publicly-available Java code from compiled classes

我目前正在使用一个旧的 Java SE 项目,该项目有任何类型的 SLF4J as a dependency (e.g. referring to org.slf4j.Logger), but the relevant classes are packaged in a very strange JAR simply called commons.jar, and I couldn't find any matching libraries on the Internet which have contents matching this file; Is there any "intelligent" way of finding code which matches the compiled Java class files found inside this JAR file? The file itself has no metadata 版本 — 仅编译 *.class 个文件:

commons.jar
├── apache
│   ├── commons 
│   ├── http
│   ├── log4j
├── slf4j

如上面的结构所示​​,JAR 似乎 "belong" 不适合任何常见的分发者;即使它包含术语 apachecommonslog*slf4j ,好像不是来自Apache Commons,也不是来自SLF4J。

当前方法

目前,我能想到的最好的办法是下载一堆SLF4J版本,解压它们,然后运行例如cmp 来自神秘 JAR 的 org/slf4j/Logger.class 文件和来自每个版本的类似 Logger.class 文件,例如

cmp commons/org/slf4j/Logger.class slf4j-1.7.22/slf4j-api-1.7.22/org/slf4j/Logger.class

然而,这不仅涉及大量工作,而且我相信等效源的编译可能会略有不同,具体取决于相关 JAR 的分发者使用的确切编译器......这意味着他们不会'不能逐字节进行比较。我怎样才能以更智能的方式进行这种搜索?

如何反映所有 public 和私有 类 及其成员,将它们放入字符串中,对字符串进行排序并为每个版本生成一个文本文件。

您将找到与该库的神秘版本完全匹配的一个库版本,或者找到一个较小的范围。

我会调查以下内容:

  • 字节码 Java 版本,为您提供有关库构建时间的线索
  • 反编译一切...也许你很幸运,找到了一些评论/版本常量,可以为你提供进一步的线索