2009-08-10 52 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); 
相關問題