Java / Maven - 没有SeviceLoader的Saxon覆盖

时间:2016-09-08 09:32:13

标签: java maven saxon serviceloader

我们正在构建一个通用组件,它是多个其他项目的依赖项。

我们的项目进行了一些XSLT转换,我们需要使用Saxon引擎。

我们可以完全控制必须使用Saxon的特定XSLT转换,但不能控制依赖于我们的应用程序的类路径,我们也不想强迫它们将Saxon用于其他XML工作。 / p>

我们可以在使用这些工厂提供的API进行转换时直接手动调用Saxon库。

问题在于Saxon使用ServiceLoader模式将自己注入到jar中使用此文件的TransformerFactory实现:

[saxon.jar]/META-INF/services/javax.xml.transform.TransformerFactory

这意味着使用我们作为依赖关系的应用程序最终可能会使用Saxon而不是现有的XML库。要求这些应用程序更改其代码以调用其特定实现不是一种选择。

我们有什么方法可以“覆盖”Saxon库以删除ServiceLoader实现?使用Maven,Java还是其他一些过程?

2 个答案:

答案 0 :(得分:0)

不幸的是,发现自己使用已编写的库来使用JAXP可插拔性机制来获取类路径上的任何XSLT处理器,但实际上只有当处理器恰好是Xalan的。

对于XPath场景,这个问题非常严重,以至于Saxon META-INF不再将自己声明为XPath服务提供者(尽管它仍然实现了所有JAXP接口)。但对于XSLT而言,解决方案是不可接受的。

我认为在大多数情况下,将Java系统属性javax.xml.transform.TransformerFactory设置为Xalan的相关类名应该可以解决问题。

答案 1 :(得分:0)

为具有相同问题的任何未来开发人员解答此问题。

我们无法找到解决此问题的方法。我们考虑编写一个Maven插件来从JAR中删除META-INF/services/文件,但最终认为这不是一个合适的解决方案。

我们现在处于相同的位置 - 依赖应用程序最终将Saxon作为注册提供商,并且可能会覆盖其现有配置。

对于那些必须使用特定XSLT处理器的应用程序,我们要求他们设置系统属性,例如: javax.xml.transform.TransformerFactory=org.apache.xalan.processor.TransformerFactoryImpl