簡體   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