【问题标题】:Example WorldWind application encounters AbstractMethodError when started示例 WorldWind 应用程序在启动时遇到 AbstractMethodError
【发布时间】:2013-09-08 02:13:31
【问题描述】:

我的任务是使用 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);
        }
    }
    ...

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

我的问题实际上与jogl 或其他有关吗?

【问题讨论】:

    标签: java worldwind


    【解决方案1】:

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

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

    【讨论】:

    • 我刚刚检查了从DocumentBuilderFactory.newInstance() 返回的类类型,它是DocumentBuilderFactoryImplsetFeature 方法显然已经实现,根据this,不应该有任何东西在里面抛出AbstractMethodError
    • @MBraedley 您应该检查正在加载的 xerces 版本。您可以通过调用 MyClass.class.getClassLoader().getResource("org/apache/xerces/jaxp/DocumentBuilderFactoryImpl.class"); 并打印生成的 URL 来完成此操作。将MyClass.class 替换为相关类。 HelloWorldWind.class 可能会。希望您可以检查 URL 指示的 jar 文件以确定它的年龄。
    • 正在使用的 jar 是 WorldWind 版本 2.5.0 附带的 jar,所以它应该可以工作。我在 WorldWind 论坛中没有看到任何迹象表明这是问题所在。
    • 是的,你在正确的道路上。虽然最新版本的 xerces 实现了该方法,但一些以前的版本没有,包括我正在使用的那个。不知道为什么 WorldWind 没有在他们的下载中使用最新版本。
    【解决方案2】:

    您需要转到 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多