2013-09-04 35 views
6

Tôi đã được giao nhiệm vụ tạo một ứng dụng bằng cách sử dụng API WorldWind và để tự làm quen với API, tôi đã thử chạy ứng dụng ví dụ "HelloWorldWind". Khi tôi làm, tôi nhận được đống lỗi sau:Ví dụ ứng dụng WorldWind gặp AbstractMethodError khi bắt đầu

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 là như sau:

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, người ta đang đổ lỗi cho jogl, kể từ khi tôi đang chạy trên một hệ thống 64-bit, tuy nhiên , Tôi đã có các lọ cần thiết trong đường dẫn xây dựng của mình. Ngoài ra, việc thử URL được hiển thị ở trên trong trình duyệt trả về trang 404, điều này khiến tôi nghĩ rằng đó có thể là nguyên nhân URL chỉ là một cách để định dạng một số tùy chọn. Vì tôi không có nguồn cho DocumentBuilderFactory.setFeature, tôi không thể thấy điều gì đang rối tung lên trong đó.

Vấn đề của tôi có thực sự với jogl hoặc cái gì khác không?

Trả lời

10

Đây là vấn đề về classpath của một số loại. AbstractMethodError được ném khi JVM cố gắng gọi phương thức trừu tượng (không được phép). DocumentBuilderFactory.setFeature(String, boolean) là một phương thức trừu tượng đã được thêm vào DocumentBuilderFactory trong JavaSE 5, vì vậy việc triển khai được biên dịch dựa trên phiên bản J2SE 1.4.2 sẽ không có phương thức đó và lỗi này sẽ xảy ra khi setFeature(String, boolean) được gọi trên chúng.

Có thể bạn có một thư viện XML cũ trên đường dẫn lớp đã trả về một phiên bản cho DocumetnBuilderFactory.newInstance(). Vấn đề có thể không phải với JOGL, mỗi lần, nó có thể chỉ là JOGL mang trong một thư viện XML cũ như một sự phụ thuộc.

+0

tôi chỉ kiểm tra các loại lớp học đó là quay trở lại từ 'DocumentBuilderFactory.newInstance()', và nó là một 'DocumentBuilderFactoryImpl'. Phương thức 'setFeature' được triển khai rõ ràng và theo [this] (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), không nên có bất cứ điều gì mà ném một 'AbstractMethodError' trong đó. – MBraedley

+1

@MBraedley Bạn nên kiểm tra phiên bản nào của xerces đang được tải. Bạn có thể làm điều này bằng cách gọi 'MyClass.class.getClassLoader(). GetResource (" org/apache/xerces/jaxp/DocumentBuilderFactoryImpl.class ");' và in URL kết quả. Thay thế một lớp có liên quan cho 'MyClass.class'. 'HelloWorldWind.class' có lẽ sẽ làm. Hy vọng rằng bạn có thể kiểm tra tệp jar được chỉ ra bởi URL để xác định nó cũ bao nhiêu. – Dev

+0

Bình đang được sử dụng là cái mà đi kèm với WorldWind, phiên bản 2.5.0, vì vậy có lẽ nó sẽ hoạt động. Tôi không thấy bất kỳ dấu hiệu nào trong diễn đàn WorldWind rằng đây là vấn đề. – MBraedley

1

Bạn cần đi đến lớp WWXML và thay thế:

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

với:

docBuilderFactory.setNamespaceAware(true); 

phương pháp hoàn chỉnh về java là:

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); 
    } 
} 
Các vấn đề liên quan