Pet*_*zov 0 java osgi bundle apache-felix osgi-bundle
我想从OSGI包中启动OSGI包.正如您所看到的,此代码通过从目录部署它来启动bundle:
private void installStartBundle(BundleContext bc, String location, String name) throws BundleException
{
debug("installing " + location + "...");
Bundle[] all = bc.getBundles();
for (Bundle bundle : all)
{
String l = bundle.getLocation();
if (l.indexOf(name) != -1)
{
debug("already installed bundle " + bundle.getBundleId() + "|" + bundle.getLocation() + ">" + bundle.getSymbolicName());
return;
}
}
Bundle b = bc.installBundle(location);
debug("starting " + b.getSymbolicName());
b.start();
}
Run Code Online (Sandbox Code Playgroud)
我注意到一个问题:例如,我有一个包含xml配置文件和主包的包,它通过将其部署到Felix并将包访问到xml包中来加载xml配置文件.
我可以从bundle成功安装bundle,但是依赖包的导出包不可访问.也许部署过程太慢,捆绑加载器无法找到导出的包.知道如何解决这个问题吗?
PS你能告诉我如何检查一个捆绑包是否在Felix中成功部署?
请注意,BundleContext具有以下功能:
BundleContext.getBundle(String location);
Run Code Online (Sandbox Code Playgroud)
如果使用该功能,则不必遍历所有捆绑包.
请检查OSGi中bundle的生命周期,了解它的安装和启动方式.要获得良好的图片,请访问http://zenit.senecac.on.ca/wiki/index.php/OSGi_Concepts_Bundle_Life-Cycle.
要知道安装捆绑包后到底发生了什么,请参阅功能的javadoc:http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/BundleContext.html#installBundle%28java.lang.字符串%20java.io.InputStream 29%
我记得很多,在调用这个函数后,bundle会保持在INSTALLED状态(遗憾的是,我不清楚Javadoc).您可以使用以下代码段强制解析捆绑包:
Bundle systemBundle = bundleContext.getBundle(0);
FrameworkWiring frameworkWiring = systemBundle.adapt(FrameworkWiring.class);
frameworkWiring.resolveBundles(Arrays.asList(new Bundle[] {bundle}));
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅resolveBundles函数的javadoc:http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/wiring/FrameworkWiring.html#resolveBundles%28java.util.Collection%29
请注意,即使您解析了捆绑包,其他可以连接到新捆绑包的捆绑包也不会这样做.例如,如果他们有一个可选的import-package,或者他们已经连接到其他bundle,那么什么都不会发生.要强制重新连接,您应该调用FrameworkWiring.refreshBundles函数.如果不清楚,您应该将哪个bundle作为参数传递,只需使用null参数调用refresh.
"我可以从捆绑包中成功安装捆绑包,但依赖包中导出的包不可访问":
我不知道你是如何得出这个结论的.如果您在另一个包中有可选包导入,则可能是您没有强制刷新.
在bundle上调用start之后(如果你有一个Fragment包,你不应该调用start,而只是刷新),它应该得到ACTIVE状态.如果在调用BundleActivator期间出现异常或者bundle是Fragment包,它将保持RESOLVED.
| 归档时间: |
|
| 查看次数: |
150 次 |
| 最近记录: |