我的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”的类,而不会在使用它的插件之间引入直接依赖关系?
答案 0 :(得分:1)
感谢迈克尔的帮助,我能够解决问题。
我所做的是创建一个新插件(SAXON包装器),目的是:
具有必须可从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变换对每个贡献者插件中包含的所有类都可见。