我正在使用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忽略--core-library标志,这对我没有帮助.我认为这些答案已经过时,这就是为什么我要问一个新问题.
我做了什么尝试:
的build.gradle:
dexOptions { coreLibrary true; }
的build.gradle:
dexOptions { preDexLibraries = false } project.tasks.withType(com.android.build.gradle.tasks.Dex) { additionalParameters=['--core-library'] }
文件 - >其他设置 - >默认设置 - >编译器 - > Android编译器并检查'添加 - 核心库标志'
这些都没有奏效.有没有办法设置该选项?
编辑:为什么我需要STAX:
我正在做一些与Workbook,Sheet,Columns,Cells for .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.
更新 所以,来自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.