2011-10-27 24 views
11

Tôi đang sử dụng Java SE 6 trên Mac OS X và Saxon-HE 9.3.0.5. ServiceLoader không thể tìm thấy việc triển khai Saxon của javax.xml.xpath.XPathFactory.Lỗi cú pháp trong tệp cấu hình của nhà cung cấp javax.xml.xpath.XPathFactory của Saxon-HE 9.3

mac:test2 ludo$ java -version 
java version "1.6.0_26" 
Java(TM) SE Runtime Environment (build 1.6.0_26-b03-383-11A511) 
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-383, mixed mode) 

Các javadoc của phương pháp newInstance của javax.xml.xpath.XPathFactory bang tại điểm 3 của thủ tục tra cứu để bản địa hoá thực hiện điều đó:

Các bộ nạp lớp được yêu cầu cho các tập tin cung cấp cấu hình cung cấp dịch vụ phù hợp với javax. xml.xpath.XPathFactory trong thư mục tài nguyên META-INF/services. Xem Đặc tả tệp JAR để biết định dạng tệp và quy tắc phân tích cú pháp.

Các Service Provider section của JAR Tệp Đặc điểm kỹ thuật nói rằng:

Các tập tin nên chứa một danh sách xuống dòng cách nhau bằng tên nhà cung cấp lớp bê tông độc đáo.

Nhưng nếu tôi trích xuất các tập tin saxon9he.jar và tìm vào thư mục META-INF, tôi thấy:

mac:Java ludo$ mkdir test 
mac:Java ludo$ cd test 
mac:test ludo$ jar fx ../saxon9he.jar 
mac:test ludo$ cat META-INF/services/javax.xml.xpath.XPathFactory 
net.sf.saxon.xpath.XPathFactoryImpl 
http\://java.sun.com/jaxp/xpath/dom: net.sf.saxon.xpath.XPathFactoryImpl 
http\://saxon.sf.net/jaxp/xpath/om:  net.sf.saxon.xpath.XPathFactoryImpl 

Dòng đầu tiên là đúng nhưng tôi không thể hiểu tại sao có hai phụ dòng và có vẻ như những dòng này đang gây ra sự cố cho ServiceLoader. Tôi đã nhìn thấy vấn đề với một ví dụ thử nghiệm mà tôi đã viết hiểu được mecanism được sử dụng để tìm một nhà cung cấp. Chúng ta có thể thấy rằng saxon9he.jar nằm trong CLASSPATH.

mac:services ludo$ java ServicesTest 
CLASSPATH = ..., /Users/ludo/Library/Java/saxon9he.jar, ... 
Service XPathFactory: java.util.ServiceLoader[javax.xml.xpath.XPathFactory] 
ServiceConfigurationError: javax.xml.xpath.XPathFactory: jar:file:/Users/ludo/Library/Java/saxon9he.jar!/META-INF/services/javax.xml.xpath.XPathFactory:2: Illegal configuration-file syntax 

Điểm mấu quan tâm là:

jar:file:/Users/ludo/Library/Java/saxon9he.jar!/META-INF/services/javax.xml.xpath.XPathFactory:2: Illegal configuration-file syntax 

Có một lỗi của Saxon hoặc một cú pháp mở rộng không được hỗ trợ bởi hệ thống của tôi? Tôi có thể làm gì để giải quyết vấn đề này?

Lưu ý rằng nếu tôi chọn lớp học một cách rõ ràng để triển khai, tôi có thể nhận được một nhà máy. Nhưng tôi muốn sử dụng cơ chế Dịch vụ. Mã sau hoạt động:

XPathFactory xpf = XPathFactory.newInstance(
    XPathFactory.DEFAULT_OBJECT_MODEL_URI, 
    "net.sf.saxon.xpath.XPathFactoryImpl", 
    ClassLoader.getSystemClassLoader()); 

Tôi đã thêm toàn bộ chương trình thử nghiệm Java bên dưới.

import java.net.URL; 
import java.net.URLClassLoader; 
import java.util.Iterator; 
import java.util.ServiceConfigurationError; 
import java.util.ServiceLoader; 
import javax.xml.xpath.XPathFactory; 

