Если вы сделаете эти jar-файлы в пакеты OSGi (то есть дадите им MANIFEST.MF), то вы можете установить их динамически во время выполнения OSGi.
Если вы добавите активатор пакета в свой плагин, вы можете сохранить org.osgi.framework.BundleContext, а затем сделать следующее:
Bundle [] newBundle = new Bundle[] { bundleContext.install(location, newJarInputStream) };
packageAdmin.refreshPackages( newBundle );
packageAdmin.resolveBundles( newBundle);
packageAdmin
является экземпляром org.osgi.service.packageAdmin.PackageAdmin, который является услугой, которую вы можете приобрести с помощью BundleContext#getService
Новые jar-файлы могут быть целыми пакетами сами по себе, или они также могут быть фрагментами пакетов, в которых ваш плагин является хостом. Если они являются фрагментами вашего пакета, тогда ваш пакет (BundleContext#getBundle()
) необходимо будет включить в массив, передаваемый в refreshPackages и resolBundles.
(редактирование загрузки классов)
Class.forName
из кода вашего плагина найдет классы во вновь установленных пакетах, только если у вашего плагина есть зависимости, которые будут удовлетворены новыми пакетами после их разрешения.
- Один из способов сделать это - необязательный
Import-Package
в манифесте вашего плагина. В этом случае ваш плагин должен быть включен в массив, переданный refreshPackages
.
- Другим вариантом будет использование оператора
DynamicImport-Package
в манифесте вашего плагина. Динамический импорт разрешается во время загрузки класса
Другой вариант - использовать Bundle.loadClass
(вместо Class.forName) в объектах комплекта для вновь установленных комплектов. При этом используется загрузчик классов нового пакета, поэтому сам плагин не должен зависеть от новых пакетов.