本文介绍了在mac系统上如何用idea搭建osgi项目开发,演示使用的equinor osgi framework,jdk8。
equinor下载
下载地址:https://download.eclipse.org/…
本文下载的是equinox-SDK-4.11.zip,下载后进行解压,后面需要用到这个解压目录。
idea创建工程
File -> New -> Project,选择Java,点击Next,创建一个空工程。
继续点击Next。
填写项目名称,这里叫osgi_demo。
工程下创建osgi模块
创建api、server、client三个模块。
创建模块时勾选OSGI作为开发环境,Use library从刚才下载的equinox解压的目录下的plugins目录中选择org.eclipse.osgi_3.13.300.v20190218-1622.jar。
创建模块完成之后,打开idea的preferences,在Languages & Frameworks找到OSGI Framework Instances选项。
添加Equinox,Home directory选择刚才解压的Equinox目录。
编写演示代码
结构如下图
api模块中定义接口类IHelloService
package osgi.demo.api;
public interface IHelloService {
/**
* 和某人打招呼
* @param somebody
* @return
*/
String sayHello(String somebody);
}
server模块接口实现类HelloServiceImpl
package osgi.demo.server;
import osgi.demo.api.IHelloService;
public class HelloServiceImpl implements IHelloService {
@Override
public String sayHello(String somebody) {
return "hello " + somebody;
}
}
server模块服务注册类HelloServerBundle
package osgi.demo.server;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import osgi.demo.api.IHelloService;
import java.util.Dictionary;
import java.util.Hashtable;
public class HelloServerBundle implements BundleActivator {
@Override
public void start(BundleContext bundleContext) throws Exception {
IHelloService service = new HelloServiceImpl();
Dictionary<String , Object> properties = new Hashtable<>();
//服务注册
bundleContext.registerService(IHelloService.class, service, properties);
}
@Override
public void stop(BundleContext bundleContext) throws Exception {
}
}
client模块调用服务类HelloClientBundle
package osgi.demo.client;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import osgi.demo.api.IHelloService;
import java.util.Objects;
public class HelloClientBundle implements BundleActivator {
@Override
public void start(BundleContext bundleContext) throws Exception {
//获取到IHelloService服务引用
ServiceReference<IHelloService> reference = bundleContext.getServiceReference(IHelloService.class);
if (Objects.nonNull(reference)) {
//发现服务
IHelloService service = bundleContext.getService(reference);
if (Objects.nonNull(service)) {
System.out.println(service.sayHello("jecyhw"));
}
//注销服务
bundleContext.ungetService(reference);
}
}
@Override
public void stop(BundleContext bundleContext) throws Exception {
}
}
各模块osgi配置
api模块配置,导出接口定义所在包osgi.demo.api。
VZD)
server模块配置,配置HelloServerBundle类作为该bundle的启动类。
client模块配置,配置HelloClientBundle类作为该bundle的启动类。
osgi启动配置并运行
选择Edit Configurations。
添加OSGI Bundles。
配置如下。
点击OK之后,就可以运行了。
运行结果截图。
发表回复