¿Cómo evitar que xalan.jar que tiene META-INF \ services \ javax.xml.transform.TransformerFactory se haga cargo de JDK 1.6 integrado en la implementación de Xalan?

Considere este código (basado completamente en el código de "inicio" del platillo volador, sus derechos reservados):

package flyingsaucerpdf;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

import org.xhtmlrenderer.pdf.ITextRenderer;


    public class PDFMaker {
        public static void main(String[] args) throws Exception {
            new PDFMaker().go();
        }

        public void go() throws Exception {
            String inputFile = "sample.html";
            String url = new File(inputFile).toURI().toURL().toString();
            String outputFile = "firstdoc.pdf";
            OutputStream os = new FileOutputStream(outputFile);

            ITextRenderer renderer = new ITextRenderer();
            renderer.setDocument(url);
            renderer.layout();
            renderer.createPDF(os);

            os.close();
        }
    }

Algunos hechos:

Ejecutarlo de manera independiente (llamar a main) con JDK 1.6 o 1.5 funciona perfectamente (se genera PDF) Pero cuando se carga a través de un URLClassLoader desde una aplicación web existente, falla con este error:
Caused by: org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces.
    at org.apache.xerces.dom.AttrNSImpl.setName(Unknown Source)
    at org.apache.xerces.dom.AttrNSImpl.(Unknown Source)
    at org.apache.xerces.dom.CoreDocumentImpl.createAttributeNS(Unknown Source)
    at org.apache.xerces.dom.ElementImpl.setAttributeNS(Unknown Source)
    at org.apache.xml.utils.DOMBuilder.startElement(DOMBuilder.java:307)
    ... 19 more

Después de buscar un momento en el lugar equivocado (por ejemplo, creé un cargador de clases de primer niño / último padre sospechando de los frascos xalan / xerces, pero aún falla), finalmente reduje la causa raíz:

arece que la aplicación web que carga mi código tiene una xalan.jar, especificación versión 1.2

Hice una pequeña prueba, ejecuté el código anterior como independiente (que funcionó bien antes) pero esta vez agregué el xalan.jar desde la aplicación web hasta su classpath y bingo, el mismo error que en el escenario de la aplicación web

Así que inspeccioné ese viejo xalan.jar y me pregunté, ¿qué puede hacer que la JVM cargue su antigua implementación de xalan en lugar de los JDK? después de todo, mi cargador de primera clase para niños también es el último para padres, p. sistema en el medio, por ejemplo: buscar en el cargador de clases del sistema antes que el padre (para evitar cargar tarros JDK anulados por el padre, al igual que este caso de xalan.jar del padre anulando la implementación xalan del JDK)

Entonces algo me llamó la atención: un archivo en: xalan.jar / META-INF / services / llamado javax.xml.transform.TransformerFactory con este contenido:

org.apache.xalan.processor.TransformerFactoryImpl

Así que presioné inmediatamente Ctrl+T en eclipse y busqué el nombre completo calificado ... solo en xalan.jar!

Entonces busqué solo "TransformerFactoryImpl", y esto es lo que tiene el JDK:

com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl

Fácil de ver la diferencia

Entonces, si lees hasta aquí, mi pregunta final es: ¿Cómo hago que mi TransformerFactory use la implementación del JDK y no la del antiguo Xalan? (No puedo eliminar ese jar de la aplicación web desde la que se cargará mi código)

Respuestas a la pregunta(3)

Su respuesta a la pregunta