Подтвердить что ты не робот

Проблемы с загрузчиками классов. Как определить, какие версии библиотек (jar файлы) загружены

Я только что решил использовать еще один вариант, но я-бы-использовал-это-версию-в-библиотеке, но, по-видимому, мой-приложение-сервер-уже-загрузил- version-of-this-library- * issue (sigh).

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

Спасибо заранее!

[P.S. Очень хорошая причина для начала использования архитектуры модуля OSGi на мой взгляд!]

Обновить: Эта статья также помогла! Это дало мне представление о том, какие классы загрузчиков классов JBoss загружаются, записывая их в файл журнала.

4b9b3361

Ответ 1

Если вы используете JBoss, есть MBean (репозиторий загрузчика класса iirc), где вы можете попросить всех загрузчиков классов, которые загрузили определенный класс.

Если все остальное не работает, всегда есть "java -verbose: class", который будет печатать местоположение банку для каждого загружаемого файла класса.

Ответ 2

Если у вас есть соответствующая информация о версиях в манифесте jar, есть методы для получения и проверки версии. Не нужно вручную читать манифест.

java.lang.Package.getImplementationVersion() и getSpecificationVersion() и isCompatibleWith() звучат так, как будто они будут делать то, что вы ищете.

Вы можете получить пакет с помощью this.getClass(). GetPackage() и другими способами.

Javadoc для java.lang.Package не предоставляет имена определенных атрибутов манифеста для этих атрибутов. Быстрый поиск в Google включил его в http://java.sun.com/docs/books/tutorial/deployment/jar/packageman.html

Ответ 3

В текущей версии Java, управление версиями библиотек - довольно wooly термин, который полагается на JAR, упакованный правильно с полезным манифестом. Даже тогда для работы приложения очень много работы, чтобы собрать эту информацию вместе полезным способом. Время выполнения JVm не дает вам никакой помощи.

Я думаю, что ваш лучший выбор - обеспечить соблюдение этого во время сборки, используя инструменты управления зависимостями, такие как Ivy или Maven, чтобы получить правильные версии всего.

Интересно, что Java 7, вероятно, будет включать в себя надлежащую модуляцию версий версий для такого рода вещей. Не то чтобы это помогло вам в данный момент,

Ответ 4

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

Упрощенное объяснение того, как это работает: EJB или веб-приложение сначала будут искать класс или ресурс в библиотеках, объявленных в его собственном модуле (ejb-jar или war). если класс не найден там, загрузчик класса пересылает запрос своему загрузчику родительского класса, который является либо объявленной зависимостью (обычно ejb), либо загрузчиком класса приложения, который отвечает за загрузку библиотек и ресурсов, объявленных в пакете уха, Если класс или ресурс все еще не найден, запрос перенаправляется на сервер приложений, который будет искать в своем собственном пути к классам.

При этом вам следует помнить, что модуль Java EE (веб-приложение, ejb) всегда будет загружать классы из банки, которая находится в ближайшей области. Например, если вы упаковываете log4j v1 в военный файл, log4j v2 на уровне ушей и ставите log4j v3 в свой путь к классу приложения, модуль будет использовать банку в своем собственном модуле. уберите это, и он будет использовать один на уровне уха. возьмите это, и он будет использовать тот, который находится в пути класса app-server. Все становится более сложным, когда у вас есть сложные зависимости между модулями.

Лучше всего разместить глобальные библиотеки приложений на уровне ушей.

Ответ 5

Должен быть лучший способ, чем то, как я это делаю, но я стараюсь сделать это очень вручную.

  • Каждый Jar должен иметь номер версии в имени файла (если он не меняет имя).
  • Каждое приложение имеет собственный путь к классам.
  • Должна быть причина для начала использования обновленного Jar (новая версия). Не изменяйте, потому что он доступен, измените, потому что он дает вам функциональность, которая вам нужна.
  • Каждая версия должна включать все необходимые Jars.
  • Я сохраняю класс версии, который знает список необходимых им Jars (он закодирован в исходный файл) и может быть проверен во время выполнения против списка Jars в пути к классам.

Как я уже сказал, это руководство, но оно работает.