在本文中,我们将使用OSGi开发一个简单的Hello World应用程序。 我们将使用Felix作为OSGi容器 。 在下一篇文章中,我们将继续使用该应用程序,并使用Spring Dynamic Modules对其进行改进。

为了使开发有趣,我们将创建两个捆绑包:

  • 提供HelloWorld服务的捆绑包
  • 消耗该服务以定期间隔打个招呼的捆绑软件。

因此,让我们从第一个捆绑包开始。 我们首先需要的是一个非常简单的服务,在控制台中提供简单的打印:

package com.bw.osgi.provider.able;public interface HelloWorldService {void hello();
}
package com.bw.osgi.provider.impl;import com.bw.osgi.provider.able.HelloWorldService;public class HelloWorldServiceImpl implements HelloWorldService {@Overridepublic void hello(){System.out.println("Hello World !");}
}

我们再简单不过了。 然后,我们需要使用激活器导出服务:

package com.bw.osgi.provider;import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;import com.bw.osgi.provider.able.HelloWorldService;
import com.bw.osgi.provider.impl.HelloWorldServiceImpl;public class ProviderActivator implements BundleActivator {private ServiceRegistration registration;@Overridepublic void start(BundleContext bundleContext) throws Exception {registration = bundleContext.registerService(HelloWorldService.class.getName(),new HelloWorldServiceImpl(),null);}@Overridepublic void stop(BundleContext bundleContext) throws Exception {registration.unregister();}
}

这里有很多代码。 对于那些对OSGi不确定的人,可以做一些解释。 当模块启动时将调用start方法,而在模块停止时将调用stop方法。 在start方法中,我们使用接口名称作为导出服务的名称在包上下文中注册我们的服务。 第三个参数null表示我们不为此服务提供任何配置。 在stop方法中,我们只是注销服务。

现在,我们的第一个捆绑包已准备就绪。 我们可以建立它。 为此,我们将使用Maven和maven-bundle-plugin直接构建OSGi Bundle。 这是项目的pom.xml文件。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>OSGiDmHelloWorldProvider</groupId><artifactId>OSGiDmHelloWorldProvider</artifactId><version>1.0</version><dependencies><dependency><groupId>org.apache.felix</groupId><artifactId>org.osgi.core</artifactId><version>1.4.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.0.2</version><configuration><source>1.6</source><target>1.6</target></configuration></plugin><plugin><groupId>org.apache.felix</groupId><artifactId>maven-bundle-plugin</artifactId><extensions>true</extensions><configuration><instructions><Bundle-SymbolicName>OSGiDmHelloWorldProvider</Bundle-SymbolicName><Export-Package>com.bw.osgi.provider.able</Export-Package><Bundle-Activator>com.bw.osgi.provider.ProviderActivator</Bundle-Activator><Bundle-Vendor>Baptiste Wicht</Bundle-Vendor></instructions></configuration></plugin></plugins></build>
</project>

然后,使用mvn install进行构建。

我们将在一个名为osgi的文件夹中工作,因此我们将此新捆绑包复制到osgi文件夹中。

我们已经可以在OSGi容器中对其进行测试。 如果您还没有Felix,请在这里下载。 您必须选择“ Felix分布”。

然后将其解压缩到我们之前创建的osgi文件夹中。 现在,您必须具有以下文件夹结构:

osgi- felix- OSGiDmHelloWorldProvider-1.0.jar

这样我们就可以进入felix文件夹并启动Felix:

wichtounet@Linux-Desktop:~/Desktop/osgi/felix$ java -jar bin/felix.jar
_______________
Welcome to Apache Felix Gogog!

并安装我们的捆绑包:

g! install file:../OSGiDmHelloWorldProvider-1.0.jar
Bundle ID: 5

该安装已正确安装,我们可以尝试启动它并查看其状态:

