在android上使用jackson-dataformat-xml

deikduxw  于 12个月前  发布在  Android
关注(0)|答案(4)|浏览(182)

我在android上使用jackson-dataformat-xml时遇到了困难
我有一些在oraclejre上运行良好的基本代码

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

字符串

首先我尝试了official documentation adapted for 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在构建时无法将coreliance捆绑到应用程序中

...
: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下面失败(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?

eit6fx6z

eit6fx6z1#

第二种是正确的方法(Android不喜欢你在官方的Java包命名空间中包含类-但话又说回来,我写了原始的答案,所以我有偏见;)。
我相信FactoryConfigurationError: Provider com.bea.xml.stream.MXParserFactory not found错误是由于Android构建工具中的一个bug。根据Google的说法,在以前版本的ADT for Eclipse和Gradle plugin < 0.7.0 the /META-INF/* files are stripped from the JARs during the build process. It seems like >= v0.7.0中不应该有这个问题,但从其他人的报告来看,它听起来仍然可能有问题,并且可能会删除META-INF/services/javax.xml.stream.XMLInputFactory文件,该文件是平台注册Aalto所必需的。
尝试AOSP第59658期评论22中提到的解决方法:
1.右键单击/src/main(其中有/java和/res文件夹),
1.选择新建>文件夹> Java资源文件夹,
1.单击完成(不更改文件夹位置),
1.右键单击new /resources文件夹,
1.选择新建>目录
1.输入“META-INF”(不带引号),
1.右键单击/resources/META-INF文件夹,
1.选择新建>目录
1.输入“服务”(不带引号)
1.复制任何你需要的文件到/resources/META-INF/services
对于您来说,在上面的步骤10中,您需要将this file复制到/resources/META-INF/services中。如果将来文件链接断开,则文件名为javax.xml.stream.XMLInputFactory,并且它由一行组成:
com.fasterxml.aalto.stax.InputFactoryImpl

已编辑

如果您收到“Error:duplicate files during packaging of APK. Path in archive: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中得到修复。

8qgya5xd

8qgya5xd2#

我尝试将XmlPull支持添加到Jacksonxml中。在这里找到分叉的项目:
https://github.com/finvu/jackson-dataformat-xml
目前,仅支持版本2.9.6.(克隆分支jackson-dataformat-xml-2.9.6-XmlPull)
很抱歉,由于时间限制,我无法提供详细的文档。如果你有git和maven的知识来拉取特定的分支并构建jar,那么它应该相对容易。

fjnneemd

fjnneemd3#

我自己打了这个,只是想放弃基于this thread的更新。为了让它现在工作,我必须添加这些依赖项:

implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.2'
implementation 'com.fasterxml.woodstox:woodstox-core:6.5.1'
implementation 'javax.xml.stream:stax-api:1.0-2'

字符串
我不需要对resources目录做任何事情,只需要添加这些依赖项就可以让它工作了。我相信这只在JacksonXML库的2.15版本中可用。

lx0bsm1f

lx0bsm1f4#

对于那些将来需要这个的人:首先在你的Android应用程序中集成Jitpack,按照他们的指示:https://jitpack.io/
然后将jackson-dataformat-xml的GitHub URL粘贴到Jitpack站点对应的文本框中。GitHub URL是:https://github.com/FasterXML/jackson-dataformat-xml。就是这样!享受结果。:)

相关问题