Использование jackson-dataformat-xml на Android

Я изо всех сил пытаюсь использовать jackson-dataformat-xml на Android

У меня есть очень простой код, который отлично работает на oracle jre.

JacksonXmlModule module = new JacksonXmlModule();
module.setDefaultUseWrapper(false);
XmlMapper xmlMapper = new XmlMapper(module);

Сначала я попробовал официальную документацию, адаптированную для Gradle (мной , не уверен, что сделал правильно):

compile 'com.fasterxml.jackson.core:jackson-core:2.5.4'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.5.4'
compile 'com.fasterxml.jackson.core:jackson-databind:2.5.4'
compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.5.4'

compile 'org.codehaus.woodstox:woodstox-core-asl:4.4.1'
compile 'javax.xml.stream:stax-api:1.0-2'

Результат: gradle не работает во время сборки при объединении базовых библиотек в приложение.

...
:app:preDexDebug
trouble processing "javax/xml/stream/EventFilter.class":
Ill-advised or mistaken usage of a core class (java.* or javax.*)
when not building a core library.
...

Вторая попытка следовать ответу Шона (в основном он переупаковывает corelibs с префиксными именами и перестраивает jackson-dataformat-xml для использования префиксных имен)

compile 'com.fasterxml.jackson.core:jackson-core:2.1.2'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.1.2'
compile 'com.fasterxml.jackson.core:jackson-databind:2.1.2'
// Repackaged XML-specific libraries
compile 'edu.usf.cutr.android.xml:jackson-dataformat-xml-android:2.1.2'
compile 'edu.usf.cutr.android.xml:stax2-api-android:3.1.1'
compile 'edu.usf.cutr.android.xml:stax-api-android:1.0-2'
compile 'edu.usf.cutr.android.xml:aalto-xml-android:0.9.8'

И время сборки не удалось на дубликаты

Duplicate files copied in APK META-INF/services/com.fasterxml.jackson.core.ObjectCodec

так добавил:

packagingOptions {
    ...
    exclude 'META-INF/services/com.fasterxml.jackson.core.JsonFactory'
    exclude 'META-INF/services/com.fasterxml.jackson.core.ObjectCodec'
}

При добавлении исключений, которые он создает и развертывает, но происходит сбой во время выполнения ниже дампа стека (насколько я понимаю, он не может найти поставщика SAX, даже если он добавлен в путь к классам, насколько я понимаю)

edu.usf.cutr.javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.MXParserFactory not found
            at edu.usf.cutr.javax.xml.stream.FactoryFinder.newInstance(FactoryFinder.java:72)
            at edu.usf.cutr.javax.xml.stream.FactoryFinder.find(FactoryFinder.java:176)
            at edu.usf.cutr.javax.xml.stream.FactoryFinder.find(FactoryFinder.java:92)
            at edu.usf.cutr.javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:136)
            at com.fasterxml.jackson.dataformat.xml.XmlFactory.<init>(XmlFactory.java:97)
            at com.fasterxml.jackson.dataformat.xml.XmlFactory.<init>(XmlFactory.java:85)
            at com.fasterxml.jackson.dataformat.xml.XmlFactory.<init>(XmlFactory.java:82)
            at com.fasterxml.jackson.dataformat.xml.XmlMapper.<init>(XmlMapper.java:46)

Как правильно двигаться вперед по пункту 1 или пункту 2?


person Aksel Willgert    schedule 11.07.2015    source источник
comment
К вашему сведению - я добавил несколько правок в свой первый ответ. Я устранял ту же (?) проблему по другому вопросу - stackoverflow.com/questions/30968735/.   -  person Sean Barbeau    schedule 14.07.2015


Ответы (3)


Номер 2 - правильный подход (Android не любит, когда вы включаете классы в официальное пространство имен пакетов Java, но опять же, я написал исходный ответ, поэтому я предвзят;)).

