Eclipse plugin Eclipse中的SAXON类加载问题

Eclipse plugin Eclipse中的SAXON类加载问题,eclipse-plugin,saxon,Eclipse Plugin,Saxon,我的EclipseRCP应用程序中有一个依赖项问题,我不知道如何正确地解决它 我有一个插件“a”,它有一个类负责执行XSLT转换,并且依赖于net.sf.saxon(9.1.0)和bundle“B” 另一方面,我有一个插件“B”,它有一个类“InformationProvider”,提供从XSLT转换过程调用的静态方法。因此,该插件在其清单中定义了一个伙伴策略,以允许Saxon使用其类 ... Bundle-Name: B Eclipse-RegisterBuddy: net.sf.saxon

我的EclipseRCP应用程序中有一个依赖项问题,我不知道如何正确地解决它

我有一个插件“a”,它有一个类负责执行XSLT转换,并且依赖于net.sf.saxon(9.1.0)和bundle“B”

另一方面,我有一个插件“B”,它有一个类“InformationProvider”,提供从XSLT转换过程调用的静态方法。因此,该插件在其清单中定义了一个伙伴策略,以允许Saxon使用其类

...
Bundle-Name: B
Eclipse-RegisterBuddy: net.sf.saxon
Eclipse-BuddyPolicy: registered
...
插件“B”中的类:

以下是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”


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

多亏了Michael的帮助,我才能够解决这个问题

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

  • 包装Saxon库并提供执行XSLT转换的功能
  • 提供一个扩展点,以便其他插件可以使用它们的类装入器进行贡献
  • 实现我自己的类加载器,它将充当一组多个类加载器(多类加载器)
  • 具有必须通过XSLT转换访问的类的插件将通过向其类加载器发送引用,从而为新插件的“类加载器”扩展点做出贡献。在我的例子中,插件“B”

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

    SAXON包装器插件将收集所有参与者插件中的所有类加载器,并将构建一个了解所有参与者类的多类加载器

    SAXON包装器插件将始终为SAXON transformer工厂设置一个新配置,该工厂将包括多类加载程序,如下所示:

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

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

    因为Saxon在执行样式表时需要找到InformationProvider,这听起来像是一种依赖关系,我不知道如何删除它。(但我对Eclipse一点也不了解)是否可以指示SAXON使用哪个类加载器?现在我记得,是的,Eclipse有相当专业的类加载器需求。实际上,Saxon允许对其进行配置。您可以执行configuration.getDynamicLoader().setClassLoader(),或者如果需要,您可以编写自己的net.sf.saxon.trans.DynamicLoader子类,使用configuration.setDynamicLoader()注册它,然后自己处理整件事。@MichaelKay感谢您的回复。我会试试你的建议,并对结果发表评论。
    <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>
    
    // Retrieve the multi-class loader
    Classloader multiClassloader = ClassLoaderProviderManager.getMultiClassLoader();
    Configuration saxonConfiguration = new Configuration();
    saxonConfiguration.getDynamicLoader().setClassLoader(multiClassloader);