Java TransformerFactory与Xalan依赖项冲突
我有以下代码:Java TransformerFactory与Xalan依赖项冲突,java,xml,maven,xalan,Java,Xml,Maven,Xalan,我有以下代码: javax.xml.transform.TransformerFactory factory = TransformerFactory.newInstance(); factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); javax.xml.transform.Transformer transformer = factory.newTransformer(); 这工作正常。但是,我还需要将Xalan作为依赖项添加
javax.xml.transform.TransformerFactory factory = TransformerFactory.newInstance();
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
javax.xml.transform.Transformer transformer = factory.newTransformer();
这工作正常。但是,我还需要将Xalan作为依赖项添加到pom.xml中,当我添加时,上面的代码现在抛出一个错误:
java.lang.IllegalArgumentException: Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD
我认为这与Xalan的jar中有一个不同的Transformer实现这一事实有关。如何在不更改上述代码并将Xalan保留为依赖项的情况下解决此冲突?将Xerces从Xalan中排除可以解决此问题:
<dependency>
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
<version>2.7.2</version>
<exclusions>
<exclusion>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
</exclusion>
</exclusions>
</dependency>
沙兰
沙兰
2.7.2
薛西斯
干细胞移植
如果您是多个XSL处理器和/或不同的版本,那么您必须处理这样的情况,即不是每个实现都能够处理每个属性。唯一的方法是捕获不支持该属性时抛出的IllegalArgumentException。请从以下位置查看此修改后的示例:
文件说:
如果可以更改代码,并且对于新开发,建议按照上面的说明设置新属性。通过以这种方式设置属性,无论应用程序部署到较旧或较新版本的JDK,还是通过系统属性或jaxp.properties设置属性,应用程序都可以确保保持所需的行为
对我有效的解决方案是这样做:
compile('org.opensaml:opensaml:2.6.1') {
exclude group: 'xerces', module: 'xercesImpl'
exclude module: 'xalan'
}
它可能来自您项目的其他xalan版本
检查POM中xalan的从属层次结构,并在所有xalan版本中排除xercesImpl。我遇到了一个类似的问题,在
TransformerFactory::newInstance
中创建了一个来自SaxonJ的实现,在尝试设置它不支持的属性时给了我错误
查看一下,我发现TransformerFactory有一个优先级列表,它试图在其中找到要返回的实现
它查找的第一个位置是在系统属性中,因此在我的Ant文件中,在我的运行目标中,我添加了以下内容(其他库将具有相同的内容):
这将使TransformerFactory::newInstance加载正确的工厂实现
请记住,我使用的是OpenJDK8,您必须为其他版本找到正确的软件包。需要如下设置系统级属性
System.setProperty("javax.xml.transform.TransformerFactory","com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");
为什么需要Xalan依赖项?Xalan从JDK1.4开始就得到了认可。在正常情况下是不必要的。我正在制作一个对每个Java XML解析器都进行单元测试的web应用程序。我已经排除了xerces库,但仍然得到相同的错误。我如何知道还有什么可能与TransformerFactory冲突?与@DavidChampion相同,其他人还有其他解决方案吗?请尝试在评论部分限制可能性。我们需要核实一下。所以应该在评论部分。谢谢这个解决方案是最后唯一对我有帮助的,谢谢!这个解决方案有效,有人能解释为什么吗?通过使用这个解决方案,Sonar仍然不满意,并强调它是一个拦截器,说“xml解析器不应该容易受到xxe攻击”
System.setProperty("javax.xml.transform.TransformerFactory","com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");