Eclipse中的SAXON类加载问题

时间:2015-11-17 14:56:47

标签: eclipse-plugin saxon

我的Eclipse RCP应用程序中存在依赖项问题,我不知道如何正确解决它。

我有一个插件“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>

如上所述,当我从插件“A”执行前一个XSLT的转换时,一切正常,生成的HTML正确显示版本。

但是,我想摆脱插件“A”与插件“B”的依赖关系,因为它可能在未来容易出现依赖循环。删除依赖项时,SAXON无法找到“InformationProvider”类。

最后一个问题:是否有可能让SAXON看到插件“B”的类,而不会在使用它的插件之间引入直接依赖关系?

1 个答案:

答案 0 :(得分:1)

感谢迈克尔的帮助,我能够解决问题。

我所做的是创建一个新插件(SAXON包装器),目的是:

  1. 包装Saxon库并提供预先形成XSLT转换的功能。
  2. 提供一个扩展点,以便其他插件可以为其类加载器做出贡献。
  3. 实现我自己的类加载器,它将充当一组多个类加载器(多类加载器)。
  4. 具有必须可从XSLT转换访问的类的插件将通过发送对其类加载器的引用来为新插件的“Classloader”扩展点做出贡献。在我的案例插件“B”。

    执行XSLT转换的插件会将此操作委托给新插件。在我的案例插件“A”。

    SAXON包装器插件将从所有贡献者插件中收集所有类加载器,并将构建一个多类加载器,它将了解所有贡献者类。

    SAXON包装器插件将始终为SAXON变压器工厂设置一个新配置,该工厂将包括这样的多类加载器:

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

    通过这个解决方案,我能够删除丑陋的依赖项。缺点是,这种方法将使XSLT变换对每个贡献者插件中包含的所有类都可见。