我在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?
4条答案
按热度按时间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保留第一个出现:
字符串
编辑2
This bug可能会影响“pickFirst”。请确保您运行的是最新版本的Android Studio,并更新您的本地工具和Android Gradle插件,以确保您运行的是最新版本的工具。这可能会在Android Studio 1.3 RC1中得到修复。
8qgya5xd2#
我尝试将XmlPull支持添加到Jacksonxml中。在这里找到分叉的项目:
https://github.com/finvu/jackson-dataformat-xml
目前,仅支持版本2.9.6.(克隆分支jackson-dataformat-xml-2.9.6-XmlPull)
很抱歉,由于时间限制,我无法提供详细的文档。如果你有git和maven的知识来拉取特定的分支并构建jar,那么它应该相对容易。
fjnneemd3#
我自己打了这个,只是想放弃基于this thread的更新。为了让它现在工作,我必须添加这些依赖项:
字符串
我不需要对
resources
目录做任何事情,只需要添加这些依赖项就可以让它工作了。我相信这只在JacksonXML库的2.15版本中可用。lx0bsm1f4#
对于那些将来需要这个的人:首先在你的Android应用程序中集成Jitpack,按照他们的指示:https://jitpack.io/
然后将jackson-dataformat-xml的GitHub URL粘贴到Jitpack站点对应的文本框中。GitHub URL是:https://github.com/FasterXML/jackson-dataformat-xml。就是这样!享受结果。:)