выполнение Java-метода с зависимостями внутри динамически загружаемого класса - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть JAR-файл с собственными библиотеками, как и у любого другого проекта NetBeans.Кроме того, у меня есть папка с плагинами для хранения плагинов в формате .jar.Я загружаю плагины с помощью URLClassLoader и также без проблем выполняю правильный метод.

Однако файл jar в папке плагинов может содержать зависимости с другими пакетами (например, java-mail)) которые не находятся в моем пути к классам (папка плагинов также нет в моем пути к классам), поэтому я беспокоюсь, будет ли этот плагин работать правильно.Я также не знаю, где мне хранить эту зависимость.

Могу ли я что-нибудь сделать, чтобы преодолеть эту проблему?Где я должен хранить зависимость плагина?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 07 апреля 2011

Согласно biziclop, я поместил зависимости внутри папки плагина.Кажется, это работает, но мне нужно было загрузить дополнительные пакеты.

Чтобы уточнить, я сделал плагин, используя библиотеку apache httpClient.Я сделал файл jar, а затем поместил файл jar с его зависимостями (httpClient и httpCore) в папку плагина.Когда я выполнил плагин, «NoClassDefFoundError» появился.Чтобы преодолеть эту проблему, я скачал пакеты «commons-logging» и «servlet» и добавил их в папку плагина.

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

Спасибо за помощь!

0 голосов
/ 07 апреля 2011

Класс ClassLoader использует модель делегирования для поиска классов и ресурсов.Каждый экземпляр ClassLoader имеет связанный родительский загрузчик классов.При запросе на поиск класса или ресурса экземпляр ClassLoader делегирует поиск класса или ресурса своему загрузчику родительского класса, прежде чем пытаться найти сам класс или ресурс.Встроенный загрузчик классов виртуальной машины, называемый «загрузчиком классов начальной загрузки», сам по себе не имеет родителя, но может служить родителем экземпляра ClassLoader.

(из javadocиз ClassLoader)

Приведенный выше абзац означает, что обычно ваши загрузчики классов формируют дерево, и каждый из них запрашивает своего родителя перед тем, как попытается загрузить класс.Таким образом, теоретически, если ваши зависимости видны либо загрузчику классов, который загружает плагин, либо любому из загрузчиков класса выше по потоку, он будет работать.

Однако есть два предостережения с этим:

  1. Если ваш плагин вызывает Thread.setContextClassLoader(), это может все испортить.Но это должно больше беспокоить авторов плагинов, чем вас.
  2. Веб-серверы обычно не подчиняются этому правилу делегирования, чтобы обеспечить максимальное разделение между различными веб-приложениями и самим сервером.

(я мог бы дать менее общий ответ, если бы был какой-то код, на который я мог бы взглянуть.)

...