JDK 1.6 и Xerces?

В моем текущем проекте мы ориентируемся на среду выполнения JDK 1.6. Для устаревших версий файлы Xerces JAR включены в приложение.

Они больше не нужны, верно? В JDK (на какое-то время) были библиотеки для синтаксического анализа XML, входящие в состав JDK?


person Glenn Bech    schedule 17.10.2011    source источник
comment
Почему бы просто не попробовать, не связывая их?   -  person Dave Newton    schedule 17.10.2011
comment
Они нужны не больше и не меньше, чем с 1.5. В 1.6 есть какая-то причудливая разветвленная версия Xerces, просто причудливая версия отличается от версии 1.5. Согласно @DaveNewton, единственный способ узнать, сработает ли это для вас, — это попробовать.   -  person bmargulies    schedule 17.10.2011
comment
Я думаю, что мне нужно запустить какое-то программное обеспечение для анализа зависимостей в нашем проекте. Я не был бы уверен, если бы какой-то фреймворк с открытым исходным кодом, который мы используем, зависел бы от Xerces напрямую, а не от JAXP.   -  person Glenn Bech    schedule 18.10.2011
comment
JDK Xerces имеет несколько серьезных нерешенных проблем, и неясно, какая версия Apache Xerces находится в каждом JDK. Я получил полный сбой синтаксического анализа действительного XML даже в недавнем JDK 1.8_152, который я мог просто заставить исчезнуть, включив Xerces 2.11 в путь класса. (Хотя это только с 2011 года.) К счастью, интерфейсы JAXP и ServieLoader упрощают переключение реализаций!   -  person Robert Jack Will    schedule 17.02.2018
comment
@RobertJackWill Xerces-J 2.12.0 выпущен (30 апреля 2018 г.), см. здесь: xerces.apache.org/ новости.html   -  person Würgspaß    schedule 14.08.2018


Ответы (4)


Объединение синтаксического анализатора XML не требовалось с версии 1.4, когда был добавлен JAXP. к JRE. Вы должны использовать JAXP, а не напрямую вызывать Xerces. Внутри JRE в любом случае объединяет и использует Xerces (с префиксом com.sun).

person Ingo Kegel    schedule 17.10.2011
comment
Это верно. После некоторого поиска в Google кажется, что JDK 1.4 поддерживает JAXP 1.1 и объединяет класс Apache с неизмененными именами классов; вызывая кучу проблем, когда люди хотели использовать более новые версии, чем та, что была в комплекте с JDK. (people.apache.org/~edwingo/jaxp-faq.html#JDK14 ) - person Glenn Bech; 18.10.2011

Эти службы XML подключаются к среде приложений с помощью так называемого механизма «поставщика услуг».

Это работает следующим образом:

  1. Он пытается найти системное свойство, которое точно указывает на фабричный класс, который следует использовать. Например. -Djavax.xml.parsers.SAXParserFactory=<some class>.
  2. Если системное свойство не найдено, FactoryFinder ищет свойство в специальном файле свойств. Например ${java.home}/lib/jaxp.properties.
  3. Если свойство файла не найдено, FactoryFinder ищет описание службы в пути к классу META-INF/services/<some service>, например. META-INF/services/javax.xml.parsers.SAXParserFactory. Это файл, который должен содержать имя фабричного класса, например org.apache.xerces.jaxp.SAXParserFactoryImpl.
  4. Если в пути к классам нет таких файлов, java использует свою фабричную реализацию по умолчанию.

Поэтому, если у вас нет системного свойства, указывающего на очевидный фабричный класс, java спокойно выберет подходящую реализацию.

person svaor    schedule 17.10.2011
comment
Так работает стандартный статический SAXParserFactory код, см. ссылка для этой и некоторых других деталей. Это способы объединения первоначальных связанных механизмов JDK/JRE с библиотекой XML по вашему выбору. Существует также возможность полностью заменить связанные XML-библиотеки JDK/JRE с помощью механизма переопределения одобренных стандартов Java: docs.oracle.com/javase/7/docs/technotes/guides/standards , например -Djava.endorsed.dirs=path_to_folder_containing_new_library_jars. - person Sergey Ushakov; 17.11.2012

Парсер в JDK был форком Xerces, но он очень глючный. Я бы рекомендовал производственным приложениям всегда использовать версию парсера Apache. Ошибки встречаются редко, но они непредсказуемы, и они затрагивают не только крайние случаи, которые не встречаются в реальной жизни; Я видел много случаев, когда анализируются довольно скучные XML-документы, а поврежденные данные передаются в приложение для значений атрибутов. Sun/Oracle не проявили интереса к устранению проблемы. Используйте Apache Xerces каждый раз.

ОБНОВЛЕНИЕ (2018 г.)

Насколько я вижу, проблемы с JDK-версией Xerces были решены в Java 8, поэтому этот совет устарел.

person Michael Kay    schedule 17.10.2011
comment
Привет. Есть ли у вас какие-то ссылки/описания ошибок в парсерах JDK? А о каких версиях JDK вы говорите? - person Glenn Bech; 18.10.2011
comment
Когда люди присылают мне отчеты об ошибках Saxon, которые, как выясняется, связаны с проблемами синтаксического анализатора JDK, я больше не беспокоюсь о том, чтобы сообщать о проблемах в Oracle, потому что это не дает никакого эффекта. Так что нет, я не могу цитировать ссылки. - person Michael Kay; 25.01.2012
comment
Начиная с Java 9 в JDK включена довольно стабильная версия Xerces (v2.11). Поэтому нет необходимости использовать версию Xerces для Apache из Java 9. см. - person VinZ; 29.11.2018

Механизм отмены утвержденных стандартов работает просто отлично. Djava.endorsed.dirs=path_to_folder_content_new_library_jars решит проблему с JDK 1.6.

Я проверил приведенное выше решение в контексте Thymleaf. В некоторых случаях, если вы переходите в режим LEGACYHTML5 и используете парсер NekoHtml для автоматического исправления незакрытых тегов html, Neko зависит от jar-файлов Xerces. Установка пути к классам не решает проблему.

Спасибо s-n-ushakov.

person justjava    schedule 12.06.2014