首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在所有bundle启动后调用osgi应用程序的start方法?

问如何在所有bundle启动后调用osgi应用程序的start方法?
EN

Stack Overflow用户
提问于 2013-04-12 13:54:18
回答 1查看 582关注 0票数 0

我有一个在equinox上运行的osgi应用程序。这就是包在bootstrap类中的启动方式。

代码语言:javascript
复制
String[] equinoxArgs = new String[]{"-console"};
EclipseStarter.setInitialProperties(getInitialProperties());
BundleContext context = EclipseStarter.startup(equinoxArgs, null);
List<URL> urls = getListOfBundleUrls();
   for(URL url: urls) {
       Bundle bundle = context.installBundle(url.toString());
       bundle.start();
   }

在我的应用程序中,其中一个包中有一个start方法。此方法应在启动所有包以运行应用程序后调用。当在bootstrap类中调用该方法时,它会给出一个错误,指出在类路径中找不到某些类。下面是堆栈跟踪。

代码语言:javascript
复制
Initial SessionFactory creation failed.org.hibernate.service.classloading.spi.ClassLoadingException: Specified JDBC Driver com.mysql.jdbc.Driver class not found
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.cc.erp.platform.dbutils.services.BasicDBManager.buildSessionFactory(BasicDBManager.java:26)
at com.cc.erp.platform.dbutils.services.BasicDBManager.<clinit>(BasicDBManager.java:12)
at com.cc.erp.platform.dbutils.DBAgent.getNewCRUDService(DBAgent.java:19)
at com.cc.erp.reload.core.WebService.forQuery(WebService.java:51)
at com.cc.erp.reload.ui.CommandLineUserInterface.<init>(CommandLineUserInterface.java:27)
at com.cc.erp.helius.bootstrap.Bootstrap.launchHelius(Bootstrap.java:41)
at com.cc.erp.helius.bootstrap.Bootstrap.main(Bootstrap.java:22)
Caused by: org.hibernate.service.classloading.spi.ClassLoadingException: Specified JDBC Driver com.mysql.jdbc.Driver class not found
at org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:107)
at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:223)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:89)

com.mysql.jdbc包在osgi运行时中导出。但是它不在bootstrap类路径中,我相信这个方法应该从框架本身调用。请告诉我做这件事的最好方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-12 18:00:30

您的包install/start循环是一个反模式。问题是,启动一个包会立即强制它解析,但它可能无法解析,因为它的依赖项尚未安装(可能是因为它们在列表中出现的时间较晚)。

这可能会提示您提前计算出正确的安装顺序,但这也是错误的答案。您应该让OSGi框架为您处理依赖关系(这就是OSGi的意义所在)。

所以你需要先安装你所有的捆绑包,然后再开始其中的任何。为此,您需要两个循环,例如:

代码语言:javascript
复制
List<Bundle> installedBundles = new ArrayList<Bundle>();
for (URL url : urls) {
    installedBundles.add(context.installBundle(url.toString()));
}
for (Bundle bundle : installedBundles) {
    bundle.start();
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15964061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档