如何在 OSGi 中使用 Apache POI

2023-12-01

我想在 OSGi 中使用 Apache POI 通过流式 OOXML API (SXSSF) 编写 Excel 工作簿。流媒体 API 自 POI 3.9 起可用。

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

我尝试了两种方法:

  1. 将 jar 直接嵌入到将使用它们的唯一包中
  2. 使用预先打包成捆绑包的 POI jar

我对将所有依赖项放在一起感到绝望。

首先关于将 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 and org.junit。我不打算在我的应用程序中加密或测试 - 所以这两个可能在某种程度上是“可选的”。我该如何指定这一点?有没有一种好方法来收集所有这些依赖项?

注:至少org.apache.commons.codec and com.sun.msv.datatype.xsd.lib是额外需要的,但它们已经是捆绑包了。


使用预包装的罐子,我尝试使用org.apache.servicemix.bundles.poi3.9_2。这也需要dom4j所以我用了预先包装的org.apache.servicemix.bundles.dom4j但这至少需要 1.0 版本javax.xml.stream我的 JVM/Felix OSGi 宣传为“唯一”版本0.0.0.1_007_JavaSE。我手动修复了这个问题(丑陋),但随后陷入了另一个依赖项。

有什么好办法呢?


我们使用 Gradle 与bnd平台基于 Maven 依赖项为我们的应用程序构建 OSGi 包。 不确定这是否是“好方法”,但这就是我们为基于 OSGi 的应用程序构建目标平台的方式,Apache POI 是其中的一部分。当您必须对捆绑包进行调整(例如,使 JUnit 可选)或合并 JAR(例如,由于 OSGi 中的类加载问题)才能使其正常工作时,它特别有用。

我设置了一个使用 Apache POI 包构建的示例(隐含地,其 POM 定义的依赖项)在 GitHub 上。您可以克隆它(样本点分支)并尝试运行./gradlew clean bundles。创建的捆绑包将位于build/plugins.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 OSGi 中使用 Apache POI 的相关文章

随机推荐

  • 用golang封装一个包

    想象一个导出一些结构和一些函数的包 如果我想围绕该包制作一个包装器 以便它可以用作插件 我是否应该重新创建嵌入旧结构的结构 例子 package foo type Foo struct Field string func DoSomethi
  • Google Fit API 配额和限制

    使用 google fit api 时是否有配额和请求限制 我想使用 google fit api 我很好奇使用它时是否有限制 您可以在以下位置检查您项目的 Fitness API 当前限制谷歌开发者控制台 我检查了当前的项目 默认限制是
  • Python - SqlAlchemy:按大圆距离过滤查询?

    我正在使用 Python 和 Sqlalchemy 在 Sqlite 数据库中存储纬度和经度值 我创建了一个混合法对于我的位置对象 hybrid method def great circle distance self other Tri
  • 导入变量命名空间

    是否可以使用这样的变量导入名称空间 namespace User Authorization Certificate use namespace 显然这不会运行use声明需要一个常量 但有解决方法吗 Edit 发现了一个 gem 仅适用于
  • Liferay 7 主题中的 jQuery 插件

    我需要一些帮助来理解 Liferay 7 主题 特别是使用 jQuery 插件 因为我遇到了与此线程相同的问题 https web liferay com community forums message boards view messa
  • 由于嵌套节点依赖关系,路径太长

    我正在使用 npm 来安装依赖项 安装完这些后 我想与非技术人员共享我的项目 并且没有 npm 所以我想在应用程序内发送 node modules 但是 由于节点嵌套了依赖项 因此它创建的文件具有很长的路径 217 个字符 node mod
  • 为什么 iTextSharp 中的 GetTextFromPage 返回的字符串越来越长?

    我正在使用最新的iTextSharpnuGet 5 5 8 中的 lib 用于解析 pdf 文件中的一些文本 我面临的问题是GetTextFromPage方法不仅返回应有的页面文本 还返回上一页的文本 这是我的代码 var url http
  • 通过 C# 代码执行 Powershell 命令

    我想通过 C 代码添加 Powershell 命令或脚本 什么是正确的 变量声明 默认值存储在 C 变量中 例如 在 Powershell 中我输入以下行 user Admin 我想在 C 代码中添加这一行 powershell AddSc
  • 在 Ubuntu 20.04 上安装 MySQL 时出现问题

    我正在尝试在 Ubuntu 20 04 中安装 MySQL 8 0sudo apt install mysql server 但是重新安装和使用后仍然出现此错误sudo dpkg configure a Setting up mysql s
  • 如何为一个类实例化更多 CDI bean?

    Note 类似的问题已经在三年前被问过 在 EE 6 的时候 请参阅如何为一个类实例化多个 CDI Weld bean 有什么变化吗EE 7 在 Spring 中 可以通过在 xml conf 中定义相应的 bean 来实例化任何类 也可以
  • PhoneGap 启动图片 iOS Apple Store 提交 [重复]

    这个问题在这里已经有答案了 一如既往地提交iTunesConnect of my PhoneGap申请起来比较麻烦 特别是当我尝试使用时 我看到弹出这条新消息Application Loader Your binary is not opt
  • 面向对象编程。从方法内部调用方法

    如何从类内的函数调用类方法 我的代码是 var myExtension init function Call onPageLoad onPageLoad function Do something 我试过了 onPageLoad 来自 in
  • 如何在Vue Material中设置灵活的网格

    我正在尝试构建一个使用 Vue Material 在网格中渲染用户输入的卡片的界面 卡片正确渲染 然而 我希望我的网格能够以消除间隙的方式弯曲 对齐和交错不同尺寸的卡片 如下所示 下面的代码与上面的网格相对应
  • PHP:使用来自 php 的参数调用 javascript 函数

    我正在尝试使用 PHP 变量参数调用 JavaScript 函数 我尝试了两种方法 在 PHP 中使用 echo 中的脚本标签调用 JavaScript 函数 IE 将 PHP 变量值赋给 JavaScript 变量
  • 为什么 Numba 不改进这个递归函数

    我有一个结构非常简单的真 假值数组 the real array has hundreds of thousands of items positions np array True False False False True True
  • 按组计算平均值

    我有一个类似于此的大型数据框 df lt data frame dive factor sample c dive1 dive2 10 replace TRUE speed runif 10 gt df dive speed 1 dive1
  • 安卓兼容包

    尝试使 Fragments 示例在低于 11 SDK 的版本上运行时 出现错误 setListAdapter new ArrayAdapter
  • 从数据绑定 DevExpress CheckedListBoxControl 获取项目索引

    我试图从以下位置找到特定值的索引选中列表框控件 CheckedListBoxControl 有一个 DataSource DisplayMember ValueMember 分别设置为 DataTable 和两列 现在我必须将 Checke
  • 如何找到我当前位置附近的位置?

    我需要一些关于使用 android 如何找到我所在位置附近的医院 学校 餐厅 的想法 怎么可能 一步步 Google place api用于访问附近的anloaction地标 Step 1 进入API控制台获取Place API https
  • 如何在 OSGi 中使用 Apache POI

    我想在 OSGi 中使用 Apache POI 通过流式 OOXML API SXSSF 编写 Excel 工作簿 流媒体 API 自 POI 3 9 起可用 由于最新的 Apache POI 3 11 jar 不是捆绑包 让 POI 在