我想在OSGi中使用Apache编写一个带有流式OOXML (SXSSF)的Excel工作簿。流API可以从POI 3.9中获得。
由于最新的ApachePOI3.11JAR不是包:,让POI在OSGi中工作的最佳方法是什么?
我尝试了两种方法:
我正在绝望地把所有的依赖联系在一起。
首先,将POI嵌入到我的包中:我的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,但它们已经是包了。
使用预包装的jars,我尝试使用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。我用手(丑)解决了这个问题,但后来又陷入了另一个依赖。
有什么好办法?
发布于 2015-04-24 08:37:51
我们使用Gradle与bnd-平台一起为我们的应用程序构建基于Maven依赖项的OSGi包。不确定这是否是“好方法”,但这就是我们如何为基于OSGi的应用程序构建目标平台的方法,Apache就是其中的一部分。在必须对包(例如,使JUnit为可选)或合并JAR(例如,由于OSGi中的类加载问题)进行调整以使其工作时,它特别有用。
我在GitHub上设置了一个GitHub(并隐式地设置了POM定义的依赖项)。您可以克隆它(样本-poi分支)并尝试运行./gradlew clean bundles。创建的包将在build/plugins中。
请注意,任何可选的Maven依赖项在默认情况下都不会包括在内,如果您需要这些依赖项,则必须手动添加到构建中(由于分级限制)。
发布于 2018-05-09 17:17:13
我没有关于这项工作的工作示例,但这些文档可能会对您有所帮助。
从POI 3.16开始,OSGIs上下文类加载器处理有一个解决方案,即用有限类视图的实现替换当前的线程上下文类加载器。这将导致IllegalStateExceptions,因为xmlbean无法在这个简化的视图中找到xml定义。解决方法是初始化POIXMLTypeLoader的类加载器委托,该委托默认为当前线程上下文类加载器。初始化应该在任何其他与OOXML相关的调用之前进行。示例中的类可以是任何类,它是poi-ooxml-schema或ooxml-schema: POIXMLTypeLoader.setClassLoader(CTTable.class.getClassLoader());的一部分。
https://stackoverflow.com/questions/29825944
复制相似问题