2013-09-04 4 views
6

Мне было поручено создать приложение с использованием API WorldWind и ознакомиться с API, я попытался запустить пример приложения HelloWorldWind. Когда я делаю, я получаю следующее сообщение об ошибке: стекПримеры приложений приложения WorldWind AbstractMethodError при запуске

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-битной системе, однако , У меня уже есть необходимые банки в моем пути сборки. Кроме того, попытка URL, показанная выше в браузере, возвращает страницу 404, что заставляет меня думать, что это может быть причиной URL-адрес - это просто способ отформатировать некоторые параметры. Поскольку у меня нет источника для DocumentBuilderFactory.setFeature, я не вижу, что там испортило.

Является ли моя проблема на самом деле jogl или что-то еще?

ответ

10

Это какой-то классный путь. AbstractMethodError бросается, когда JVM пытается вызвать абстрактный метод (что недопустимо). DocumentBuilderFactory.setFeature(String, boolean) - это абстрактный метод, который был добавлен в DocumentBuilderFactory в JavaSE 5, поэтому реализации, скомпилированные против версии J2SE 1.4.2, не имели бы этого метода, и эта ошибка возникла бы при вызове на них setFeature(String, boolean).

Возможно, у вас есть старая библиотека XML на вашем пути к классам, которая вернула экземпляр для DocumetnBuilderFactory.newInstance(). Проблема может быть не в JOGL, сама по себе, может быть, JOGL привел в старую библиотеку XML как зависимость.

+0

Я только что проверил тип класса, который вернулся из 'DocumentBuilderFactory.newInstance()', и это 'DocumentBuilderFactoryImpl'. Метод 'setFeature', по-видимому, реализован и, согласно [этому] (http://grepcode.com/file/repo1.maven.org/maven2/xerces/xercesImpl/2.11.0/org/apache/xerces/jaxp/ DocumentBuilderFactoryImpl.java # DocumentBuilderFactoryImpl.setFeature% 28java.lang.String% 2Cboolean% 29), там не должно быть ничего, что бросает в него «AbstractMethodError». – MBraedley

+1

@MBraedley Вы должны проверить, какая версия xerces загружается. Вы можете сделать это, вызывая 'MyClass.class.getClassLoader(). GetResource (" org/apache/xerces/jaxp/DocumentBuilderFactoryImpl.class "); и печатает результирующий URL. Замените соответствующий класс для 'MyClass.class'. 'HelloWorldWind.class', вероятно, сделает. Надеюсь, вы можете проверить файл jar, указанный URL, чтобы определить, сколько ему лет. – Dev

+0

Банку, которая используется, это тот, который поставляется с WorldWind, версия 2.5.0, поэтому, по-видимому, он должен работать. Я не вижу никаких указаний на форумах WorldWind, что это проблема. – MBraedley

1

Вам нужно идти в класс WWXML и заменить:

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

с:

docBuilderFactory.setNamespaceAware(true); 

полный метод на Яве:

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); 
    } 
} 
Смежные вопросы