Метод сброса классов в путь к классам изнутри JVM?

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

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

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

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


person hawkeye    schedule 28.09.2011    source источник
comment
Ответы на этот вопрос служат другим вопросом: как узнать, какие ресурсы пути к классам не удалось загрузить во время инициализации JVM? - безопасность? файл не найден? и т.д? как получить список тех, кто сделал это, и тех, кто этого не сделал?   -  person Nicholas DiPiazza    schedule 27.02.2015


Ответы (4)


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

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

person Dave Newton    schedule 28.09.2011
comment
Хорошее понимание - особенно если у вас есть опечатка в пути к классам. Спасибо, что заметили «ложный путь». - person hawkeye; 05.03.2012

Вы можете программно отобразить путь к классам, посмотрев на загрузчики классов и выгрузив 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, ...]
person prunge    schedule 28.09.2011
comment
Очень замечательная функция - здесь перечислены JAR-файлы и каталоги, которые попали в путь к классам ... и не отображаются ли те, которые этого не сделали? - person Nicholas DiPiazza; 27.02.2015

..? (В идеале какой-нибудь Java-код)

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

person Rajeev Sreedharan    schedule 29.09.2011
comment
Здесь перечислены классы и ресурсы, которые попали в путь к классам ... и не отображаются ли те, которые этого не сделали? Хм - person Nicholas DiPiazza; 27.02.2015

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

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

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

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

person Thomas    schedule 28.09.2011
comment
Я не знал, что jmap предоставит вам ресурсы, загруженные в путь к классам. это интересно. - person Nicholas DiPiazza; 27.02.2015