我正在努力学习OSGI。 (主要是捆绑动态加载和卸载)。
按照Neil Bartlett的How To Embed OSGi教程,我将Equinox OSGi框架实现添加到类路径并开始游戏。
以下是代码:
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
import org.osgi.framework.launch.Framework;
import org.osgi.framework.launch.FrameworkFactory;
public class BundleManager {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
FrameworkFactory frameworkFactory = ServiceLoader.load(
FrameworkFactory.class).iterator().next();
Map<String, String> config = new HashMap<String, String>();
//TODO: add some config properties
Framework framework = frameworkFactory.newFramework(config);
framework.start();
BundleContext context = framework.getBundleContext();
List<Bundle> installedBundles = new LinkedList<Bundle>();
installedBundles.add(context.installBundle(
"file:C:/Users/student/Documents/eclipse/myPlugins/HellowService.jar"));
for (Bundle bundle : installedBundles) {
if (bundle.getHeaders().get(Constants.FRAGMENT_HOST) == null)
bundle.start();
}
System.out.println("done!!");
}
}
是的,它有效。完全没有错误。但是,我安装的bundle是路径中的jar文件:C:/Users/student/Documents/eclipse/myPlugins/HellowService.jar
在其start方法中包含“HelloWorld”。我在eclipse控制台中没有看到“HelloWold”。虽然捆绑包已启动,为什么我看不到该消息?我很感激任何简单的帮助。
注意:HellowService.jar
是我之前创建的一个插件项目,在其一个类中实现了BundleActivator,在start方法中添加了“HelloWorld”消息,最后将其作为jar文件导出到目录{{ 1}}
编辑:这是我正在安装和启动的软件包中的Activator类:
C:/Users/student/Documents/eclipse/myPlugins/
这是捆绑的MANIFEST.MF文件:
package com.javaworld.sample.service.impl;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import com.javaworld.sample.service.HelloService;
public class HelloServiceActivator implements BundleActivator {
ServiceRegistration helloServiceRegistration;
public void start(BundleContext context) throws Exception {
HelloServiceFactory helloServiceFactory = new HelloServiceFactory();
helloServiceRegistration =context.registerService(HelloService.class.getName(), helloServiceFactory, null);
System.out.println("Hello World!");
}
public void stop(BundleContext context) throws Exception {
helloServiceRegistration.unregister();
}
}
我导出捆绑包的方式是右键单击捆绑项目 - >导出 - >运行的Jar文件 - >然后我选择启动配置为BundleManager(这是安装捆绑包的类)。 / p>
我仍然没有看到“Hello World!”从我的应用程序启动捆绑包时出现错误消息。
答案 0 :(得分:1)
您的启动器不会等待OSGi Framework停止。我希望这个程序能够启动所有内容,然后立即关闭,因为我们到达main
方法的末尾。请参阅我的教程,其中展示了如何使用Framework.waitForStop
方法。
话虽如此,我希望你的HelloWorld包的输出真正出现在关机之前。因此,似乎该捆绑包中也存在错误。也许你还没有宣布激活剂?我只能猜测,因为你没有提供任何细节。
答案 1 :(得分:0)
事实证明我正在错误地导出捆绑包。那是因为我试图自己做。以下是如何将包导出为jar文件:
Open the plugin export wizard File > Export... > Plug-in Development >
Deployable plug-ins and fragments .
Then select the bundle you want to export and the destination directory. Done!
您现在可以使用jar文件的路径来安装捆绑包。就我而言,它是:
installedBundles.add(context.installBundle(
"file:C:/Users/student/Documents/eclipse/myPlugins/plugins/com.javaworld.sample.HelloService_1.0.0.201307220322.jar"));
肯定要感谢@Neil Bartlett