Как исправить исключение XmlMapper — java.lang.VerifyError: com.fasterxml.jackson?

Android Studio 2.2.2
Compile SDK Android 7.1.1
Build Tools: 25.0.0
Gradle version: 2.14.1
Min SDK: 19
Target SDK: 25

Я столкнулся с проблемой с jackson-dataformat-xml-2.8.5.jar при попытке выполнить это:

 JacksonXmlModule module = new JacksonXmlModule();
 ObjectMapper xmlMapper = new XmlMapper(); //This line

выдает следующее исключение

E/AndroidRuntime: FATAL EXCEPTION: Thread-418
              Process: cb.myAppName, PID: 29744
              java.lang.VerifyError: com/fasterxml/jackson/dataformat/xml/XmlFactory
                  at com.fasterxml.jackson.dataformat.xml.XmlMapper.<init>(XmlMapper.java:49)
                  at cb.myAppName.Core.GenerateReturnXMLFile(Core.java:863)
                  at cb.myAppName.RouteScreenActivity$4.run(RouteScreenActivity.java:305)
                  at java.lang.Thread.run(Thread.java:841)

Из того, что я исследовал, это связано с бинарной несовместимостью, появившейся в Jackson 1.3. Как заявил Тату Салоранта в своем старом блоге, которого, к сожалению, больше нет в сети.

Я всегда высоко ценил совместимость, по крайней мере, для любого «не бета-тестирования» (1.0 и выше). В результате идея заключалась в том, что любой выпуск 1.x будет простым plug-and-play по сравнению с предыдущим. Это работает для выпусков исправлений; но оказывается, что не все минорные релизы работали таким образом. Например, версии 1.2 и 1.3 имеют неожиданные несовместимости.

Проблема в следующем: хотя чаще всего бинарная совместимость является более сложной задачей, чем совместимость исходного кода, то есть, если вы нарушаете совместимость исходного кода, вы почти гарантированно нарушаете бинарную совместимость, это не совсем так. В частности, вполне возможно внести определенные изменения, совместимые с исходным кодом, но НЕ совместимые с двоичными файлами.

Конкретным случаем является изменение метода, который ничего не возвращает ("недействительный метод"), на метод, который что-то возвращает, не нарушает компиляцию. Но на самом деле это нарушает двоичную совместимость. ФУ.

И это именно то, что произошло, когда я решил, что было бы неплохо заставить ObjectMapper следовать «плавному» шаблону, чтобы обеспечить цепочку вызовов методов конфигурации. Это было бы неплохо, если бы не это "скрытое" изменение API...

Не совсем уверен, как это исправить, поскольку я новичок в разработке Android.

Я уже убедился, что использую одну и ту же версию Джексона по всем направлениям, как вы можете видеть в моем списке зависимостей от app/build.gradle, есть ли что-то еще, что я могу упустить?

dependencies {
    compile fileTree(include: ['*.jar'], exclude: ['com.symbol.emdk.jar'], dir: 'libs')
    compile files('../libs/json-20151123.jar')
    provided files('../libs/com.symbol.emdk.jar')
    compile files('../libs/slf4j-api-1.7.6.jar')
    compile files('../libs/logback-android-1.1.1-4.jar')
    compile files('../libs/sun.misc.BASE64Decoder.jar')
    compile files('../libs/ZSDK_ANDROID_API.jar')
    compile 'com.android.support:appcompat-v7:22.2.1'
    compile 'com.android.support:support-v7:22.2.0'
    compile 'com.google.code.ksoap2-android:ksoap2-android:3.6.0'
    compile 'com.google.code.gson:gson:2.4'
    compile 'org.apache.directory.studio:org.apache.commons.io:2.4'
    compile 'org.joda:joda-money:0.11'
    compile 'org.apache.directory.studio:org.apache.commons.lang:2.6'
    compile 'com.google.android.gms:play-services-appindexing:9.8.0'
    compile 'org.greenrobot:eventbus:3.0.0'
    compile 'com.fasterxml.jackson.core:jackson-core:2.8.5'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.8.5'
    compile 'com.fasterxml.jackson.datatype:jackson-datatype-joda:2.8.5'
    compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.8.5'
    compile 'com.github.gcacace:signature-pad:1.2.0'
}

Согласно официальной странице FasterXML Jackson github, расширение, которое я использую, должно поддерживаться...

