我们用我们的图书馆运送撒克逊人。我们在代码中传递许可证,因此不发送saxon-library.lic文件。我们的系统都很棒。
但是,我们的一个客户遇到一个问题,当hazelcast(他们使用的库)想要验证模式时,由于Saxon已将自己注册为javax.xml.validation.SchemaFactory提供程序,因此它使用Saxon。由于没有许可证而失败。
所以我们需要它在我们打电话时这样做,但不是在其他应用程序打电话时。或者,如果没问题,我们需要使用我们的应用程序发送.lic文件。还是有其他解决方案吗?
谢谢 - 戴夫
这有两条可能的路线。一种是让其他应用程序成功使用Saxon模式验证,另一种是尝试阻止它将Saxon作为模式验证器加载。
要实现第一个,它需要访问许可文件,我们可以讨论如何最好地实现这一点。由于这可能涉及商业/法律问题而非纯技术问题,我认为离线讨论会更好。
为了实现第二种,可以通过各种方式来加载用于加载SchemaFactory的JAXP算法。一种是使用SchemaFactory.newInstance()方法,该方法明确标识所需的工厂类;另一种是设置javax.xml.validation.SchemaFactory:schemaLanguage
系统属性。如果所有其他方法都失败了,您可以考虑从Saxon JAR文件(在META-INF中)中删除该条目,该条目将Saxon标识为JAXP SchemaValidator服务提供者。
(这就是我们最终用相同的XPath工厂注册做的事情:JAXP搜索机制造成了很多麻烦,我们最后说,如果你想让Saxon作为你的XPath提供者,直接从你的应用程序加载,不要只依赖它是在类路径上找到的第一件事)。
JAXP机制实际上并不允许应用程序的两个部分具有不同的依赖关系,这有点像灾难,我想知道是否有任何我们可以做的事情来减少它,不仅仅是走开从它完全。确实看起来可行的一件事(需要确认)是,如果没有可用的许可证,方法isSchemaValidationSupported()
可以返回false,而不是崩溃。我们还可以考虑一些其他外部/全局方式来说“不要将Saxon用作JAXP模式验证器”,例如静态变量或系统属性。