Загрузка внешней Java-функции через XQuery с Saxon - PullRequest
0 голосов
/ 30 августа 2018

Я могу получить доступ к классу и методам Java при выполнении xquery с Saxon, когда они объявлены правильно (через пространство имен, указывающее на пакет и класс), но мне интересно, есть ли способ создать своего рода "динамический" путь к классу при каждом запуске загружать внешний jar-файл и искать в нем классы, а не в текущем пути к классу проекта / программы (так как я не могу добавить в него все возможные классы). Так, например, у меня есть что-то вроде:

declare namespace dpr="java:com.*****.atm.dpr.common.util.DPRConfigurationLoader";
declare variable $rules as node()* := doc(dpr:getApplicationProperty('Common','RulesFileLocation'))//category;

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

Так что, если я предоставлю банку, содержащую нужные мне классы, есть ли способ загрузить ее так, чтобы пространство имен указывало на нее? Я знаю, что могу загрузить файл .class, если они находятся на пути к классам, но 3 файла jar полностью?

Спасибо.

1 Ответ

0 голосов
/ 31 августа 2018

Технически, Saxon не требует, чтобы внешние классы были в пути к классам - он требует, чтобы они были доступны с использованием соответствующего ClassLoader. Если вы понимаете ClassLoaders и готовы написать свои собственные или настроить сторонние предложения, то вы можете загружать классы из любого места. Все крючки есть в саксонском, если вы хотите делать такие вещи; но с продуктом ничего не упаковано.

Вот некоторые вещи, которые вы можете попробовать:

  • С помощью Configuration.setDynamicLoader() вы можете изменить способ, которым Saxon выполняет динамическую загрузку внешних классов, включая классы, используемые для функций расширения Java.
  • С Configuration.getDynamicLoader().setClassLoader() вы можете предоставить другой ClassLoader для загрузки классов, например, URLClassLoader.
  • С помощью ProfessionalConfiguration.setExtensionBinder("java", XXX) вы можете зарегистрировать настраиваемую библиотеку JavaExtensionLibrary, как правило, в качестве подкласса стандартного, что позволяет изменить способ сопоставления URI с классами Java и способ выбора методов (например)

Это все низкоуровневое системное программирование, и оно не для слабонервных.

...