【问题标题】:Using jackson-dataformat-xml on android在 android 上使用 jackson-dataformat-xml
【发布时间】:2015-09-30 08:08:55
【问题描述】:

我正在努力在 android 上使用 jackson-dataformat-xml

我有一些非常基本的代码可以在 oracle jre 上正常工作

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

首先我尝试了适合 gradle 的 official documentation(我自己,不确定是否正确):

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.
...

第二次尝试关注肖恩的answer (基本上他用前缀名重新打包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'
}

当添加它构建和部署的排除项时,但在下面的堆栈转储上运行时失败(AFAIK 它找不到 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 上前进的正确方法是什么?

【问题讨论】:

标签: java android jaxb jackson jackson-modules


【解决方案1】:

2 号是正确的方法(当您在官方 Java 包命名空间中包含类时,Android 不喜欢它 - 但话又说回来,我写了原始答案,所以我有偏见;)。

我相信FactoryConfigurationError: Provider com.bea.xml.stream.MXParserFactory not found 错误是由a bug in the Android build tools 引起的。在以前版本的 ADT for Eclipse 和 Gradle 插件 /META-INF/* 文件在构建过程中从 JAR 中剥离。根据 Google 的说法,似乎 >= v0.7.0 应该没有问题,但从其他人的报告来看,这听起来仍然可能有问题,并且可能会删除平台注册所需的 META-INF/services/javax.xml.stream.XMLInputFactory 文件阿尔托。

尝试AOSP issue 59658 comment 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 步中,您需要将 this file 复制到 /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

This bug 可能会影响“pickFirst”。请确保您运行的是最新版本的 Android Studio,并更新您的本地工具和 Android Gradle 插件以确保您运行的是最新版本的工具。这可以在Android Studio 1.3 RC1 中修复。

【讨论】:

  • 老兄,你太棒了。谢谢。
  • 从这个时候开始有关于这个问题的更新吗?我尝试了这些步骤,但它无助于解决问题
  • @anber 你得到的堆栈跟踪与这个问题完全相同吗?
  • 是的,完全相同的堆栈跟踪。也许这样的事情可以帮助 - github.com/jamesagnew/hapi-fhir/issues/199 ?
  • 此 AOSP 问题仍未解决 - code.google.com/p/android/issues/detail?id=158630。我认为这就是问题所在 - 请给它加星标。修复后,它可能会正常工作。
【解决方案2】:

我已尝试将 XmlPull 支持添加到 jackson xml。在这里找到分叉的项目:

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

目前,仅支持 2.9.6 版本。 (克隆分支jackson-dataformat-xml-2.9.6-XmlPull)

抱歉,由于时间限制,我无法提供详细的文档。如果你有 git 和 maven 的知识来拉一个特定的分支并构建 jar,那么它应该相对容易。

【讨论】:

    【解决方案3】:

    致那些将来需要它的人: 首先按照他们的说明将 Jitpack 集成到您的 Android 应用程序中: https://jitpack.io/

    然后将 jackson-dataformat-xml 的 GitHub url 粘贴到 Jitpack 站点的相应文本框中。 GitHub 网址是: https://github.com/FasterXML/jackson-dataformat-xml。 而已!享受结果。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-09
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 2019-08-03
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多