在 OSGi fat jar 包中查找重复的 JAR

Find duplicate JARs in OSGi fat jar bundle

我目前正在从事一个项目,该项目生成一个在 OSGi 上下文 (Apache Felix) 中运行的胖 JAR。是否有 way/command 来检查我嵌入到我的 fat jar 中的某些 jar 是否也可以从其他捆绑包和服务中获得,以便我可以删除它们(从而使 fat jar 更小)?

我构建一个 fat jar 的原因是因为我使用不同的构建系统来构建我的 jar。 (我正在使用 Scala 和 SBT,其他一切都是用 Java & Gradle 构建的)

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

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

特别是第二个应该对你有帮助。它列出了多次导出的包,然后列出了导出这些包的包。如果您的包出现在此列表中,则您知道另一个包导出了您的胖包中的包。

但与 depfinder 一样,您必须手动查看列表或编写一些脚本来帮助您。

另一种选择:看看你当前包含在你的胖 JAR 中的 JAR 是否是 OSGi 包(许多 IDE 已经在一些项目依赖视图中告诉它)并记下 header 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 进行比较。找到匹配后,您还应该验证版本是否正确。