如果你让那些罐子到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的数组中。
(编辑类加载) Class.forName
从你的插件代码只能找到新安装的包类,如果你的插件有一个将被新的包来满足一旦被解析的依赖。
- 一种方法可以在插件的清单中选择
Import-Package
。在这种情况下,您的插件将需要包含在传递给refreshPackages
的数组中。
- 另一种选择是在插件清单中使用
DynamicImport-Package
语句。动态导入可在类加载期间解决
另一个选项是对捆绑对象使用Bundle.loadClass
(而不是Class.forName)用于新安装的捆绑软件。这使用了新的bundle的类加载器,所以你的插件本身不需要依赖新的bundle。
这听起来像是正确的做法(+1) – 2011-01-28 16:13:51