В настоящее время я работаю над проектом, результатом которого является толстый JAR, работающий в контексте OSGi (Apache Felix). Есть ли способ / команда, чтобы проверить, доступны ли некоторые из банок, которые я встроил в свою толстую банку, из других пакетов и сервисов, чтобы я мог их удалить (и, таким образом, уменьшить толстую банку)?
Причина, по которой я создаю толстую банку, заключается в том, что я использую другую систему сборки для сборки своей банки. (Я использую Scala и SBT, все остальное построено на Java и Gradle)
Я не знаю никаких автоматических инструментов, делающих это, но у Apache Felix есть два инструмента, которые могут помочь вам найти ваши дубликаты:
/system/console/depfinder
/system/console/status-duplicate_exports
Особенно второй должен вам помочь. В нем перечислены пакеты, которые экспортируются более одного раза, а затем перечислены пакеты, которые экспортируют эти пакеты. Если ваш пакет появляется в этом списке, вы знаете, что другой пакет экспортирует пакеты, которые находятся в вашем толстом пакете.
Но, как и в случае с depfinder
, вам придется просмотреть список вручную или написать небольшой скрипт, который поможет вам.
Другой вариант: просто посмотрите, являются ли JAR-файлы, которые вы в настоящее время включаете в свой толстый JAR, пакетами OSGi (многие IDE сообщают об этом уже в каком-то представлении зависимостей проекта), и запишите заголовок Bundle-SymbolicName
.
Затем вы извлекаете одну и ту же информацию из всех пакетов, установленных во время выполнения Felix, например. используя оболочка гого:
lb -s
... или если у вас есть каталог с пакетами для среды выполнения и командой bnd
(и вы используете Unix):
find <bundles-directory> -type f -iname "*.[jw]ar" -exec bnd --failok print --manifest {} \; 2>/dev/null | grep -F 'Bundle-SymbolicName'
Теперь вы можете сравнить эти списки со списками SymbolicName, которые вы нашли в своем толстом JAR. После того, как вы нашли совпадение, вы также должны убедиться, что версия в порядке.