g! start 5
g! bundle 5
Location             file:../OSGiDmHelloWorldProvider-1.0.jar
State                32
Version              1.0.0
LastModified         1279124741320
Headers              [Tool=Bnd-0.0.357, Bundle-Activator=com.bw.osgi.provider.ProviderActivator, Export-Package=com.bw.osgi.provider.able, Build-Jdk=1.6.0_20, Bundle-Version=1.0.0, Created-By=Apache Maven Bundle Plugin, Bundle-ManifestVersion=2, Manifest-Version=1.0, Bundle-Vendor=Baptiste Wicht, Bnd-LastModified=1279124686551, Bundle-Name=Unnamed - OSGiDmHelloWorldProvider:OSGiDmHelloWorldProvider:bundle:1.0, Built-By=wichtounet, Bundle-SymbolicName=OSGiDmHelloWorldProvider, Import-Package=com.bw.osgi.provider.able,org.osgi.framework;version="1.5"]
BundleContext        org.apache.felix.framework.BundleContextImpl@2353f67e
BundleId             5
SymbolicName         OSGiDmHelloWorldProvider
RegisteredServices   [HelloWorldService]
ServicesInUse        null

一切皆好。 我们的服务注册良好

现在,我们将尝试在第二个捆绑包中使用此服务。 我们的消费者类别将非常简单:

package com.bw.osgi.consumer;import javax.swing.Timer;import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import com.bw.osgi.provider.able.HelloWorldService;public class HelloWorldConsumer implements ActionListener {private final HelloWorldService service;private final Timer timer;public HelloWorldConsumer(HelloWorldService service) {super();this.service = service;timer = new Timer(1000, this);}public void startTimer(){timer.start();}public void stopTimer() {timer.stop();}@Overridepublic void actionPerformed(ActionEvent e) {service.hello();}
}

现在,我们必须创建激活器以获取服务,然后将其提供给消费者。 这将使使用像这样的东西:

package com.bw.osgi.consumer;import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;import com.bw.osgi.provider.able.HelloWorldService;public class HelloWorldActivator implements BundleActivator {private HelloWorldConsumer consumer;@Overridepublic void start(BundleContext bundleContext) throws Exception {ServiceReference reference = bundleContext.getServiceReference(HelloWorldService.class.getName());consumer = new HelloWorldConsumer((HelloWorldService) bundleContext.getService(reference));consumer.startTimer();}@Overridepublic void stop(BundleContext bundleContext) throws Exception {consumer.stopTimer();}
}

我们使用类的名称从捆绑软件上下文中获得服务引用。 之后,我们从包上下文获取服务实例。

我们还创建了一个小的pom.xml文件来构建捆绑包:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>OSGiDmHelloWorldConsumer</groupId><artifactId>OSGiDmHelloWorldConsumer</artifactId><version>1.0</version><packaging>bundle</packaging><dependencies><dependency><groupId>org.apache.felix</groupId><artifactId>org.osgi.core</artifactId><version>1.0.0</version></dependency><dependency><groupId>OSGiDmHelloWorldProvider</groupId><artifactId>OSGiDmHelloWorldProvider</artifactId><version>1.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.0.2</version><configuration><source>1.6</source><target>1.6</target></configuration></plugin><plugin><groupId>org.apache.felix</groupId><artifactId>maven-bundle-plugin</artifactId><extensions>true</extensions><configuration><instructions><Bundle-SymbolicName>OSGiDmHelloWorldConsumer</Bundle-SymbolicName><Bundle-Activator>com.bw.osgi.consumer.HelloWorldActivator</Bundle-Activator><Bundle-Vendor>Baptiste Wicht</Bundle-Vendor></instructions></configuration></plugin></plugins></build>
</project>

然后,我们使用mvn install创建捆绑包,并将其安装在容器中:

g! start 6
g! Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
g! stop 6

至此,我们已经使用OSGi创建了第一个应用程序。 使用该技术,您可以构建真正独立的模块。

在有关OSGi的下一篇文章中,我们将看到如何使用Spring来简化OSGi的开发,并将精力集中在应用程序而不是OSGi上。

这两个捆绑包的来源可在此处获得:

  • OSGiDmHelloWorldProvider来源
  • OSGiDmHelloWorldConsumer

参考: OSGi –简单的Hello World,由JCG合作伙伴 Baptiste Wicht在@Blog(“ Baptiste Wicht”)提供服务 。

相关文章 :
  • OSGi将Maven与Equinox结合使用
  • 真正的模块化Web应用程序:为什么没有开发标准?
  • Java模块化方法–模块,模块,模块

翻译自: https://www.javacodegeeks.com/2011/11/osgi-simple-hello-world-with-services.html

