如何在Jboss fuse中解决两个不同依赖问题中的相同包名

时间:2017-03-30 10:30:31

标签: apache-poi osgi jbossfuse fuse

我正在尝试使用Apache POI来处理Excel工作表。该应用程序应支持.xlsx格式文件。

为此,我将这两个依赖项作为捆绑包安装在Jboss FUSE中:

<bundle start-level="15">wrap:mvn:org.apache.poi/poi/3.5-FINAL</bundle>
<bundle start-level="15">wrap:mvn:org.apache.poi/poi-ooxml/3.15</bundle>

但是我收到一个错误,说它在上面的两个包中找到了下面的包。因此存在歧义。

org.apache.poi.ss.usermodel

ERROR:

Unable to resolve bundle revision wrap_mvn_org.apache.poi_poi-ooxml_3.15 [2133.0] because it exports package 'org.apache.poi.ss.usermodel' and is also exposed to it from bundle revision wrap_mvn_org.apache.poi_poi_3.5-FINAL [2094.0] 

事实上:

  • 我需要上面提到的Apache POI依赖项。
  • 不同的类集合属于上面的两个包 依赖。这些类用于应用程序。因此,我不能从任何依赖项中取消导出/取消导出包。

FUSE中是否有任何解决方法可以解决由于两个依赖项中相同的包名而引起的问题。

4 个答案:

答案 0 :(得分:2)

我使用了@Gagravarr建议的预先存在的Apache POI捆绑包eg this one maintained by Apache ServiceMix,并且它有效。

向我学习:在开发osgi时,我应该首先看一下apache service mix bundle。

答案 1 :(得分:1)

OSGi中的这类问题有自己的名字:Split-package问题,它没有直接的解决方案。虽然在Java SE中这种方法在某些框架中使用,但在OSGi中,模块的核心概念并不支持它,我怀疑它是否会存在。

通常,通过以这样的方式重新打包模块来解决这样的问题,即包不会超出模块。您可以在不同的框架中找到这样的方法,这些框架提供了在OSGi中使用的单独工件。您可以通过maven-bundle-plugin等maven插件自己完成。

考虑的替代方案可能是:

但要小心:通常这种方法打破了模块化的概念,并且有自己的风险。

答案 2 :(得分:1)

一个简单的解决方案是创建一个包含两个poi包内容的包。您可以使用maven-bundle-plugin和Embed-Dependency选项来实现此目的。

答案 3 :(得分:0)

由servicemix管理的poi包也为我工作。 Apache commons集合4是必需的

[Active] [] [] [80] Apache Commons Collections(4.1.0)

[Active] [] [] [80] Apache ServiceMix :: Bundles :: poi(3.15.0.1)