关于Java:在Android上使用jackson-dataformat-xml

Using jackson-dataformat-xml on android

我在android上使用jackson-dataformat-xml苦苦挣扎

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

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

首先我尝试了适用于官方文档gradle(对我而言,不确定是否正确完成):

1
2
3
4
5
6
7
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无法将将核心库绑定到应用程序中的构建时间

1
2
3
4
5
6
...
: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的答案(基本上,他用前缀名称重新打包corelibs并重建jackson-dataformat-xml以使用前缀名称)。

1
2
3
4
5
6
7
8
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'

,并且在复制

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

时构建时间失败,因此添加了:

1
2
3
4
5
packagingOptions {
    ...
    exclude 'META-INF/services/com.fasterxml.jackson.core.JsonFactory'
    exclude 'META-INF/services/com.fasterxml.jackson.core.ObjectCodec'
}

添加排除项时,它将构建和部署,但在以下stackdump上运行时失败(AFAIK无法找到SAX提供程序,即使将其添加到我所理解的类路径中)

1
2
3
4
5
6
7
8
9
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错误是由于Android构建工具中的错误所致。在早期版本的ADT for Eclipse和Gradle插件<0.7.0中,/META-INF/*文件在构建过程中从JAR中剥离。 Google似乎> = v0.7.0应该没有问题,但是从其他人的报告看来,这仍然可能是有问题的,并且可能会删除平台注册所需的META-INF/services/javax.xml.stream.XMLInputFactory文件Aalto。

尝试使用AOSP问题59658注释22中提到的解决方法:

  • right click on /src/main (where you have /java and /res folders),
  • select New > Folder > Java Resources Folder,
  • click Finish (do not change Folder Location),
  • right click on new /resources folder,
  • select New > Directory
  • enter"META-INF" (without quotes),
  • right click on /resources/META-INF folder,
  • select New > Directory
  • enter"services" (without quotes)
  • copy any file you need into /resources/META-INF/services
  • 对于您来说,在上面的步骤10中,您需要将此文件复制到/resources/META-INF/services中。万一将来文件链接中断,文件的名称为javax.xml.stream.XMLInputFactory,它由一行组成:

    com.fasterxml.aalto.stax.InputFactoryImpl

    EDIT

    如果您收到"错误:在打包APK时出现重复文件...归档路径:META-INF / services / javax.xml.stream.XMLInputFactory ",则可以尝试通过以下方式告诉Gradle保持首次出现: pb>

    1
    2
    3
    4
    5
    android {
      packagingOptions {
        pickFirst 'META-INF/services/javax.xml.stream.XMLInputFactory'
      }
    }

    EDIT 2

    此错误可能会影响" pickFirst "。请确保您正在运行最新版本的Android Studio,并更新本地工具和Android Gradle插件以确保您正在运行最新版本的工具。这可能已在Android Studio 1.3 RC1中修复。


    我试图将XmlPull支持添加到杰克逊xml。在此处找到分叉的项目:

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

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

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


    针对将来需要此功能的用户:首先按照他们的说明将Jitpack集成到您的Android应用中:https://jitpack.io/

    然后将其粘贴到jackson-的GitHub网址上Jitpack网站相应文本框中的dataformat-xml。 GitHub网址是:https://github.com/FasterXML/jackson-dataformat-xml,就是这样!享受结果。 :)