Как узнать, какие классы загружены из каких JAR-файлов? - PullRequest
30 голосов
/ 04 июня 2009

Есть ли способ определить, какие классы загружаются из каких jar-файлов во время выполнения?

Я уверен, что мы все были в аду JAR раньше. Я сталкивался с этой проблемой много проблем с ClassNotFoundException s и NoClassDefFoundError s в проектах. Я хотел бы избежать нахождения всех экземпляров класса в jar-файлах и использования процесса исключения в коде, в результате чего CNFE находит виновника.

Дадут ли вам какие-либо инструменты профилирования или управления?

Эта проблема очень раздражает просто потому, что мы должны иметь эту информацию во время загрузки класса. Должен быть способ добраться до него или записать его и найти, но я ничего не знаю, что будет делать это, не так ли?

Я знаю, OSGi и версионные комплекты / модули стремятся сделать это не проблемой ... но, похоже, в ближайшее время это не исчезнет. :)

ПРИМЕЧАНИЕ: я нашел этот вопрос - это подмножество моего вопроса, связанного с классами, загруженными из версионных jar-файлов.

Обновление : В этой статье рассказывается о стратегии поиска класса внутри jar-файлов (либо в текущем каталоге), либо в вашем M2_REPO. JarScan, просканируйте все файлы JAR во всех подпапках для определенного класса

Обновление 2 : также несколько связано, JBoss Tattletale

Ответы [ 5 ]

56 голосов
/ 04 июня 2009

Передача ключа -verbose:class команде java напечатает каждый загруженный класс и откуда он был загружен.

Joops также является хорошим инструментом для поиска пропущенных классов заранее.

14 голосов
/ 04 июня 2009

Из кода можно звонить:

myObject.getClass().getProtectionDomain().getCodeSource()

(Примечание: getProtectionDomain может, к сожалению, вернуть null (плохой дизайн), поэтому «правильный код» проверит это.)

4 голосов
/ 26 февраля 2010

Существует MBean для флага JVM, упомянутого Jason Day выше.

Если вы используете JBoss, вы можете изменить это по требованию с помощью JMX, если добавите собственный сервер JMX MBean в свою конфигурацию. Добавьте следующие -D:

-Dcom.sun.management.jmxremote.port=3333
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djboss.platform.mbeanserver 
-Djavax.management.builder.initial=org.jboss.system.server.jmx.MBeanServerBuilderImpl
-DJBOSS_CLASSPATH="../lib/jboss-system-jmx.jar"

И затем вы можете увидеть эту настройку в java.lang: Classelling MBean и можете отключить его на лету. Это полезно, если вы хотите включить его только при выполнении определенного фрагмента кода.

Существует также MBean, который позволит вам ввести полное имя класса и посмотреть, откуда оно было загружено в иерархии классов. MBean называется LoaderRepository, и вы захотите вызвать операцию displayClassInfo (), передавая FQCN.

0 голосов
/ 08 апреля 2016

Вы можете легко экспортировать операцию JMX для доступа к информации о пакете для любого загруженного класса в вашем процессе, например:

  public static final class Jmx {

    @JmxExport
    public static Reflections.PackageInfo getPackageInfo(@JmxExport("className") final String className) {
      return Reflections.getPackageInfo(className);
    }
  }

и вот простой модульный тест для его экспорта и вызова:

  @Test
  public void testClassLocator() throws IOException, InstanceNotFoundException, MBeanException, ReflectionException {
    Registry.export(Jmx.class);
    Reflections.PackageInfo info = (Reflections.PackageInfo) Client.callOperation(
            "service:jmx:rmi:///jndi/rmi://:9999/jmxrmi",
            Jmx.class.getPackage().getName(),
            Jmx.class.getSimpleName(), "getPackageInfo", Registry.class.getName());
    System.out.println(info);
    Assert.assertNotNull(info);
  }

все это основано на использовании небольшой библиотеки утилит из spf4j (http://www.spf4j.org)

вы можете увидеть этот код на и тест на

0 голосов
/ 10 февраля 2016

В WebSphere (WAS) вы можете использовать функцию под названием «Class Loader Viewer»

Сначала включите средство просмотра загрузчика классов, выбрав Серверы> Типы серверов> Серверы приложений WebSphere> имя_сервера> Служба просмотра загрузчика классов, включите службу и перезапустите сервер.

Затем перейдите в раздел «Устранение неполадок»> «Средство просмотра загрузчика классов» и найдите свой класс или имя пакета.

https://www -01.ibm.com / поддержка / knowledgecenter / SSAW57_8.5.5 / com.ibm.websphere.nd.doc / ае / ttrb_classload_viewer.html? Ланг = еп

...