在OSGi胖子装束中查找重复的JAR

时间:2019-04-08 09:42:39

标签: gradle sbt osgi apache-felix fatjar

我目前正在开发一个项目,该项目会导致在OSGi上下文(Apache Felix)中运行的胖JAR。是否有一种方法/命令来检查我嵌入到胖子罐中的某些罐子是否也可以从其他捆绑包和服务中获得,以便我可以将它们删除(从而使胖子罐变小)?

之所以要构建胖罐子,是因为我使用了不同的构建系统来构建我的罐子。 (我使用的是Scala和SBT,其他所有内容都是使用Java和Gradle构建的)

2 个答案:

答案 0 :(得分:1)

我不知道有什么自动工具可以执行此操作,但是Apache Felix有两个工具可以帮助您找到重复项:

  1. /system/console/depfinder
  2. /system/console/status-duplicate_exports

尤其是第二个应该可以帮助您。它列出了导出多次的软件包,然后列出了导出那些软件包的捆绑软件。如果您的捆绑包出现在此列表中,则说明您知道另一个捆绑包会导出胖捆绑包中的包裹。

但是与depfinder一样,您将不得不手动浏览列表或编写一些脚本来帮助您。

答案 1 :(得分:1)

另一种选择:看看您当前包含在胖JAR中的JAR是否是OSGi捆绑包(许多IDE告诉您已经在某些项目依赖项视图中),并记下标题Bundle-SymbolicName

然后从Felix运行时安装的所有捆绑软件中提取相同的信息,例如使用Gogo shell

lb -s

...或者如果您的目录包含用于运行时的捆绑包和bnd命令(并且您使用的是Unix):

find <bundles-directory> -type f -iname "*.[jw]ar" -exec bnd --failok print --manifest {} \; 2>/dev/null | grep -F 'Bundle-SymbolicName'

现在,您可以将这些列表与在胖JAR中找到的SymbolicName进行比较。找到匹配项后,您还应该验证版本是否正确。