RelaxNG: слияние грамматики внутри банки

Я использую RelaxNG и Jing (валидатор RelaxNG на Java) для проверки некоторых файлов XML, и мне нужно объединить грамматики (повторное использование определений элементов в двух грамматиках).
Чтобы добиться слияния, я включаю грамматику с элементом, и я присвойте атрибуту href значение включенного файла грамматики:

<include href="embededGrammar.xml"/>

Все файлы грамматики расположены по одному и тому же пути в ресурсах моего проекта Java.
При тестировании приложения в среде IDE включенная грамматика найдена, и мои файлы данных XML проверяются.
Но когда я упаковываю приложение к файлу JAR, встроенная грамматика не найдена, и в сообщении об ошибке сообщается, что он пытается найти ее в том же месте, что и файл jar (не в файле jar в том же месте, что и грамматика внедрения, как это должно быть).

Я применил обходной путь, но я хотел бы внедрить чистое решение, поэтому, если кто-то решит такую ​​​​проблему, сообщите мне, как это сделать.
Спасибо.

РЕДАКТИРОВАТЬ: он работает нормально, если я жестко запрограммирую значение href, чтобы указать на файл внутри файла jar (jar:file:./jarfile.jar/path/to/file/ebeddedGrammar.xml), но имя файла jar может измениться ( добавляется номер версии), кроме того, это невозможно протестировать в среде IDE.


person Olivier Meurice    schedule 01.04.2015    source источник


Ответы (1)


Я нашел решение, состоящее в регистрации URLStreamHandler, который позволяет ссылаться на URL-адрес ресурсов с помощью протокола пути к классам, как мы можем сделать с инфраструктурой Spring. В результате я могу обратиться к встроенному файлу грамматики следующим образом:

<include href="classpath:path/to/resource/embeddedGrammar.xml"/>

Четкое объяснение того, как зарегистрироваться и использовать URLStreamHandler, можно найти здесь: URL для загрузки ресурсов из пути к классам в Java

person Olivier Meurice    schedule 01.04.2015