Erro de sintaxe no arquivo de configuração do provedor javax.xml.xpath.XPathFactory do Saxon-HE 9.3

Estou usando o Java SE 6 no Mac OS X e no Saxon-HE 9.3.0.5. O ServiceLoader não consegue encontrar a implementação saxona dejavax.xml.xpath.XPathFactory.

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)

O javadoc donewInstance método dejavax.xml.xpath.XPathFactory afirma no ponto 3 do procedimento de pesquisa para localizar uma implementação que:

O carregador de classes é solicitado pelos arquivos de configuração do provedor de serviços que correspondem a javax.xml.xpath.XPathFactory no diretório de recursos META-INF / services. Consulte a Especificação de arquivo JAR para obter o formato do arquivo e as regras de anális

O Seção Provedor de Serviços da Especificação de Arquivo JAR afirma que:

O arquivo deve conter uma lista separada por nova linha de nomes exclusivos de classe de provedor concret

Mas se eu extrair o arquivo saxon9he.jar e procurar no diretório META-INF, vejo:

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

A primeira linha está correta, mas não consigo entender por que existem duas linhas extras e parece que essas linhas estão causando problemas ao ServiceLoader. Vi o problema com um exemplo de teste que escrevi para entender o mecanismo usado para encontrar um provedor. Podemos ver que o saxon9he.jar está no 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

A linha de interesse é:

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

É um bug do Saxon ou uma sintaxe estendida não suportada pelo meu sistema? O que posso fazer para resolver o problema?

Observe que, se eu escolher explicitamente a classe para a implementação, posso obter uma fábrica. Mas eu quero usar o mecanismo de serviços. O código a seguir funciona:

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

Adicionei todo o programa de teste Java abaix

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

questionAnswers(2)

yourAnswerToTheQuestion