- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想使用 OSGi 中的 Apache POI 编写一个带有流式 OOXML API (SXSSF) 的 Excel 工作簿。流式 API 从 POI 3.9 开始可用。
由于最新的 Apache POI 3.11 jar 不是 bundle :让 POI 在 OSGi 中工作的最佳方法是什么?
我尝试了两种方法:
我对将所有依赖项放在一起感到绝望。
首先关于将 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.*
这导致一个包导入了很多很多东西,例如 org.bouncycaSTLe.asn1.x509
和 org.junit
。我不打算在我的应用程序中加密或测试 - 所以这两个可能在某种程度上是“可选的”。我怎样才能指定这个?有没有一种收集所有这些依赖项的好方法?
注意:至少还需要 org.apache.commons.codec
和 com.sun.msv.datatype.xsd.lib
,但它们已经是 bundle 。
使用预包装的 jar,我尝试使用 org.apache.servicemix.bundles.poi
3.9_2。这也需要 dom4j
所以我使用了预包装的 org.apache.servicemix.bundles.dom4j
但这至少需要 1.0 版的 javax.xml.stream
,我的 JVM/Felix OSGi 宣传为“唯一”版本 0.0.0.1_007_JavaSE
。我手动修复了这个(丑陋的),但后来陷入了另一个依赖。
有什么好的方法?
最佳答案
我们将 Gradle 与 bnd-platform 结合使用基于 Maven 依赖项为我们的应用程序构建 OSGi 包。不确定这是否是“好方法”,但这是我们为基于 OSGi 的应用程序构建目标平台的方式,Apache POI 是其中的一部分。在您必须对 bundle 进行调整(例如,使 JUnit 可选)或合并 JAR(例如,由于 OSGi 中的类加载问题)以使它们工作时,它特别有用。
我设置了一个 example build with an Apache POI bundle (隐含地,它的 POM 定义的依赖项)在 GitHub 上。您可以克隆它(sample-poi 分支)并尝试运行 ./gradlew clean bundles
。创建的包将在 build/plugins
中。
请注意,默认情况下不会包含任何可选的 Maven 依赖项,如果您需要它们,则必须手动将它们添加到构建中(由于 limitations in Gradle)。
关于java - 如何在 OSGi 中使用 Apache POI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29825944/
我是一名优秀的程序员,十分优秀!