java 如何从虚拟机获取类路径?

j9per5c4  于 2022-12-17  发布在  Java
关注(0)|答案(2)|浏览(173)

我有一个VirtualMachine,我想从中提取“类路径”。本例中的VM使用RawCommandLineLauncher启动。
我能找到的最接近的方法是VirtualMachine方法allClasses,但是我想在此之上再做一步,得到一个类目录列表,这可能吗?
我试过:

  • 正在从VM获取ClassLoader。认为这不可能。
  • 为此使用JDI实现。不幸的是,该方法不是公共的。
cedebl8k

cedebl8k1#

jinfo <pid>命令提供了一些洞察力,例如,它包含了一个正在运行的eclipse示例:

[...]
VM Arguments:
[...]
java_class_path (initial): C:\foo\bar\eclipse\jee-2022-06\eclipse\\plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar
[...]

然而,这只是应用程序启动时的初始类路径。根据应用程序的不同,它可能会根据运行时信息创建额外的类加载器,从而在运行时扩展类路径。例如,如果您正在运行一个Sping Boot Fat jar,初始类路径将包含FATJAR,并因此包含除JVM类本身之外的所有附加类。但是,这个fat jar是以spring Boot 格式存在的,实际的类路径由fat jar中包含的jar组成。

11dmarpk

11dmarpk2#

您可以检查并强制转换为子接口PathSearchingVirtualMachine

if (vm instanceof PathSearchingVirtualMachine psvm) {
    List<String> cp = psvm.classPath();
}

上面的例子使用了instanceof pattern matching,这是一个新的语言特性,如果你使用的是旧版本的Java,那么就做一个普通的转换。

相关问题