java - 在 android 上使用 jackson-dataformat-xml

标签 java android jaxb jackson jackson-modules

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

我有一些非常基本的代码,可以在 oracle jre 上正常运行

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

首先我尝试了 official documentation适用于 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 将核心库 bundle 到应用程序中的构建时间失败

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

第二次尝试跟随 Sean 的 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'
}

当添加它构建和部署的排除项时,但在下面的 stackdump 上运行时失败(据我所知,它找不到 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 的正确方法是什么?

最佳答案

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

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

尝试 AOSP issue 59658 comment 22 中提到的解决方法:

  1. right click on /src/main (where you have /java and /res folders),
  2. select New > Folder > Java Resources Folder,
  3. click Finish (do not change Folder Location),
  4. right click on new /resources folder,
  5. select New > Directory
  6. enter "META-INF" (without quotes),
  7. right click on /resources/META-INF folder,
  8. select New > Directory
  9. enter "services" (without quotes)
  10. copy any file you need into /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 中得到修复.

关于java - 在 android 上使用 jackson-dataformat-xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31360025/

相关文章:

java - 如何从Java方法返回.class?

java - 当java中没有方法时,标记接口(interface)有什么用以及它如何发挥作用?

android - 注销并关闭 Android 中的所有 Activity

jboss - 如何在一个 Web 应用程序中执行 Jersey 1.6 和 axis2 1.3 期间解决 "java.lang.LinkageError: loader constraint violation"问题?

java - 为什么我不能在未初始化的局部变量上放置断点?

java - 以 return 结束 void 方法;

java android 从数据库加载项目到listview?

android - Release build crashlytics 不在崩溃报告中发送行号?

xml - javax.xml.bind.UnmarshalException : unexpected element (uri :"", 本地 :"sRAssignments")。预期的元素是

java - 使用 @XmlAnyElement 的 XML 映射