如何探索从哪些 JAR 加载哪些类?

2022-09-01 10:16:52

有没有办法确定在运行时从哪些 JAR 加载哪些类?

我敢肯定,我们以前都过JAR地狱。我已经在项目上遇到了这个问题很多故障排除。我想避免在 JAR 中找到某个类的所有实例,并在代码上使用消除过程,从而导致 CNFE 找到罪魁祸首。ClassNotFoundExceptionNoClassDefFoundError

任何分析或管理工具都会为您提供此类信息吗?

这个问题非常烦人,纯粹是因为在加载类时我们应该有这些信息。必须有一种方法可以到达它,或者记录它并找到它,但我不知道什么会这样做,对吧?

我知道OSGi和版本化捆绑包/模块旨在使这成为一个非问题...但它似乎不会很快消失。

注意:我发现这个问题是我的问题的子集,与从版本化jar加载的类有关。

与此相关的是,这篇文章解释了一种在JAR中(在当前目录下)或M2_REPO中搜索类的策略:JarScan,扫描所有子文件夹中所有JAR文件以查找特定类。

也有些相关,JBoss Tattletale


答案 1

将开关传递给命令将打印加载的每个类以及从何处加载它。-verbose:classjava

Joops也是提前查找缺失类的好工具。


答案 2

从代码中,您可以调用:

myObject.getClass().getProtectionDomain().getCodeSource()

(注意,不幸的是,可能会返回(糟糕的设计),所以“正确的代码”会检查这一点。getProtectionDomainnull


推荐