2015-11-17 2 views
0

У меня проблема с зависимостями в моем приложении 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, не введя прямую зависимость между плагинами, которые его используют?

+0

Поскольку Saxon при выполнении вашей таблицы стилей нуждается в поиске InformationProvider, это звучит для меня как зависимость, и я не вижу, как вы можете его удалить. (Но я совсем не знаю Eclipse) –

+0

Можно ли указать SAXON, какой загрузчик классов использовать? –

+0

Теперь я помню, да, Eclipse имеет довольно специализированные требования ClassLoader. И действительно, Saxon позволяет настраивать его. Вы можете сделать setup.getDynamicLoader(). SetClassLoader(), или если вы хотите, чтобы вы могли написать свой собственный подкласс net.sf.saxon.trans.DynamicLoader, зарегистрируйте его с помощью configuration.setDynamicLoader(), а затем позаботитесь обо всем вещь самостоятельно. –

ответ

0

Благодаря помощи Майкла я смог решить проблему.

То, что я сделал это, чтобы создать новый плагин (SAXON оболочки) с целью:

  1. Оберточной саксонские библиотеки и предлагает функциональные возможности брикетирования преобразования XSLT.
  2. Укажите точку расширения, чтобы другие плагины могли вносить свой вклад в их загрузчики классов.
  3. Внесите свой собственный загрузчик классов, который будет действовать как набор нескольких загрузчиков классов (многоклассовый загрузчик).

Плагины, имеющие классы, которые должны быть доступны из преобразования XSLT, будут способствовать добавлению точки расширения «Classloader» нового плагина, отправив ссылку на их загрузчик классов. В моем случае плагин «B».

Плагины, которые выполняют преобразования XSLT, делегируют это действие новому плагину. В моем случае плагин «А».

Плагин-оболочка SAXON будет собирать все загрузчики классов из всех плагинов-разработчиков и будет строить многоклассовый загрузчик, который будет знать обо всех классах участников.

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

// Retrieve the multi-class loader 
Classloader multiClassloader = ClassLoaderProviderManager.getMultiClassLoader(); 
Configuration saxonConfiguration = new Configuration(); 
saxonConfiguration.getDynamicLoader().setClassLoader(multiClassloader); 

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