2009-08-10 48 views
14

我有一个应用程序,它在Java 1.5下快乐地运行了大约一年。我们刚刚更新了这些框并安装了Java 1.6。Java方法工作在1.5但不是1.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(源,结果);”与异常行:

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所做的任何更改?什么是最简单的修复?

感谢您的帮助。

+4

看来您的类路径中某处存在冲突的Xerxes实现。 – akarnokd 2009-08-10 15:07:15

+1

什么xml相关的jar包在你的类路径中? – Yishai 2009-08-10 15:38:49

回答

18

我不记得了,如果是1.4和1.5或1.5和1.6之间,但与JVM从孙运的Xalan库改变了他们的包名。我在2年前遇到类似的事情。我认为我必须做的是明确发布我自己的xalan实现来解决问题。

UPDATE:这可能是我在想什么的,虽然它仍然可能与您的问题link text

+7

您应该只使用JAXP API或依赖于xerces库本身,而不使用sun提供的实现(这将在不同版本之间有所不同)。 – wds 2009-08-10 15:32:53

+1

我看到发生这种情况,并且代码调用TransformerFactory创建Transformer,然后在Transformer上转换(),并引发此异常。这似乎是正确的做法。该代码在Java 5中工作正常,并且在升级到Java 6之后,它抛出了这个异常。包括我自己的xalan副本修复了这个问题。 – 2011-05-09 17:04:09

+0

我在哪里可以找到我自己的xalan副本?以及如何包含和替换oracle给出的内容? – 2016-08-10 12:03:08

3

这是因为罐子(Xalan的)版本冲突的问题。取下罐子,并给予一试

+0

我试着添加一个新的Xerces JAR,但是这并没有解决顶级upvoted答案,所以我尝试了你的建议,并从我的构建路径中删除了Xerces JAR,它工作,谢谢! – Kairan 2015-07-22 16:12:25

+0

XALAN进来rt.jar你是说我应该从JRE/lib路径删除jar? – 2016-08-10 12:03:53

0

您可能需要使用从Xerces的最新版本(我相信这应该是compitable与JDK1.6)

7

已知此问题与旧的Xerces在JDK 1.6发生。当在classpath上时,它提供了自己的DocumentBuilderFactory。

使用平台默认工厂时不会发生该问题。

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

2

我遇到这种相同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(); 

现在我不再得到的异常。

+0

太棒了!不必处理jar冲突。谢谢。 – 2014-12-11 14:14:44

0

我有同样的问题&取代xercesImpl-2.0.2。jar文件与我的应用程序的类路径中的xercesImpl-2.11.0.jar。它的工作正常。

0

这对我有效。

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); 
相关问题