在 android 中集成 org.apache.poi 和 javax.xml.stream.* 包 (stax-api) - 如何在 Android Studio 中设置 --core-library 参数?
我使用的是安卓工作室 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忽略 - 核心库标志,这对我没有帮助。我认为这些答案已经过时了,这就是为什么我要问一个新问题。
我尝试了什么:
-
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文件做一些事情。当我只包含时,我在构建时收到一个错误,说.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.getQName
java.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。