выполнение метода Java с зависимостями внутри динамически загружаемого класса

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

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

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

Спасибо.


person Juan    schedule 06.04.2011    source источник


Ответы (2)


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

(из javadoc ClassLoader)

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

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

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

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

person biziclop    schedule 06.04.2011

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

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

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

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

person Juan    schedule 07.04.2011