Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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方法适用于1.5,但不适用于1.6_Java_Xml_Incompatibility_Java 6_Java 5 - Fatal编程技术网

Java方法适用于1.5,但不适用于1.6

Java方法适用于1.5,但不适用于1.6,java,xml,incompatibility,java-6,java-5,Java,Xml,Incompatibility,Java 6,Java 5,我有一个应用程序,它在Java1.5下愉快地运行了大约一年。我们刚刚更新了盒子,并安装了Java1.6 将应用程序部署到新服务器后,我们发现应用程序在尝试转换某些XML时引发异常。我们无法理解为什么会发生这种情况,直到我们在本地部署了它,同样的事情发生了。将SDK更改为v1.5后,问题停止,应用程序运行正常 以下是该方法的来源: import java.io.StringWriter; import javax.xml.transform.Result; import javax.xml.tra

我有一个应用程序,它在Java1.5下愉快地运行了大约一年。我们刚刚更新了盒子,并安装了Java1.6

将应用程序部署到新服务器后,我们发现应用程序在尝试转换某些XML时引发异常。我们无法理解为什么会发生这种情况,直到我们在本地部署了它,同样的事情发生了。将SDK更改为v1.5后,问题停止,应用程序运行正常

以下是该方法的来源:

import java.io.StringWriter;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Element;
import org.w3c.dom.Node;


   public static String xmlToString(Node node) {
    try {
        Source source = new DOMSource(node);
        StringWriter stringWriter = new StringWriter();
        Result result = new StreamResult(stringWriter);
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer();
        transformer.transform(source, result);
        return stringWriter.getBuffer().toString();
    } catch (TransformerConfigurationException e) {
        e.printStackTrace();
    } catch (TransformerException e) {
        e.printStackTrace();
    }
    return null;
   }
它正在“transformer.transform(source,result);”行上崩溃,但异常情况是:

Exception in thread "main" java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.getXmlStandalone()Z
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.setDocumentInfo(DOM2TO.java:373)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:127)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:94)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:662)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:708)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313)
有人知道两个版本之间对Java所做的任何更改会导致这种情况吗?最简单的解决方法是什么


感谢您的帮助。

我不记得是在1.4和1.5之间还是1.5和1.6之间,但是Sun JVM附带的Xalan库更改了它们的包名。大约两年前我遇到了类似的事情。我想我要做的就是明确地发布我自己的xalan实现来解决这个问题


更新:这可能是我所想的,尽管它仍然可能与您的问题有关

这是因为jar(Xalan)版本冲突造成的问题。移除jar并试一试

您可能想使用Xerces的最新版本(我相信它应该与JDK1.6兼容)

众所周知,在JDK 1.6上,旧的Xerces.jar会出现这个问题,当它位于类路径上时,会提供自己的DocumentBuilderFactory

使用平台默认工厂时不会出现此问题


您可能需要检查您的WEB-INF/lib或等效文件。

我在代码中遇到了同样的java.lang.AbstractMethodError

当时,更改任何库的版本都不是一个选项,但通过与其他神秘工作的代码进行比较,我找到了一个解决方法。也许这可以帮助其他人

这一切都与我传递到DOMSource()的文档有关最初我以标准方式创建了一个文档:

    private static Document documentFromInputStream(InputStream in) throws ParserConfigurationException, SAXException, IOException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse(new InputSource(in));
    return doc;
}
要解决此问题,我将工厂生产线更改如下:

        DocumentBuilderFactory factory = new DocumentBuilderFactoryImpl();

现在我不再遇到异常。

我遇到了同样的问题&在我的应用程序的类路径中将xercesImpl-2.0.2.jar文件替换为xercesImpl-2.11.0.jar。工作正常

这对我很有效

 TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer = factory.newTransformer();
            transformer.setOutputProperty(OutputKeys.METHOD, "xml");
    DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(sWout);
            transformer.transform(source, result);

您的类路径中似乎有一个冲突的xerces实现。类路径中有哪些与xml相关的JAR?您应该只使用JAXP API,或者依赖xerces库本身,而不是sun提供的实现(在不同版本中会有所不同)。我看到这样一种情况,代码调用TransformerFactory创建一个转换器,然后在转换器上调用transform(),并引发此异常。这似乎是正确的做法。该代码在Java5中运行良好,升级到Java6后会引发此异常。包括我自己的xalan副本解决了这个问题。我在哪里可以找到我自己的xalan副本?我如何包含和替换oracle提供的内容???太好了!不必处理jar冲突。谢谢。我试着添加一个新的Xerces JAR,但根据最上面的答案,这并没有解决问题,所以我尝试了你的建议,从我的构建路径中删除了Xerces JAR,它成功了,谢谢!XALAN进入rt.jar,你是说我应该从jre/lib路径中删除jar吗?