Java 方法适用于 1.5 但不适用于 1.6
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1255427/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Java method works in 1.5 but not 1.6
提问by James Camfield
I have an application which has been running happily under Java 1.5 for around a year. We've just had the boxes updated and had Java 1.6 installed.
我有一个应用程序已经在 Java 1.5 下愉快地运行了大约一年。我们刚刚更新了这些盒子并安装了 Java 1.6。
After deploying the app to the new server we've found the application is throwing an exception when it tries to transform some XML. We couldn't understand why this was happening until we deployed it locally and the same happened. After changing the SDK to v1.5 the problem stopped and the application runs fine.
将应用程序部署到新服务器后,我们发现应用程序在尝试转换某些 XML 时抛出异常。我们无法理解为什么会发生这种情况,直到我们在本地部署它并且发生了同样的事情。将 SDK 更改为 v1.5 后,问题停止并且应用程序运行良好。
Here's the method's source:
这是该方法的来源:
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;
}
It's crashing on the "transformer.transform(source, result);" line with exception:
它在“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)
Does anyone know of any changes made to Java between the two versions which would cause this? What would be the easiest fix?
有谁知道在两个版本之间对 Java 所做的任何更改会导致这种情况?什么是最简单的修复?
Thanks for your help.
谢谢你的帮助。
采纳答案by Chris Boran
I don't remember if it was between 1.4 and 1.5 or 1.5 and 1.6, but the Xalan libraries that shipped with the JVM from Sun changed their package name. I ran into something similar about 2 years ago. I think what I had to do was explicitly ship my own xalan implementation to fix the problem.
我不记得它是在 1.4 和 1.5 之间还是在 1.5 和 1.6 之间,但是 Sun 的 JVM 附带的 Xalan 库更改了它们的包名称。大约 2 年前,我遇到了类似的事情。我认为我必须做的是明确地发布我自己的 xalan 实现来解决这个问题。
UPDATE: This might have been what I was thinking of, though it still could be related to your problem link text
更新:这可能是我的想法,尽管它仍然可能与您的问题链接文本有关
回答by Niger
It is the problem because of jar(Xalan) version conflict. Remove the jars and give a try
这是由于 jar(Xalan) 版本冲突导致的问题。取出罐子并尝试
回答by Muhammad Hewedy
You may want to use latest version from Xerces (I believe it should be compitable with JDK1.6)
您可能想使用 Xerces 的最新版本(我相信它应该与 JDK1.6 兼容)
回答by billyblind
This problem is known to occur on JDK 1.6 with an older xerces.jar which, when on classpath, provides its own DocumentBuilderFactory.
已知此问题发生在带有旧版 xerces.jar 的 JDK 1.6 上,当在类路径上时,它提供自己的 DocumentBuilderFactory。
The problem does not occur when using the platform default factory.
使用平台默认工厂时不会出现此问题。
You may want to check your WEB-INF/lib or equivalent.
您可能需要检查您的 WEB-INF/lib 或等效文件。
回答by Robert Patterson
I encounter this same java.lang.AbstractMethodErrorin my code.
我在我的代码中遇到了同样的java.lang.AbstractMethodError。
At the time changing the version of any libraries was not an option, but I found a workaround by comparing with other code that mysteriously worked. Perhaps this might helps others out there.
当时更改任何库的版本都不是一种选择,但我通过与其他神秘地工作的代码进行比较找到了一种解决方法。也许这可能会帮助其他人。
It all had to do with the Document I passed into DOMSource(). OriginallyI had created a document in the standard way:
这一切都与我传递给 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;
}
To work around this issue, I change the factory line as follows:
为了解决这个问题,我将工厂生产线更改如下:
DocumentBuilderFactory factory = new DocumentBuilderFactoryImpl();
Now I no longer get the exception.
现在我不再得到例外。
回答by spolishe
I had the same problem & replaced the xercesImpl-2.0.2.jar file with xercesImpl-2.11.0.jar in class path of my application. Its working fine.
我遇到了同样的问题,并在我的应用程序的类路径中用 xercesImpl-2.11.0.jar 替换了 xercesImpl-2.0.2.jar 文件。它的工作正常。
回答by Dheeraj Kumar
This worked for me.
这对我有用。
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);