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);
}
}
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' –