繁体   English   中英

如何在OSGi中使用Apache POI

[英]How to use Apache POI in OSGi

我想在OSGi中使用Apache POI来编写带有流式OOXML API(SXSSF)的Excel工作簿。 流式API自POI 3.9起可用。

由于最新的Apache POI 3.11罐不是捆绑包: 在OSGi中使POI工作的最佳方法是什么?

我尝试了两种方法:

  1. 将罐子直接嵌入将使用它们的唯一束中
  2. 使用POI罐作为捆绑包装预先包装

我绝望地将所有依赖项放在一起。

首先关于在我的包中嵌入POI jar:我的bndtools文件包含

-buildpath:  \
...
libs/dom4j-1.6.1.jar;version=file,\
libs/poi-3.11.jar;version=file,\
libs/poi-ooxml-3.11.jar;version=file,\
libs/poi-ooxml-schemas-3.11.jar;version=file

Private-Package:  \
...
org.openxmlformats.schemas.*,\
org.apache.poi.*,\
org.dom4j.*,\
com.microsoft.schemas.office.x2006.*,\
schemaorg_apache_xmlbeans.*,\
schemasMicrosoftComOfficeExcel.*,\
schemasMicrosoftComOfficeOffice.*,\
schemasMicrosoftComVml.*

这导致一个bundle导入很多很多东西,例如org.bouncycastle.asn1.x509org.junit 我不打算在我的应用程序中加密或测试 - 所以这两个可能在某种程度上是“可选的”。 我怎么指定这个? 是否有收集所有这些依赖关系的好方法?

注意:至少还需要org.apache.commons.codeccom.sun.msv.datatype.xsd.lib ,但它们已经是捆绑包。


使用预先包装的罐子,我尝试使用org.apache.servicemix.bundles.poi 3.9_2。 这也需要dom4j所以我使用了预先包装好的org.apache.servicemix.bundles.dom4j但是至少需要javax.xml.stream 1.0版本,我的JVM / Felix OSGi将其作为“仅”版本0.0.0.1_007_JavaSE广告。 我手工修复了这个问题(丑陋),但后来陷入了另一个依赖关系。

什么是好方法?

我们使用Gradle和bnd-platform为我们基于Maven依赖的应用程序构建OSGi包。 不确定这是否是“好方法”,但这就是我们为基于OSGi的应用程序构建目标平台的方式,Apache POI就是其中的一部分。 在必须对bundle进行适配(例如,使JUnit可选)或合并JAR(例如由于OSGi中的类加载问题)以使它们工作的情况下,它尤其有用。

我在GitHub上设置了一个带有Apache POI包 (以及隐式地,它的POM定义的依赖关系)的示例构建 您可以克隆它( sample-poi branch)并尝试运行./gradlew clean bundles 创建的包将在build/plugins

请注意,默认情况下不会包含任何可选的Maven依赖项,如果需要,必须手动添加到构建中(由于Gradle中的限制 )。

我没有这方面的工作示例,但这些文档可能对您有所帮助。

POI可以与OSGI一起使用吗?

从POI 3.16开始,OSGIs上下文类加载器处理有一个解决方法,即它将线程当前上下文类加载器替换为有限类视图的实现。 这将导致IllegalStateExceptions,因为xmlbeans在此缩减视图中找不到xml架构定义。 解决方法是初始化POIXMLTypeLoader的类加载器委托,默认为当前线程上下文类加载器。 初始化应该在任何其他OOXML相关调用之前进行。 示例中的类可以是任何类,它是poi-ooxml-schema或ooxml-schema的一部分:POIXMLTypeLoader.setClassLoader(CTTable.class.getClassLoader());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM