我目前正在开发一个项目,该项目导致在OSGi上下文中运行的胖JAR(Apache Felix)。有没有一种方法/命令来检查我嵌入到我的胖罐中的一些罐子是否也可以从其他捆绑包和服务中获得,以便我可以将它们移除(从而使胖罐更小)?
我正在构建一个胖罐的原因是因为我使用不同的构建系统来构建我的jar。 (我使用的是Scala和SBT,其他一切都是用Java和Gradle构建的)
我不知道有任何自动化工具,但Apache Felix有两个工具可以帮助您找到重复项:
/system/console/depfinder
/system/console/status-duplicate_exports
特别是,第二个应该帮助你。它列出了多次导出的包,然后列出了导出这些包的包。如果您的捆绑包出现在此列表中,您就会知道另一个捆绑包导出了胖包中的包。
但与depfinder
一样,您必须手动浏览列表或编写一个小脚本来帮助您。
另一种选择:看看你当前包含在你的胖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进行比较。找到匹配项后,您还应验证版本是否正常。