确定加载失败的 class 文件的路径

Determine path of class file that failed to load

我们得到一个 UnsupportedClassVersionError 但在识别有问题的文件的位置时遇到问题(class 路径中有超过 15 个 JAR,其中几个可能包含特定的 class)。我们怀疑同一个 class 可能多次出现在 class 路径中。

Java 选项 -verbose:class 打印出我们想要的内容,但仅针对 成功 加载的 class 。导致错误的class(文件)没有打印出来。

我们如何确定导致 class 加载程序错误的 class 文件(很可能在 JAR 中)的物理位置?

我认为可以在 ClassLoader 中设置断点,但所有相关方法都是 native

我会执行以下操作:

log.info(ClassLoader.getSystemResource("com/acme/MyClass.class"));

为class com.acme.MyClass.

Java 的 class 完全依赖 class 路径的加载器 按顺序 搜索它并使用(或尝试到)他们为他们试图加载的任何给定 class 找到的第一个定义。特别是,哪个 class Java 首先发现需要您的问题 class 并不重要。这些 class 加载程序对它们尝试加载的每个 class 执行相同的路径搜索。

很可能 class 名称——尤其是它的包——会让你知道要检查哪些 jar,但你并不真的需要它。最简单和最可靠的解决方案是像 Java 那样做:检查每个 jar,按照它在 class 路径中出现的顺序。

您可以使用 jar -tf myjar.jar 列出 jar 的内容。如果您要查找 org.other.SomeClass,它会在 jar 中显示为 /org/other/SomeClass.class