我们将撒克逊人与我们的图书馆一起运送。我们以代码形式通过了许可证,因此不会发送saxon-library.lic文件。我们的系统运行良好。
但是,我们的一位客户遇到了一个问题,即当hazelcast(他们使用的库)想要验证模式时,因为Saxon已将自身注册为javax.xml.validation.SchemaFactory提供程序,所以它使用了Saxon。并且由于没有许可证而失败。
因此,我们需要在调用时执行此操作,而在其他应用程序调用时不需要。或者,如果可以,我们需要将.lic文件与我们的应用一起发布。还是有其他解决方案?
谢谢-戴夫
答案 0 :(得分:1)
在这方面有两条可能的路线。一种是让另一个应用程序成功使用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模式验证器”,例如静态变量或系统属性。