我们正在构建一个通用组件,它是多个其他项目的依赖项。
我们的项目进行了一些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还是其他一些过程?
答案 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