Я считаю, что ошибка FactoryConfigurationError: Provider com.bea.xml.stream.MXParserFactory not found связана с ошибкой в ​​сборке Android. инструменты. В предыдущих версиях плагина ADT для Eclipse и Gradle ‹ 0.7.0 файлы /META-INF/* удаляются из JAR-файлов в процессе сборки. Похоже, что в >= v0.7.0 не должно быть проблем, согласно Google, но из других отчетов кажется, что это все еще может быть проблематично и потенциально может удалить файл META-INF/services/javax.xml.stream.XMLInputFactory, который необходим платформе для регистрации Aalto.

Попробуйте обходной путь, упомянутый в выпуске 59658 AOSP, комментарий 22. :

  1. щелкните правой кнопкой мыши /src/main (где у вас есть папки /java и /res),
  2. выберите «Создать» > «Папка» > «Папка ресурсов Java»,
  3. нажмите «Готово» (не меняйте расположение папки),
  4. щелкните правой кнопкой мыши новую папку /resources,
  5. выберите «Создать» > «Каталог».
  6. введите "META-INF" (без кавычек),
  7. щелкните правой кнопкой мыши папку /resources/META-INF,
  8. выберите «Создать» > «Каталог».
  9. введите "услуги" (без кавычек)
  10. скопируйте любой файл, который вам нужен, в /resources/META-INF/services

Для вас на шаге 10 выше вам нужно будет скопировать этот файл в /resources/META-INF/services. На случай, если в будущем ссылка на файл будет нарушена, имя файла будет javax.xml.stream.XMLInputFactory и состоит из одной строки:

com.fasterxml.aalto.stax.InputFactoryImpl

ИЗМЕНИТЬ

Если вы получаете «Ошибка: повторяющиеся файлы во время упаковки APK... Путь в архиве: META-INF/services/javax.xml.stream.XMLInputFactory», вы можете попробовать указать Gradle сохранить первое вхождение с помощью:

android {
  packagingOptions {
    pickFirst 'META-INF/services/javax.xml.stream.XMLInputFactory'
  }
}

ИЗМЕНИТЬ 2

Эта ошибка может влиять на "pickFirst". Убедитесь, что вы используете последнюю версию Android Studio, и обновите свои локальные инструменты и плагин Android Gradle, чтобы убедиться, что вы используете самую последнюю версию инструментов. Это может быть исправлено в Android Studio 1.3 RC1.

person Sean Barbeau    schedule 13.07.2015
comment
Чувак, ты потрясающий. Спасибо. - person Dogcat; 25.12.2015
comment
Любые обновления по этому вопросу с этого времени? Я попробовал эти шаги, но это не помогает решить проблему - person anber; 06.04.2016
comment
@anber Вы получаете ту же трассировку стека, что и в этом вопросе? - person Sean Barbeau; 06.04.2016
comment
Да, точно такая же трассировка стека. Может быть, что-то вроде этого может помочь - github.com/jamesagnew/hapi-fhir/issues/199 ? - person anber; 07.04.2016
comment
Эта проблема с AOSP все еще не решена: code.google.com/p/android /issues/detail?id=158630. Я думаю, что это проблема - пожалуйста, пометьте это. После того, как это исправлено, он может работать правильно. - person Sean Barbeau; 07.04.2016
comment
@SeanBarbeau Ваш файл Dropbox больше недоступен. Не могли бы вы описать, что было в этом файле и как вы его создали? Я пробовал простой исходный код Java безрезультатно, должен ли это быть файл .class? - person Agent_L; 20.11.2018
comment
@Agent_L упс! Попробуйте dropbox.com/s/3w694gqqwilbh4k/, должно работать. Сейчас я на мобильном телефоне, но позже постараюсь обновить пост со встроенным контентом. - person Sean Barbeau; 21.11.2018
comment
@Agent_L Я только что обновил ответ, указав имя файла и содержимое в строке. - person Sean Barbeau; 27.11.2018

Я попытался добавить поддержку XmlPull в jackson xml. Найдите разветвленный проект здесь:

https://github.com/finvu/jackson-dataformat-xml

В настоящее время поддерживается только для версии 2.9.6. (клонируйте ветку jackson-dataformat-xml-2.9.6-XmlPull)

Извините, я не могу предоставить подробную документацию из-за нехватки времени. Если у вас есть знания о git и maven, чтобы вытащить конкретную ветку и собрать банку, то это должно быть относительно легко.

person praveenp    schedule 11.02.2019

Тем, кому это понадобится в будущем: сначала интегрируйте Jitpack в свое Android-приложение, следуя их инструкциям: https://jitpack.io/

Затем вставьте URL-адрес GitHub jackson-dataformat-xml в соответствующее текстовое поле сайтов Jitpack. URL GitHub: https://github.com/FasterXML/jackson-dataformat-xml. Вот и все! Наслаждайтесь результатом. :)

person Victor    schedule 16.02.2019