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