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) |
数字2是正确的方法(当您在官方Java程序包名称空间中包含类时,Android不喜欢它-但再次,我写了原始答案,因此有偏见;)))。
尝试使用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中,您需要将此文件复制到
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,就是这样!享受结果。 :)