public class ServicesTest { 
    public static String getClasspathString() { 
     StringBuilder classpath = new StringBuilder(); 
     ClassLoader classLoader = ClassLoader.getSystemClassLoader(); 
     URL[] urls = ((URLClassLoader) classLoader).getURLs(); 
     for (int i = 0; i < urls.length - 1; i++) { 
      classpath.append(urls[i].getFile()).append(", "); 
     } 
     if (urls.length > 0) { 
      classpath.append(urls[urls.length - 1].getFile()); 
     } 

     return classpath.toString(); 
    } 

    public static void availableProviders(ServiceLoader sl) { 
     Iterator it = sl.iterator(); 
     int index = 0; 
     for (;;) { 
      try { 
       if (!it.hasNext()) { 
        break; 
       } 
       index++; 
       Object o = it.next(); 
       System.out.printf("%03d Concrete class name: %s\n", index, o.getClass().getName()); 
      } catch (ServiceConfigurationError e) { 
       System.err.printf("ServiceConfigurationError: %s\n", e.getMessage()); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     System.out.printf("CLASSPATH = %s\n", getClasspathString()); 
     System.out.println(); 

     ServiceLoader<XPathFactory> slXPathFactory = ServiceLoader.load(XPathFactory.class); 
     System.out.printf("Service XPathFactory: %s\n", slXPathFactory.toString()); 
     availableProviders(slXPathFactory); 
    } 
} 
+0

Bạn có thể trích xuất tệp thẳng đến dòng lệnh trong một bước với 'unzip -p /path/to/lib/jarfile.jar META-INF/services/javax.xml.xpath.XPathFactory' –

Trả lời

11

Michael Kay answered the question trên diễn đàn SourceForge. Anh ấy nói rằng:

Định dạng của tệp đã được chọn để phá vỡ lỗi JDK5.

Và cũng rằng:

Thực ra, tôi sẽ không khuyên bạn nên sử dụng cơ chế tìm kiếm JAXP anyway. Nó rất chậm, và nó cung cấp một công cụ XPath mà không nhất thiết phải làm việc với ứng dụng của bạn. Bạn không có cách nào để biết liệu bạn có nhận lại XPath 1.0 hoặc 2.0 hay không và API được định nghĩa yếu đến mức có rất ít khả năng ứng dụng của bạn sẽ làm việc với một nhà cung cấp cụ thể trừ khi bạn đã thử nghiệm nó với nhà cung cấp đó trước. Vì vậy, ngay cả khi không có lỗi này, tôi sẽ tránh xa nó.

Tôi nghĩ rằng nó trả lời câu hỏi ngay cả khi nó không cung cấp giải pháp khắc phục rõ ràng cho sự cố. Vì vậy, chúng tôi có thể chọn triển khai bằng cách viết:

XPathFactory xpf = XPathFactory.newInstance(
    XPathFactory.DEFAULT_OBJECT_MODEL_URI, 
    "net.sf.saxon.xpath.XPathFactoryImpl", 
    ClassLoader.getSystemClassLoader()); 
+7

Trong Saxon 9.5 trở lên vấn đề này được giải quyết. Nếu ai đó thấy mình cần phải làm việc này với phiên bản cũ và không có quyền truy cập vào mã gọi 'newInstance' - bạn giải quyết vấn đề bằng cách xóa thư mục' services' khỏi tệp JAR nói trên. Đây là sau một [lưu ý] (https://saxonica.plan.io/issues/1944#note-3) về chủ đề của lỗi. – Stav

+0

Và ở Saxon 9.6 độ phân giải JAXP cho XPath đã bị loại bỏ - xem https://saxonica.plan.io/issues/1944#note-5 –

1

Tôi biết đây là chủ đề cũ hơn, nhưng this post of mine có thể làm sáng tỏ vấn đề. Nó tìm thấy XPathFactory bằng cách sử dụng tham số -D mà tôi chưa bao giờ thấy tài liệu.

+0

Cảm ơn bạn đã theo dõi. – lkuty

Các vấn đề liên quan