8

我的任务是使用 WorldWind API 创建应用程序,为了熟悉 API,我尝试运行“HelloWorldWind”示例应用程序。当我这样做时,我得到以下错误堆栈:

Exception in thread "main" java.lang.AbstractMethodError: javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)V
    at gov.nasa.worldwind.util.WWXML.createDocumentBuilder(WWXML.java:61)
    at gov.nasa.worldwind.util.WWXML.openDocumentStream(WWXML.java:236)
    at gov.nasa.worldwind.util.WWXML.openDocumentStream(WWXML.java:223)
    at gov.nasa.worldwind.util.WWXML.openDocumentFile(WWXML.java:175)
    at gov.nasa.worldwind.util.WWXML.openDocument(WWXML.java:148)
    at gov.nasa.worldwind.Configuration.loadConfigDoc(Configuration.java:131)
    at gov.nasa.worldwind.Configuration.<init>(Configuration.java:108)
    at gov.nasa.worldwind.Configuration.<clinit>(Configuration.java:76)
    at gov.nasa.worldwindx.examples.HelloWorldWind.main(HelloWorldWind.java:

WWXML.createDocumentBuilder如下:

public static DocumentBuilder createDocumentBuilder(boolean isNamespaceAware)
{
    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
    docBuilderFactory.setNamespaceAware(isNamespaceAware);
    if (Configuration.getJavaVersion() >= 1.6)
    {
        try
        {
            docBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",
                false);    // Not getting past here
        }
        catch (ParserConfigurationException e)
        {   // Note it and continue on. Some Java5 parsers don't support the feature.
            String message = Logging.getMessage("XML.NonvalidatingNotSupported");
            Logging.logger().finest(message);
        }
    }
    ...

在线阅读一些东西,人们都在指责jogl,因为我在 64 位系统上运行,但是,我的构建路径中已经有了必要的 jar。 此外,在浏览器中尝试上面显示的 URL 会返回 404 页面,这让我认为这可能是原因URL 只是格式化某些首选项的一种方式。由于我没有 的来源DocumentBuilderFactory.setFeature,所以我看不到那里有什么问题。

我的问题实际上是jogl,还是其他?

4

2 回答 2

14

这是某种类路径问题。AbstractMethodError当 JVM 尝试调用抽象方法(这是不允许的)时抛出。DocumentBuilderFactory.setFeature(String, boolean)是在 JavaSE 5 中添加到 DocumentBuilderFactory 的抽象方法,因此针对 J2SE 1.4.2 版本编译的实现将没有该方法,并且在setFeature(String, boolean)调用它们时会发生此错误。

您的类路径中可能有一个旧的 XML 库,它返回了DocumetnBuilderFactory.newInstance(). 问题可能不在于 JOGL 本身,而可能只是 JOGL 引入了一个旧的 XML 库作为依赖项。

于 2013-09-04T14:43:26.890 回答
1

您需要转到 WWXML 类并替换:

docBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",
                false);

和:

docBuilderFactory.setNamespaceAware(true);

java的完整方法是:

    public static DocumentBuilder createDocumentBuilder(boolean isNamespaceAware)
{
    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();

    docBuilderFactory.setNamespaceAware(isNamespaceAware);

    if (Configuration.getJavaVersion() >= 1.6)
    {
        docBuilderFactory.setNamespaceAware(true);
    }

    try
    {
        return docBuilderFactory.newDocumentBuilder();
    }
    catch (ParserConfigurationException e)
    {
        String message = Logging.getMessage("XML.ParserConfigurationException");
        Logging.logger().finest(message);
        throw new WWRuntimeException(e);
    }
}
于 2016-07-14T16:53:24.257 回答