Aks*_*ert 7 java android jaxb jackson jackson-modules
我正在使用android上的jackson-dataformat-xml
我有一些非常基本的代码,可以在oracle jre上正常工作
JacksonXmlModule module = new JacksonXmlModule();
module.setDefaultUseWrapper(false);
XmlMapper xmlMapper = new XmlMapper(module);
Run Code Online (Sandbox Code Playgroud)
首先,我尝试了适合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'
Run Code Online (Sandbox Code Playgroud)
结果:gradle将关于将corelibraries捆绑到应用程序中的构建时间失败
...
: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.
...
Run Code Online (Sandbox Code Playgroud)
试图按照肖恩的回答进行第二次尝试 (基本上他用前缀名称重新包装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'
Run Code Online (Sandbox Code Playgroud)
复制时构建时间失败
Duplicate files copied in APK META-INF/services/com.fasterxml.jackson.core.ObjectCodec
Run Code Online (Sandbox Code Playgroud)
添加:
packagingOptions {
...
exclude 'META-INF/services/com.fasterxml.jackson.core.JsonFactory'
exclude 'META-INF/services/com.fasterxml.jackson.core.ObjectCodec'
}
Run Code Online (Sandbox Code Playgroud)
当添加它构建和部署的排除项时,但是在下面的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)
Run Code Online (Sandbox Code Playgroud)
在#1或#2上前进的正确方法是什么?
第 2 种方法是正确的方法(Android 不喜欢在官方 Java 包命名空间中包含类 - 但话又说回来,我写了原始答案,所以我有偏见;))。
我相信该FactoryConfigurationError: Provider com.bea.xml.stream.MXParserFactory not found错误是由于Android 构建工具中的错误造成的。在以前版本的 Eclipse 和 Gradle 插件的 ADT < 0.7.0 中,文件/META-INF/*会在构建过程中从 JAR 中删除。根据 Google 的说法,>= v0.7.0 似乎不应该有问题,但从其他人的报告来看,它听起来仍然可能有问题,并且可能会删除META-INF/services/javax.xml.stream.XMLInputFactory平台注册 Aalto 所需的文件。
尝试AOSP 问题 59658 评论 22中提到的解决方法:
- 右键单击 /src/main (其中有 /java 和 /res 文件夹),
- 选择新建 > 文件夹 > Java 资源文件夹,
- 单击“完成”(不要更改文件夹位置),
- 右键单击新的 /resources 文件夹,
- 选择新建 > 目录
- 输入“META-INF”(不带引号),
- 右键单击
/resources/META-INF文件夹,- 选择新建 > 目录
- 输入“服务”(不带引号)
- 将您需要的任何文件复制到
/resources/META-INF/services
对于您来说,在上面的步骤 10 中,您需要将此文件复制到/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'
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2
此错误可能会影响“pickFirst”。请确保您运行的是最新版本的 Android Studio,并更新您的本地工具和 Android Gradle 插件,以确保您运行的是最新版本的工具。这可能会在Android Studio 1.3 RC1中得到修复。
| 归档时间: |
|
| 查看次数: |
5661 次 |
| 最近记录: |