Java/Maven - 没有 SeviceLoader 覆盖的 Saxon

Java/Maven - Saxon without SeviceLoader override

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

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

我们完全控制了必须使用 Saxon 的特定 XSLT 转换,但无法控制依赖于我们的应用程序的类路径,我们不想强迫他们将 Saxon 用于其他 XML 工作。

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

问题是 Saxon 使用 ServiceLoader 模式将自身注入为 TransformerFactory 实现,使用 jar 中的这个文件:

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

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

我们有什么方法可以 'override' Saxon 库删除 ServiceLoader 实现吗?使用 Maven,Java 还是其他一些进程?

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

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

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

为未来遇到同样问题的开发者解答此问题。

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

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

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