我目前正在从事一个项目,该项目导致在 OSGi 上下文(Apache Felix)中运行的胖 JAR。有没有办法/命令来检查我嵌入到我的胖罐子中的一些罐子是否也可以从其他捆绑包和服务中获得,以便我可以删除它们(从而使胖罐子更小)?
我构建胖 jar 的原因是因为我使用不同的构建系统来构建我的 jar。(我使用的是 Scala 和 SBT,其他一切都是用 Java 和 Gradle 构建的)
我目前正在从事一个项目,该项目导致在 OSGi 上下文(Apache Felix)中运行的胖 JAR。有没有办法/命令来检查我嵌入到我的胖罐子中的一些罐子是否也可以从其他捆绑包和服务中获得,以便我可以删除它们(从而使胖罐子更小)?
我构建胖 jar 的原因是因为我使用不同的构建系统来构建我的 jar。(我使用的是 Scala 和 SBT,其他一切都是用 Java 和 Gradle 构建的)
我不知道有任何自动化工具可以做到这一点,但 Apache Felix 有两个工具可以帮助您找到重复项:
/system/console/depfinder
/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 进行比较。找到匹配项后,您还应该验证版本是否正常。