SAXON class 在 Eclipse 中加载问题
SAXON class loading problems in Eclipse
我的 Eclipse RCP 应用程序存在依赖关系问题,我不知道如何正确解决它。
我有一个插件 "A",它有一个 class 负责执行 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",它有一个 class "InformationProvider",提供从 XSLT 转换过程中调用的静态方法。因此,此插件在其清单中定义了一个好友策略,以允许 Saxon 使用其 classes.
...
Bundle-Name: B
Eclipse-RegisterBuddy: net.sf.saxon
Eclipse-BuddyPolicy: registered
...
插件中的class"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 无法找到 class "InformationProvider".
最后一个问题:是否可以在不在使用它的插件之间引入直接依赖的情况下使插件 "B" 的 classes 对 SAXON 可见?
感谢 Michael 的帮助,我得以解决问题。
我所做的是创建一个新插件(SAXON 包装器),目的是:
- 包装 Saxon 库并提供执行 XSLT 转换的功能。
- 提供一个扩展点,以便其他插件可以贡献其 class 加载程序。
- 实现我自己的 class 加载器,它将充当一组多个 class 加载器(多 class 加载器)。
具有必须可从 XSLT 转换访问的 classes 的插件将通过向其 class 加载程序发送引用来为新插件的 "Classloader" 扩展点做出贡献。在我的例子中插件 "B".
执行 XSLT 转换的插件会将此操作委托给新插件。在我的例子中插件 "A".
SAXON 包装器插件将从所有贡献者插件中收集所有 class 加载器,并将构建一个多 class 加载器,它将了解所有贡献者 classes。
SAXON 包装器插件将始终为 SAXON 变压器工厂设置新配置,其中将包括多 class 加载器,如下所示:
// Retrieve the multi-class loader
Classloader multiClassloader = ClassLoaderProviderManager.getMultiClassLoader();
Configuration saxonConfiguration = new Configuration();
saxonConfiguration.getDynamicLoader().setClassLoader(multiClassloader);
通过这个解决方案,我能够删除丑陋的依赖项。缺点是,这种方法将使 XSLT 转换可见每个贡献者插件中包含的所有 classes。
我的 Eclipse RCP 应用程序存在依赖关系问题,我不知道如何正确解决它。
我有一个插件 "A",它有一个 class 负责执行 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",它有一个 class "InformationProvider",提供从 XSLT 转换过程中调用的静态方法。因此,此插件在其清单中定义了一个好友策略,以允许 Saxon 使用其 classes.
...
Bundle-Name: B
Eclipse-RegisterBuddy: net.sf.saxon
Eclipse-BuddyPolicy: registered
...
插件中的class"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 无法找到 class "InformationProvider".
最后一个问题:是否可以在不在使用它的插件之间引入直接依赖的情况下使插件 "B" 的 classes 对 SAXON 可见?
感谢 Michael 的帮助,我得以解决问题。
我所做的是创建一个新插件(SAXON 包装器),目的是:
- 包装 Saxon 库并提供执行 XSLT 转换的功能。
- 提供一个扩展点,以便其他插件可以贡献其 class 加载程序。
- 实现我自己的 class 加载器,它将充当一组多个 class 加载器(多 class 加载器)。
具有必须可从 XSLT 转换访问的 classes 的插件将通过向其 class 加载程序发送引用来为新插件的 "Classloader" 扩展点做出贡献。在我的例子中插件 "B".
执行 XSLT 转换的插件会将此操作委托给新插件。在我的例子中插件 "A".
SAXON 包装器插件将从所有贡献者插件中收集所有 class 加载器,并将构建一个多 class 加载器,它将了解所有贡献者 classes。
SAXON 包装器插件将始终为 SAXON 变压器工厂设置新配置,其中将包括多 class 加载器,如下所示:
// Retrieve the multi-class loader
Classloader multiClassloader = ClassLoaderProviderManager.getMultiClassLoader();
Configuration saxonConfiguration = new Configuration();
saxonConfiguration.getDynamicLoader().setClassLoader(multiClassloader);
通过这个解决方案,我能够删除丑陋的依赖项。缺点是,这种方法将使 XSLT 转换可见每个贡献者插件中包含的所有 classes。