Разве это не просто случай обновления META-INF / MANIFEST.MF, чтобы он представлял собой подключаемый модуль osgi (если это еще не так?). Это должно выглядеть примерно так:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: My-plugin
Bundle-SymbolicName: com.mycompany.mypluginname
Bundle-Version: 1.0.0
Bundle-Vendor: MyCompany
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Service-Component:
Import-Package: org.apache.log4j;version="1.2.14" (, separated etc)
Export-Package: com.mycompany.mypluginname.myapipackage;version="1.0.0"
А потом приятно опустить пакет .internal. Платформа должна сделать все остальное.
Кстати, вы затем используете Import-Package: в любых зависимых пакетах, плагинах и т. Д., А не в зависимости от jar / проекта (который является старым, отстойным способом, который не работает - как вы находите ).
Это дает вам массовое разъединение ваших зависимостей кода. Если вы решите, что код вашего плагина должен принадлежать другому jar / bundle, вы просто перемещаете отдельные пакеты и заставляете новый пакет / plug-in экспортировать его. Поскольку клиентские пакеты просто импортируют пакет из «облака» (облако является платформой OSGi), вы можете перемещать код гораздо более свободно.
Примечание : Как уже упоминалось в комментариях, вам не нужно запускать свои приложения в OSGi, чтобы получить эту "выгоду". Eclipse может скомпилировать свой код в соответствии с ограничениями пакета OSGi, и ваша сборка / сервер может работать в «незащищенном мире». например манифесты OSGi ничего не навязывают третьим сторонам (которые хотят использовать .internal), но предоставляют «уведомления» и ограничения тем, кто их хочет.