在 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 有两个工具可以帮助您找到重复项:
/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 进行比较。找到匹配后,您还应该验证版本是否正确。
我目前正在从事一个项目,该项目生成一个在 OSGi 上下文 (Apache Felix) 中运行的胖 JAR。是否有 way/command 来检查我嵌入到我的 fat jar 中的某些 jar 是否也可以从其他捆绑包和服务中获得,以便我可以删除它们(从而使 fat jar 更小)?
我构建一个 fat 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 进行比较。找到匹配后,您还应该验证版本是否正确。