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

Posted

技术标签:

【中文标题】在 android 中集成 org.apache.poi 和 javax.xml.stream.* 包 (stax-api) - 如何在 Android Studio 中设置 --core-library 参数?【英文标题】:integrating org.apache.poi and the javax.xml.stream.* package (stax-api) in android - how to set the --core-library argument in Android Studio? 【发布时间】:2016-04-09 07:21:25 【问题描述】:

我使用的是 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)时。如果 你确定你不是故意定义一个核心类,那么这个 是对正在发生的事情的最可能的解释。

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

如果你真的打算建立一个核心库——这只是 适合作为创建完整虚拟机分发的一部分, 而不是编译应用程序 - 然后使用 “--core-library”选项来禁止显示此错误消息。

如果您继续使用“--core-library”,但实际上是在构建一个 应用程序,然后预先警告您的应用程序仍然会失败 在某个时候构建或运行。请为愤怒的顾客做好准备 例如,他们发现您的应用程序停止运行一次 他们升级他们的操作系统。你将为此负责 问题。

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

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

我已经查看了Android Studio ignore --core-library flag,但这对我没有帮助。我认为这些答案已经过时,这就是我提出新问题的原因。

我做了什么尝试:

    build.gradle:

    dexOptions 
      coreLibrary true;
    
    

    build.gradle:

    dexOptions 
      preDexLibraries = false
    
    
    project.tasks.withType(com.android.build.gradle.tasks.Dex) 
      additionalParameters=['--core-library']
    
    

    文件 --> 其他设置 --> 默认设置 --> 编译器 --> Android 编译器 并检查“添加 --core-library 标志”

这些都不起作用。有没有办法设置该选项?


编辑:为什么需要 STAX: 我正在为 .xlsx 文件使用 Workbook、Sheet、Columns、Cells 做一些事情。 当我只包含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) 等。

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

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

此错误表明 类 XMLEventFactory 不提供的功能 POI 取决于。可能有许多不同的原因 这个:

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

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

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

【问题讨论】:

最新版本的 Apache POI 不需要 STAX。如果您尝试升级会发生什么? 我更新了问题以“证明”使用 STAX 的合理性 查看 the Apache POI components page 了解 POI 的哪些位具有哪些依赖项的详细信息 - 遵循那里的建议将解决您丢失的类问题 我读到了。我想我仍然需要 Android 上的 STAX api 这听起来像你有版本冲突。为什么不使用 maven 并对那些有冲突的子库进行排除?我不是 gradle 用户,但我确信那里也可以排除特定的库,就像在任何其他现代依赖管理工具中一样。 【参考方案1】:

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

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

https://github.com/andruhon/android5xlsx https://github.com/centic9/poi-on-android/(我维护)

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

【讨论】:

感谢您的辛勤工作!我可以问你两个问题吗?首先,为什么大多数这样的项目只支持 Android 5+?同时支持低版本有什么问题吗?其次,如果我需要为 Android 4.4 及更高版本编写代码,哪个项目最适合我?我看到您在其他答案中也提到了 AndroidReadXLSX。 (该应用需要同时读取 XLS 和 XLSX!) 哦,我也忘了问这个问题。您在使用这些项目时遇到过任何内存问题吗?我没有在 Android 上使用 Excel 文件的经验,所以有点担心低端设备。 ad Android 支持:我对 Android 没有太多经验,但我认为有些事情在早期版本中是不可能的,例如需要multidex,类数非常多。 广告记忆:您需要尝试使用您的实际文件。对于大型或复杂文件,大型 Excel 文件会在 POI 中消耗大量内存,因此取决于实际文件的数量。 谢谢!对于我当前的应用程序,我想我需要另一种解决方法,但我肯定会很快尝试你的。非常感谢:)【参考方案2】:

在您的应用程序build.gradle 中添加implementation 'javax.xml.stream:stax-api:1.0',因为错过了一些核心课程

【讨论】:

以上是关于在 android 中集成 org.apache.poi 和 javax.xml.stream.* 包 (stax-api) - 如何在 Android Studio 中设置 --core-libra的主要内容,如果未能解决你的问题,请参考以下文章

记Spring boot 项目中集成hbase 报错

在Spring中集成shiro

mybatis中集成sharing-jdbc采坑

在 Android 中集成 GeckoView

使用Android.mk在Android中集成Crypto ++?

在 Android Phonegap Build 中集成广告