TL; DR:
Убедитесь, что ваши классы package
экспортированы в META-INF/MANIFEST.MF
.
Длинная версия:
Даже если Bundleразрешен и активен, это не означает, что класс доступен в других пакетах или частях системы.
package
, в котором находится класс, должен быть экспортирован.Каждый комплект имеет META-INF/MANIFEST.MF
.По сути, это похоже на описание пакета.
В этом описании есть поле с именем Export-Package
, которое содержит список всех экспортируемых пакетов и, следовательно, может использоваться в других пакетах.
Обычно META-INF/MANIFEST.MF
создается во время вашей сборки в Maven или Gradle через плагины.Проверьте конфигурацию этих плагинов или посмотрите, как они работают.Например, некоторые плагины не будут экспортировать пакеты ниже impl
пакетов.
Так что, если ваш класс находится в пакете com.example.awesomeapp.impl.services
, пакет service
не будет экспортирован.Но это зависит от используемого вами плагина и т. Д.
Все это работает в вашей IDE, потому что он обрабатывает classpath иначе, чем ваша среда OSGi.Вкратце: ваша IDE знает более или менее только один путь к классам, который содержит все классы, в то время как OSGi использует много путей к классам (по одному на пакет и пару других путей к классам) и поэтому «скрывает» классы друг от друга.Вот почему ваша IDE может загружать класс, а ваши OSGi - нет.