首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在android中集成org.apache.poi和javax.xml.stream.*包(stax-api) --如何在Android Studio中设置--core-library参数?

在android中集成org.apache.poi和javax.xml.stream.*包(stax-api) --如何在Android Studio中设置--core-library参数?
EN

Stack Overflow用户
提问于 2016-01-05 20:51:37
回答 2查看 5.3K关注 0票数 20

我使用的是Android studio 1.5.1

我想在我的android项目中包含org.apache.poi-ooxml库。要包含该库,我需要包含其他一些库依赖项,其中包括stax-api库。

stax api的问题在于它拥有javax.*中的所有包,这是一个“核心库”。Java jdk包含了所有这些库,所以如果我要在Java SE中使用它,就不需要stax-api库了。另一方面,Android有一个“部分”stax-api库。对于android,我只需要javax.xml.stream.*包。这意味着我需要提取stax-api,删除除javax.xml.stram包之外的所有内容,然后重新打包它。

所以我猜在Android中使用这个修改过的库是安全的。但是,它有javax.*包,根据Android studio的说法,它是一个核心库,所以Android Studio (或者Android Studio中的任何组件)给了我一个警告:

在处理“javax/xml/stream/EventFilter.class”时遇到问题:

在不构建核心库时,不明智或错误地使用核心类(java.*或javax.*)。

这通常是由于在使用IDE (如Eclipse)时,无意中在应用程序的项目中包含了一个核心库文件。如果你确定你不是故意定义一个核心类,那么这是最有可能的解释。

但是,您可能实际上正在尝试在核心名称空间中定义一个类,例如,您可能从一个非Android虚拟机项目中获取了该名称空间的源代码。这肯定是行不通的。至少,它会危及应用程序与平台未来版本的兼容性。它的合法性也经常受到质疑。

如果您真的想要构建一个核心库--这只适合作为创建一个完整的虚拟机发行版的一部分,而不是编译一个应用程序--那么使用"-- core - library“选项来消除这个错误消息。

如果您继续使用"--core-library“,但实际上是在构建一个应用程序,那么要预先警告您的应用程序在某个时刻仍然无法构建或运行。请为愤怒的客户做好准备,例如,一旦他们升级了操作系统,您的应用程序就会停止运行。你将为这个问题承担责任。

如果您合法地使用了一些恰好位于核心包中的代码,那么最简单、最安全的替代方法就是重新打包这些代码。也就是说,将有问题的类移动到您自己的包命名空间中。这意味着它们永远不会与核心系统类冲突。JarJar是一个可能在这方面对你有帮助的工具。如果你发现你不能做到这一点,那么这表明你所走的道路最终将导致痛苦、痛苦、悲伤和悲哀。

所以,我想使用--core-library选项。但是在哪里设置呢?

我已经看过Android Studio ignore --core-library flag了,这对我没什么帮助。我认为这些答案已经过时了,这就是为什么我要问一个新的问题。

我尝试过的东西:

  1. build.gradle:

dexOptions { coreLibrary true;}

  • build.gradle:

dexOptions { preDexLibraries = false } project.tasks.withType(com.android.build.gradle.tasks.Dex) {additionalParameters=‘--

  • ’}核心文件文件-->其他设置-->默认设置-->编译器--> Android编译器并检查'Add --preDexLibraries-library标志‘

这些都不管用。有什么方法可以设置这个选项吗?

编辑:我为什么需要STAX:我正在处理.xlsx文件的工作簿、工作表、列和单元格。当我只包含poi-ooxml-3.14-beta1-20151223.jar时,我在构建时得到一个错误,显示为class file for org.apache.poi.ss.usermodel.Workbook not found

在运行时包含poi-3.14-beta1-20151223.jar之后,我得到了Could not find method org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook.isSetBookViews, referenced from method org.apache.poi.xssf.usermodel.XSSFWorkbook

在运行时包含poi-ooxml-schemas-3.14-beta1-20151223.jar时,我得到了Failed resolving Lorg/openxmlformats/schemas/spreadsheetml/x2006/main/CTWorkbook; interface 59 'Lorg/apache/xmlbeans/XmlObject;java.lang.VerifyError: org/apache/poi/xssf/usermodel/XSSFWorkbook

在运行时包含xmlbeans-2.6.0.jar时,我得到了Could not find method javax.xml.stream.events.Namespace.getPrefix, referenced from method org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.getQNamejava.lang.NoClassDefFoundError: javax.xml.stream.XMLEventFactory at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.<clinit>(PackagePropertiesMarshaller.java:41)

更新 So,来自http://poi.apache.org/faq.html#faq-N1017E

javax/xml/stream/XMLEventFactory.newFactory():

18.为什么我需要java.lang.NoClassDefFoundError?

此错误表示XMLEventFactory类不提供POI所依赖的功能。这可能有许多不同的原因:

过时的xml-apis.jar、stax-apis.jar或xercesImpl.jar:

  • 这些库在Java5和更低版本中是必需的,但在符合规范的Java6实现中实际上并不是必需的,因此请尝试从类路径中删除这些库。如果这是不可能的,请尝试升级到那些jar XML Java6的更新版本(可能是XMLApplicationServer6的一部分):IBMJava6没有提供files.
  • Running标准所需的所有接口,似乎只有IBMJava7提供了正确的接口,因此,尝试使用过时的补丁级别升级您的JavaJava6:某些接口仅包含/修复在JDK.
  • Sun/Oracle 6的某些补丁级别中。尝试使用最新的可用补丁级别运行,甚至更好地使用Java7/8,该功能应在所有情况下都可用。

所以,如果我没看错的话,在Android中,我确实需要一个“截断的”STAX api。

EN

回答 2

Stack Overflow用户

发布于 2016-07-22 02:49:04

当您尝试使用Apache POI以及它在Android应用程序中依赖的库时,会出现许多问题。在xmlbeans.jar中有重复的类,"javax.*“包被Android编译器和其他一些编译器禁止。

目前有两个项目试图解决这些问题:

android5xlsx提供现成的jar文件以包含在您的应用程序中,但是当前使用的POI版本有些过时。poi- on -android基于POI 3.15-beta1,可以相当容易地为更新版本的POI重新编译。这两个项目都是针对安卓5+的,并附带了示例代码,应该允许在安卓上基本使用Apache POI。

票数 3
EN

Stack Overflow用户

发布于 2020-06-12 23:37:05

implementation 'javax.xml.stream:stax-api:1.0'添加到您的应用程序build.gradle中,因为缺少一些核心类

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34612172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档