1
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 で導入されたバイナリ非互換性に関係しています。Tatu Saloranta が彼の古いブログで述べているように、残念ながらオンラインではありません。

少なくとも「非ベータ」リリース (1.0 以降) については、常に互換性を非常に高く評価してきました。その結果、どの 1.x リリースも以前のリリースよりも単純なプラグ アンド プレイになるという考えがありました。これは、パッチ リリースでは機能します。しかし、すべてのマイナー リリースがこのように機能しているわけではないことがわかりました。たとえば、バージョン 1.2 と 1.3 には予期しない非互換性があります。

問題はこれです: ほとんどの場合、バイナリ互換性はソース互換性よりも難しい目標ですが、つまり、ソース互換性を壊すと、バイナリ互換性を壊すことがほぼ保証されますが、厳密にはそうではありません. 具体的には、ソース互換性はあるがバイナリ互換性がない特定の変更を行うことは十分に可能です。

具体的な例としては、何も返さないメソッド (「void メソッド」) を何かを返すメソッドに変更しても、コンパイルは中断されません。しかし、実際にはバイナリ互換性が損なわれます。うーん。

これはまさに、構成メソッド呼び出しの連鎖を可能にするために、ObjectMapper を「流暢な」パターンに従わせるとよいと判断したときに起こったことです。この「隠された」API の変更がなければ、これは素晴らしいことです...

私はAndroid開発にかなり慣れていないので、これを修正する方法がよくわかりません。

からの依存関係のリストでわかるように、私はすでに全面的に同じバージョンの Jackson を使用していることを確認しました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 スキーマ優先」はサポートされていませんが、JAXB Bean を使用できます)。

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')

また、すべての依存関係を最新バージョンと myappcompatおよびsupportapi にアップグレードしました。

エラーが続く -

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

うまくいけば、誰かがこれに光を当てることができますが、何が原因なのかわかりません...

4

1 に答える 1

0

ユーザーahaからのいくつかの調査とヒントの後、これを修正する方法をさらに特定することができました. 別のルートを取り、SimpleXML代わりにライブラリを使用することになったので、テストする時間がありませんでした。これは、必要なことに最適です。

テストに取り掛かるときに、この回答を詳細に更新しますが、これを試みて修正する方法をいくつか示します。

  • Stax依存関係として含める: github.com/FasterXML/jackson-dataformat-xml#android-quirks
  • 実行しgradle dependenciesます。Gradle は、アプリのコンパイルとパッケージ化に使用した実際の依存関係ツリーを表示します。生成された依存関係ツリーは、たとえば推移的な依存関係のために、宣言した依存関係とは異なる場合があります。-ありがとうございます

これは github の元の問題です: github.com/FasterXML/jackson-dataformat-xml/issues/116

于 2016-12-05T13:47:00.043 に答える