Если вы сделаете эти банки в 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
Новые банки могут быть целыми связями сами по себе, или они также могут быть фрагментами пакетов, в которых ваш плагин является их хостом. Если они являются фрагментами вашего пакета, то ваш комплект (BundleContext#getBundle()
) должен быть включен в массив, переданный в refreshPackages и resolveBundles.
(EDIT загрузки классы) Class.forName
из кода плагина будет только найти классы в недавно установленных пакетах, если ваш плагин имеет зависимость, которые будут удовлетворять новые пучки, как только они будут решены.
- Один из способов сделать это - необязательный
Import-Package
в манифесте плагина. В этом случае ваш плагин должен быть включен в массив, переданный в refreshPackages
.
- Другим вариантом является использование инструкции
DynamicImport-Package
в манифесте плагина. Динамический импорт разрешается во время загрузки класса
Другой вариант - использовать Bundle.loadClass
(вместо Class.forName) на объектах связки для ваших недавно установленных пакетов. Это использует загрузчик классов нового пакета, поэтому сам плагин не нуждается в зависимости от новых пакетов.
Это звучит как правильный способ сделать это (+1) –
Спасибо. Это похоже на хороший подход. Однако у меня все еще есть проблемы. Мне удалось загрузить пакет. Но Class.forName («MyClass») по-прежнему вызывает исключение ClassNotFound. Я указал пакет, который содержит класс в выражении экспорта манифеста – Maria
. Я отредактировал исходный ответ с более подробной информацией о загрузке классов после установки пакетов. –