Как две программы, в зависимости от разных реализаций Xalan, могут сосуществовать в одном VM / System Classloader?
Я задал этот вопрос в нескольких вариантах, и я думаю, что я не задаю правильный вопрос. Теперь я подозреваю, что Xalan, поскольку он реализует одобренный стандарт Java, может иметь только одну реализацию на данном VM / ClassLoader.
Так это правда? 2 реализации Xalan не могут "жить" в одном и том же System ClassLoader? Или, если они могут, как?
2 ответа
Это кажется удивительным ответом:
Для каждой реализации Xalan используйте отдельный загрузчик классов и добавьте файл в
META-INF\services\
называется
javax.xml.transform.TransformerFactory
Отредактируйте его и поместите только содержимое Xalan, которое будет использовать загрузчик классов, например:
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
ПРИМЕЧАНИЕ: здесь хорошо то, что в отличие от обычного делегирования загрузки классов, META-INF\services
сначала выполняется поиск в текущем загрузчике классов, где классы ищутся в родительском, затем в системном и только потом в дочернем загрузчике классов
В jdk включена некоторая версия xalan. Для большинства случаев мой личный опыт показывает, что использования этой версии достаточно. Даже если это может быть предыдущая версия, есть ли какая-то новая разработка xalan в настоящее время? Я предпочитаю использовать включенную, сильно протестированную версию.
Я не думаю, что иметь xsl-трансформеры в одном и том же jdk - это хорошая идея (даже если я думаю, что это можно сделать). Если вам действительно нужно использовать обновленную версию xalan вместо jdk, вы можете обратиться к этому faq: http://xml.apache.org/xalan-j/faq.html
Я удалил все специфические зависимости xalan в больших приложениях, используя только встроенную. Библиотеки как FOP, хотя ранее они претендовали на то, что им нужен какой-то конкретный xalan jar, без него работали нормально, и это решало множество проблем с загрузкой классов (сервер приложений java ee создавал проблемы в некоторых ситуациях, когда xalan был упакован).