Метод для дампа классов на classpath изнутри JVM? - PullRequest
4 голосов
/ 29 сентября 2011

Мой код не работает с ClassNotFoundException.

Я вижу, что файл jar, содержащий класс, определенно находится в пути к классам из выполнения командной строки.

Есть ли способ вывести список классов на пути к классам из JVM?(В идеале немного кода Java).

(я не хочу видеть классы в каталоге, я хочу видеть список того, что загружено в JVM).

Ответы [ 4 ]

11 голосов
/ 29 сентября 2011

Вы можете программно отобразить путь к классу, посмотрев на загрузчики классов и сбросив 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());
    }
}

будет выводиться аналогично:

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, ...]
5 голосов
/ 29 сентября 2011

..?(В идеале, некоторый Java-код)

Если вы пытались устранить только ошибку Class-Not-Found, то добавление кода дампа в приложение может усложнить его последующее отключение.Возможно, было бы лучше использовать аргумент -verbose: class JVM, который будет выводить все классы, загруженные во время выполнения.Его легко отключить, а вывод консоли можно легко перенаправить в журнал.

3 голосов
/ 29 сентября 2011

Это на самом деле не то, что вы хотите увидеть, если вы получаете CNFE, так как он не найден.Кроме того, не все доступные классы будут загружены в любой момент времени.

Начните с просмотра этого списка .Но в целом, если он не найден, он фактически не найден.

0 голосов
/ 29 сентября 2011

Ну, вы можете создать дамп памяти (например, через jmap) и просмотреть его (например, через jhat).

В качестве альтернативы, IIRC jconsole может показывать загруженные классы, так что вы можете просто просмотреть их. Хотя я не совсем уверен, и у меня сейчас нет работающей jconsole.

Третий вариант (для Java 5+) будет VisualVM , который является частью дистрибутива Java6 +.

Однако, скорее всего, ваш JAR-файл не находится на пути к классам, или вы используете некоторые пользовательские загрузчики классов. Не могли бы вы рассказать, как вы поставили эту баночку на путь к классу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...