从JVM内部转储类路径上的类的方法?

haw*_*eye 4 java jvm diagnostics classpath

我的代码失败了ClassNotFoundException.

我可以看到包含该类的jar文件肯定在命令提示符执行的类路径中.

有没有办法从JVM转储类路径上的类列表?(理想情况下是一些Java代码).

(我不想在目录中看到类,我想查看加载到JVM中的列表).

pru*_*nge 12

您可以通过查看类加载器并转储它们正在加载的URL来以编程方式显示类路径.

像这样的东西:

import java.net.URLClassLoader;
import java.util.Arrays;

public class ClasspathDumper
{
    public static void main(String... args)
    {
        dumpClasspath(ClasspathDumper.class.getClassLoader());
    }

    public static void dumpClasspath(ClassLoader loader)
    {
        System.out.println("Classloader " + loader + ":");

        if (loader instanceof URLClassLoader)
        {
            URLClassLoader ucl = (URLClassLoader)loader;
            System.out.println("\t" + Arrays.toString(ucl.getURLs()));
        }
        else
            System.out.println("\t(cannot display components as not a URLClassLoader)");

        if (loader.getParent() != null)
            dumpClasspath(loader.getParent());
    }
}
Run Code Online (Sandbox Code Playgroud)

它会产生类似于的输出:

Classloader sun.misc.Launcher$AppClassLoader@2a340e:
    [file:/C:/Java/workspaces/myproject/bin/]
Classloader sun.misc.Launcher$ExtClassLoader@bfbdb0:
    [file:/C:/Java/jdk/jdk1.7.0/jre/lib/ext/dnsns.jar, file:/C:/Java/jdk/jdk1.7.0/jre/lib/ext/localedata.jar, file:/C:/Java/jdk/jdk1.7.0/jre/lib/ext/sunec.jar, file:/C:/Java/jdk/jdk1.7.0/jre/lib/ext/sunjce_provider.jar, ...]
Run Code Online (Sandbox Code Playgroud)


Raj*_*ran 5

..?(理想情况下是一些Java代码)

如果您只想解决Class-Not-Found错误,那么在应用程序中添加转储代码会增加复杂性,以便以后关闭它.也许最好使用-verbose:class JVM参数,它将输出在运行时加载的所有类.它易于关闭和控制台的输出可以很容易地重定向到日志.