XML: поддерживает XML; обеспечивает реализацию как потоковой передачи, так и привязки данных. Аналогично режиму JAXB "сначала код" (нет поддержки "сначала схема XML", но можно использовать bean-компоненты JAXB)

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

Об этой проблеме также сообщалось на странице проекта на github, но реального решения найдено не было. -- github.com/FasterXML/jackson-dataformat-xml/issues/116< /а>

ОБНОВЛЕНИЕ: я использовал jarjar для следующих зависимостей:

compile files('../libs/cb-joda-time-2.9.6.jar')
compile files('../libs/cb-joda-money-0.12.jar')
compile files('../libs/cb-jackson-dataformat-xml-2.8.5.jar')
compile files('../libs/cb-jackson-datatype-joda-2.8.5.jar')
compile files('../libs/cb-java-json-0.13.0.jar')
compile files('../libs/cb-json-20160212.jar')

Также обновлены все зависимости до последней версии, а также мои appcompat и support API.

Ошибка продолжается -

java.lang.VerifyError: cb/com/fasterxml/jackson/dataformat/xml/XmlFactory
                      at cb.com.fasterxml.jackson.dataformat.xml.XmlMapper.<init>(XmlMapper.java:49)

Надеюсь, кто-то может пролить свет на это, не уверен, что вызывает это...


person Dayan    schedule 23.11.2016    source источник
comment
Выполнить gradle dependencies. Затем Gradle отобразит фактическое дерево зависимостей, которое он использовал для компиляции и упаковки вашего приложения. Сгенерированное дерево зависимостей может отличаться от объявленных вами зависимостей, например. из-за транзитивных зависимостей. Также: Почему вы используете jarjar?   -  person aha    schedule 30.11.2016
comment
@aha Спасибо, я думал, что мою проблему можно решить с помощью jarjar; просто пробовал все... Не имело значения. Я закончил тем, что пошел с альтернативной библиотекой. Я попробую то, что вы рекомендовали на моей другой ветке.   -  person Dayan    schedule 30.11.2016
comment
Я бы держался подальше от jarjar, за исключением тех случаев, когда нет другого выбора. В основном это происходит, когда вы являетесь автором библиотеки и вам нужно встроить библиотеку из-за конфликтов версий.   -  person aha    schedule 30.11.2016
comment
@ага, так и сделаю, спасибо. Может быть, соберу хороший ответ, и я награжу вас баллами, если я заставлю другую ветку работать.   -  person Dayan    schedule 30.11.2016
comment
Я не уверен, что просто просмотр дерева зависимостей и исправление возможных несоответствий на самом деле приведет вас к такому результату. Есть несколько проблем с библиотеками XML на Android. Например, см. github.com/FasterXML/jackson-dataformat-xml/issues/116. возможные подсказки.   -  person aha    schedule 01.12.2016
comment
@aha Да, я уже натыкался на эту страницу. Первоначальный разработчик, похоже, не знает, как исправить эту конкретную проблему, поскольку она в основном ориентирована на Android. К сожалению, он все еще задерживается, и, по-видимому, лучший вариант - держаться подальше от него и использовать альтернативу jackson-xml -- simple-xml был моим следующим выбором и отлично работает.   -  person Dayan    schedule 01.12.2016
comment
Простой XML — это хорошее решение, которое мы используем для обработки XML. Если вы действительно хотите попробовать еще раз, может помочь включение Stax в качестве зависимости: github. com/FasterXML/jackson-dataformat-xml#android-quirks   -  person aha    schedule 01.12.2016


Ответы (1)


После некоторых исследований и советов от пользователя aha я смог определить, как это исправить. У меня не было времени протестировать его, так как я выбрал другой маршрут и вместо этого использовал библиотеку SimpleXML, которая отлично работает для того, что мне нужно было сделать.

Я обновлю этот ответ более подробно, когда я смогу его протестировать, но вот несколько способов попытаться исправить это:

  • Включите Stax в качестве зависимости: github.com/FasterXML/jackson-dataformat-xml# Android-причуды
  • Выполнить gradle dependencies. Затем Gradle отобразит фактическое дерево зависимостей, которое он использовал для компиляции и упаковки вашего приложения. Сгенерированное дерево зависимостей может отличаться от объявленных вами зависимостей, например. из-за транзитивных зависимостей. -Спасибо ага

Это исходная проблема на github: github.com/FasterXML/jackson-dataformat- xml/проблемы/116

person Dayan    schedule 05.12.2016