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

标签 java dependencies shared-libraries versioning software-distribution

我目前正在使用一个旧的 Java SE 项目,它有一些版本的 SLF4J作为依赖项(例如引用 org.slf4j.Logger ),但是相关的类被打包在一个非常奇怪的 JAR 中,简称为 commons.jar,我在互联网上找不到任何匹配的库与此文件匹配的内容; 是否有任何“智能”方法来查找与在该 JAR 文件中找到的已编译 Java 类文件相匹配的代码?该文件本身没有 metadata任何类型——仅编译的*.class 文件:

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

如上面的结构所示​​,JAR 似乎不“属于”任何常见的分发器;尽管它包含术语 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 的分发者使用的确切编译器......这意味着它们不会在逐字节的基础上进行比较。我怎样才能以更智能的方式进行这种搜索?

最佳答案

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

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

关于java - 从已编译的类中推断出公开可用的 Java 代码的版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41642442/

相关文章:

java.lang.UnsatisfiedLinkError : Couldn't load eposprint: findLibrary returned null 错误

java - 带有 snmpv3 响应和错误的 SNMP4j 为空

具有多个通用参数的 java lambda 表达式未编译

java - 如何在 OSGi 中使用 Apache POI

perl - 在部署 Perl 项目之前如何确定 CPAN 依赖项?

linux - 如何将备用 glibc 与现有的 libstdc++ 一起使用?

linux - 如何对共享库进行版本控制?

java - 对树状图进行排序并没有真正起作用

java.security.Provider.getService(String, String) Java 监视器被阻止

c# - 不复制程序集的依赖程序集