У меня есть следующий код:
final TransformerFactory factory = TransformerFactory.newInstance();
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
Вторая строка отлично работает в современных JDK (я пробовал 1.8) со значением по умолчанию TransformerFactory
.Но когда я добавляю xalan
(версия 2.7.2, самая последняя) в classpath, я получаю следующее во второй строке:
Exception in thread "main" java.lang.IllegalArgumentException: Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD
at org.apache.xalan.processor.TransformerFactoryImpl.setAttribute(TransformerFactoryImpl.java:571)
at Main.main(Main.java:11)
Я думаю, это потому, что xalan TransformerFactory
не делаетподдержать этот атрибут.Реализация Xalan обрабатывается механизмом ServiceLoader
: он указан в services/javax.xml.transform.TransfomerFactory
в xalan jar.
Можно переопределить реализацию TransformerFactory
, используя системное свойство javax.xml.transform.TransformerFactory
или файл $JRE/lib/jaxp.properties
или передайте имя класса прямо в коде.Но чтобы сделать это, я должен предоставить конкретное имя класса.На данный момент это com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
, но немного страшно жестко закодировать его в системном свойстве, так как при обновлении JDK они могут легко изменить имя класса, и мы просто получим ошибку времени выполнения.
есть ли способ дать TransformerFactory.newInstance()
команду просто игнорировать эту реализацию, предоставляемую xalan?Или скажите «просто используйте системное значение по умолчанию».
PS Я не могу просто удалить xalan
из пути к классам, потому что от него зависит куча других библиотек, которые мы используем.