OSGi –带有服务的简单Hello World相关推荐

  1. AngularJS中$http服务的简单用法

    我们可以使用内置的$http服务直接同外部进行通信.$http服务只是简单的封装了浏览器原生的XMLHttpRequest对象. 1.链式调用 $http服务是只能接受一个参数的函数,这个参数是一个对 ...

  2. DHCP服务、NFS、vsftp服务的简单搭建

    DHCP服务.NFS.vsftp服务的简单搭建与小实验测试 转载于:https://blog.51cto.com/nmgxjh/1426742

  3. 关于为老年人服务的简单创业计划书

    为老年人服务的简单创业计划书 创业执行总结 20世纪90年代以来,中国的老龄化进程加快.65岁及以上老年人口从1990年的6299万增加到2000年的8811万,占总人口的比例由5.57%上升为6.9 ...

  4. Euraka服务端简单配置

    Euraka服务端简单配置 注册中心,主要用来微服务调用 父工程pom依赖 <?xml version="1.0" encoding="UTF-8"?&g ...

  5. Quarkus 实战二:开发REST ful 服务实现简单的curd功能

    Quarkus 实战二:开发REST ful 服务实现简单的curd 概述 Quarkus集成了RESTEasy,这是一种用于定义REST API的JAX-RS实现 参考文档: Quarkus 文档 ...

  6. osgi:install_OSGi服务测试助手:ServiceCollector

    osgi:install OSGi服务对于基于松散耦合组件的系统开发非常有用. 但是,松散的耦合可能使得难以识别与悬挂服务引用有关的问题. 因此,我们通常运行集成测试以确保运行时服务组件的可用性. 为 ...

  7. osgi:install_OSGi服务测试助手:ServiceRegistrationRule

    osgi:install OSGi服务测试可以是避免与悬挂的服务引用有关的问题的有效方法. 就像我在写简单服务贡献验证中所承诺的那样,这次我引入了一个JUnit规则 ,该规则有助于测试组件之间的交互. ...

  8. 服务osgi_OSGi –具有服务的简单Hello World

    服务osgi 在本文中,我们将使用OSGi开发一个简单的Hello World应用程序. 我们将使用Felix作为OSGi容器 . 在下一篇文章中,我们将继续使用该应用程序,并使用Spring Dyn ...

  9. 服务计算:简单的CLI程序

    Go Online传送门 Go Online 命令行程序是什么 CLI(Command Line Interface)实用程序是Linux下应用开发的基础.正确的编写命令行程序让应用与操作系统融为一体 ...

最新文章

  1. mysql 提交_MySQL 事务提交过程
  2. 关于一个CCIE考试题目的研究(重分发)
  3. 计算机网络第五章-运输层学习笔记
  4. android抓包工具——使用fiddler4在安卓手机抓包
  5. 有线电视pcr是什么意思_有线电视的完整形式是什么?
  6. axios 的简单使用
  7. 售价3998元!iQOO 3拉力橙明日全款预售:3月29日首销
  8. android studio上下滚动菜单,Android模仿美团顶部的滑动菜单实例代码
  9. 问题-Fastreport4 Memo打印时中文显示不全
  10. 安装mysql中文步骤_mysql安装步骤-Go语言中文社区
  11. SqlServer语句中替换like的另一种写法
  12. 转载——yum源的超级简单配置
  13. python的drop duplicates,Python的pandas中,drop_duplicates函数怎么根据索引来去重
  14. Linux:dperf---100Gbps开源压力测试工具
  15. f分布表完整图a=0.01_c++多态和虚函数表实现原理 - 一字千金
  16. otf是什么格式?怎么安装呢?
  17. 关于苹果的iOS cercertificate的创建问题
  18. 先序遍历、中序遍历、后序遍历
  19. 数学和编程到底是什么关系?
  20. 【文件格式漏洞】微软ANI光标文件漏洞彻底分析利用

热门文章

  1. java泛型程序设计——注意擦除后的冲突
  2. openjdk和jdk_JDK 11:发行候选更新和OpenJDK JDK 11 LTS
  3. drools。drools_Drools:fireAllRules,fireUntilHalt和Timers内部代码清理的详细说明
  4. 小程序可不可以汉字命名_不可将您的方法命名为“等于”
  5. activemq网络桥接_ActiveMQ –经纪人网络解释
  6. spring集成jndi_Spring应用程序与JNDI连接池的集成测试
  7. java 使用本机代理_Java与本机代理–他们所做的强大功能
  8. spring boot程序_Spring Boot –现代Java应用程序的基础
  9. Spring依赖注入–字段vs设置器vs构造函数注入
  10. servlet 异常处理_Servlet异常和错误处理示例教程