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

我正在使用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”:

当不构build核心库时,build议或错误地使用核心类(java。*或javax。*)。

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

但是,您可能实际上正试图在核心命名空间中定义一个类,例如,您可能从非Android虚拟机项目中获取了该类的源。 这肯定是行不通的。 至less,它会危害您的应用程序与未来版本的平台的兼容性。 这也常常是有问题的合法性。

如果你真的打算build立一个核心库 – 这只是作为创build一个完整的虚拟机分布的一部分,而不是编译一个应用程序 – 然后使用“ – 核库”选项来抑制这个错误信息。

如果你继续使用“–core-library”,但实际上正在构build一个应用程序,那么应该预先警告你的应用程序在某个时候仍然无法build立或运行。 请为愤怒的客户做好准备,例如,发现您的应用程序在升级操作系统后就停止运行。 你会被责怪这个问题。

如果你正在使用一些恰好在核心软件包中的代码,那么最简单的安全select就是重新打包代码。 也就是说,将有问题的类移动到您自己的包名称空间中。 这意味着他们永远不会与核心系统类冲突。 JarJar是一个工具,可以帮助你在这个努力。 如果你发现你不能这样做,那么这就表明你所走的道路最终会导致痛苦,痛苦,悲伤和悲伤。

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

我已经看过Android Studio忽略 – 核心库标志没有帮助我。 我认为这些答案已经过时了,这就是为什么我要问一个新问题。

我做了什么:

  1. 的build.gradle:

    dexOptions { coreLibrary true; } 
  2. 的build.gradle:

     dexOptions { preDexLibraries = false } project.tasks.withType(com.android.build.gradle.tasks.Dex) { additionalParameters=['--core-library'] } 
  3. 文件 – >其他设置 – >默认设置 – >编译器 – > Android编译器,并检查'​​添加 – 核库标志'

这些都没有工作。 有没有办法设置这个选项?


编辑:为什么我需要STAX:我正在做一些与工作簿,工作表,列,单元格的.xlsx文件的东西。 当我只包含poi-ooxml-3.14-beta1-20151223.jar在构build时class file for org.apache.poi.ss.usermodel.Workbook not found错误,说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; 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)

更新所以,从http://poi.apache.org/faq.html#faq-N1017E

18.为什么我得到java.lang.NoClassDefFoundError:javax / xml / stream / XMLEventFactory.newFactory()

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

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

  • 这些库是Java 5及更低版本所必需的,但实际上并不需要符合规范的Java 6实现,因此请尝试从类path中移除这些库。 如果这是不可能的,请尝试升级到这些jar文件的较新版本。
  • 运行IBM Java 6(可能作为WebSphere Application Server的一部分):IBM Java 6不提供XML标准所需的所有接口,只有IBM Java 7似乎提供了正确的接口,所以请尝试升级您的JDK。
  • 具有过时补丁级别的Sun / Oracle Java 6:某些接口仅在Java的某些补丁级别中包含/修复。尝试使用最新的可用补丁级别运行,或者更好地使用Java 7/8,其中此function应该可用案例。

所以,如果我正确地阅读这个,在Android中,我确实需要一个“截断的”STAX api。

Solutions Collecting From Web of "在Android中集成org.apache.poi和javax.xml.stream。*包(stax-api) – 如何在Android Studio中设置–core-library参数?"

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

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

android5xlsx提供了现成的jar文件来包含在你的应用程序中,但是目前使用的是过时的POI版本。 poi-on-android基于POI 3.15-beta1,可以很容易地重新编译POI的新版本。 这两个项目都适用于Android 5+,并附带示例代码,并允许在Android上基本使用Apache POI。