У меня проблема с зависимостями в моем приложении RCP Eclipse, которое я не знаю, как правильно его разрешить.Проблемы с загрузкой класса SAXON в Eclipse
У меня есть плагин «A», который имеет класс, отвечающий за выполнение преобразований XSLT, и имеет зависимость от net.sf.saxon (9.1.0) и bundle «B».
...
Bundle-Name: A
Require-Bundle: net.sf.saxon;bundle-version="[9.1.0,9.1.1)", B
...
С другой стороны, у меня есть плагин «B», который имеет класс «InformationProvider», который предлагает статические методы, вызываемые из процесса трансформации XSLT. Поэтому этот плагин определяет политику приятеля в своем манифесте, чтобы позволить Saxon использовать его классы.
...
Bundle-Name: B
Eclipse-RegisterBuddy: net.sf.saxon
Eclipse-BuddyPolicy: registered
...
Класс в плагин "B":
package com.b.information;
...
public final class InformationProvider {
...
public static String getSystemVersion() {
return "1.0";
}
...
}
Ниже приводится содержание XSLT:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:myUtil="java:com.b.information.InformationProvider">
<xsl:template match="/">
<html>
<p><h1>System Information</h1></p>
<p><h3>Version:</h3> <xsl:value-of select="myUtil:getSystemVersion()"/></p>
</html>
</xsl:template>
</xsl:stylesheet>
Как описано выше, когда я выполнить преобразование предыдущего XSLT из плагин «A» работает отлично, а сгенерированный HTML корректно отображает версию.
Однако я хотел бы избавиться от зависимости от плагина «А» до плагина «В», так как он может склоняться к циклам зависимостей в будущем. При удалении зависимостей SAXON не может найти класс «InformationProvider».
Заключительный вопрос: возможно ли сделать классы плагина «В» видимыми для SAXON, не введя прямую зависимость между плагинами, которые его используют?
Поскольку Saxon при выполнении вашей таблицы стилей нуждается в поиске InformationProvider, это звучит для меня как зависимость, и я не вижу, как вы можете его удалить. (Но я совсем не знаю Eclipse) –
Можно ли указать SAXON, какой загрузчик классов использовать? –
Теперь я помню, да, Eclipse имеет довольно специализированные требования ClassLoader. И действительно, Saxon позволяет настраивать его. Вы можете сделать setup.getDynamicLoader(). SetClassLoader(), или если вы хотите, чтобы вы могли написать свой собственный подкласс net.sf.saxon.trans.DynamicLoader, зарегистрируйте его с помощью configuration.setDynamicLoader(), а затем позаботитесь обо всем вещь самостоятельно. –