Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TransformerFactory与Xalan依赖项冲突_Java_Xml_Maven_Xalan - Fatal编程技术网

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");