当前位置: 首页 > 知识库问答 >
问题:

如何在OSGi中使用Apache POI

向杜吟
2023-03-14

作为最新的Apache POI3.11,JAR不是bundle,让POI在OSGi中工作的最佳方式是什么?

我尝试了两种方法:

  1. 将JAR直接嵌入到唯一使用它们的包中
  2. 使用预包装为包的POI罐子
-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.apache.commons.codeccom.sun.msv.datatype.xsd.lib,但它们已经是bundle了。

使用预包装的JAR,我尝试使用org.apache.servicemix.bundles.poi3.92。这还需要dom4j,所以我使用了预包装的org.apache.servicemix.bundles.dom4j,但这至少需要javax.xml.stream1.0版本,我的JVM/Felix OSGi将其宣传为“only”版本0.0.0.1_007_javase。我手工修复了这个(丑陋的),但后来卡在了另一个依赖项上。

有什么好办法?

共有1个答案

谷梁德容
2023-03-14

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

我在GitHub上使用Apache POI包(以及它的POM定义的依赖项)建立了一个示例构建。您可以克隆它(sample-poi branch)并尝试运行./gradlew clean bundles。创建的包将在build/plugins中。

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

 类似资料:
  • 此代码会导致具有以下堆栈跟踪的空指针异常: 查看ContextFinder的源代码,我可以看到第129行的必须为空: 我认为问题可能是我的模块依赖于JAXB-API2.2.11,但是jaxb-impl类是由rt.jar在运行时提供的,并且可能比2.2.11新,因为Liferay DXP运行在JDK1.8上。为了解决这个问题,我尝试在osgi模块中包含jaxb-impl.jar2.2.11作为一个依

  • 我试图构建一个使用嵌入式OrientDB(当前为“Memory:”)图形数据库的应用程序。我用的是OrientDB2.2 orientdb-graphdb不应该依赖于一个合适的包,或者包括并导出类吗?

  • 我的问题在于在前端包中使用/消费来自下游节点包的服务(例如osgi-mobile使用/消费来自osgi-downstreamnode1的服务)。 我目前正在Eclipse Mars中构建它们,由于没有将整个osgi-downstreamnode1包打包到一个JAR中,并将其导入osgi-mobile包,所以我似乎不知道如何在Eclipse中引用这些包,以及如何让osgi-mobile包在运行时调用

  • 我在使用rome库创建RSS Feeds时遇到了一个问题。https://rometools.github.io/如果我只是将lib添加到我的pom.xml并将其部署到AEM实例,然后调用一个应该使用该库的servlet,它就会失败...我无法调试到servlet。 我认为这是一个类加载问题,在罗马工具的网站上有一个将系统属性“rome.pluginmanager.useloadclass”设置为

  • 我想使用这个java库[1]enj-library 我将这个库编译成jar,然后在eclipse下创建了一个新的插件项目“来自现有JAR档案的插件” 然后我试着将它添加到我的包,但它没有 2.我需要它作为添加包,但我得到了 3.我添加了类路径,我的包开始了,但我得到了类未找到异常 [1]https://github.com/dog 网关/enj-library 我在OSGI捆绑包包含这个库如何?

  • 问题内容: 我目前正在尝试获取一个包含Service Factory运行的简单捆绑包。 这是我的工厂班级: 这是我应该由工厂创建的服务: 最后是OSGI-INF / component.xml 如果我在春分内运行测试包(A,B和C),则会收到以下错误: 我找不到有关使用Internet上的组件定义中声明的ServiceFeactories的太多信息。甚至《 OSGi和Equinox》一书也没有告诉