0

分点で実行される osgi アプリケーションがあります。これは、ブートストラップ クラスでバンドルが開始される方法です。

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();
   }

アプリケーションのバンドルの 1 つに start メソッドがあります。このメソッドは、アプリケーションを実行するためにすべてのバンドルが開始された後に呼び出す必要があります。そのメソッドがブートストラップ クラスで呼び出されると、一部のクラスがクラスパスに見つからないというエラーが発生します。これがスタックトレースです。

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 ランタイムでエクスポートされます。しかし、ブートストラップクラスパスにはありません。このメソッドはフレームワーク自体から呼び出す必要があると思います。最善の方法を教えてください。

4

1 に答える 1

5

バンドルのインストール/開始ループはアンチパターンです。問題は、バンドルを開始するとすぐに解決が強制されることですが、その依存関係がまだインストールされていないために解決に失敗する可能性があることです (おそらくリストの後半に来るため)。

これにより、インストールの正しい順序を事前に確認するように求められる場合がありますが、それも間違った答えです。OSGi フレームワークに依存関係を機能させる必要があります (これが OSGi の要点です!)。

そのため、バンドルを開始する前にすべてのバンドルを最初にインストールする必要があります。これには、次のような 2 つのループが必要です。

List<Bundle> installedBundles = new ArrayList<Bundle>();
for (URL url : urls) {
    installedBundles.add(context.installBundle(url.toString()));
}
for (Bundle bundle : installedBundles) {
    bundle.start();
}
于 2013-04-12T10:00:30.490 に答える