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

2022-09-02 10:58:37

我使用的是安卓工作室 1.5.1

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

stax api的问题在于它具有javax.*中的所有包,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忽略 - 核心库标志,这对我没有帮助。我认为这些答案已经过时了,这就是为什么我要问一个新问题。

我尝试了什么:

  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 编译器并选中“添加 --core-library 标志”

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


编辑:为什么我需要STAX:我正在用工作簿,工作表,列,单元格.xlsx文件做一些事情。当我只包含时,我在构建时收到一个错误,说.poi-ooxml-3.14-beta1-20151223.jarclass 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.jarFailed 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.jarCould 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。


答案 1

当您尝试使用Apache POI时,存在许多问题,这取决于Android应用程序中的库。其中,xmlbeans中存在重复的类.jar,Android编译器和其他一些软件包禁止“javax.*”包。

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

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


答案 2

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


推荐