maven osgi_OSGi将Maven与Equinox结合使用

maven osgi

很长时间以来,我一直在努力理解OSGi的真正含义。 它已经存在很长时间了,但是没有多少人意识到这一点。 它被炒作是一种非常复杂的技术。 这是我为所有Java开发人员简化的尝试。

简而言之, OSGi是一组规范,这些规范支持模块化组装使用Java技术构建的软件。 它定义了组件-服务的创建和注册(在启用OSGi的容器中),以便进行内部通信。 OSGi的另一个好处是,所有这些服务都可以在运行时安装/卸载/启动/停止(即可以在运行时热部署代码)。 与在诸如WebSphere , JBoss , WebLogic的流行J2EE应用程序服务器中找到的Tomcat和EJB容器之类的Servlet容器实现类似, OSGi也有一些流行的容器实现,例如Equinox (这是Eclipse的基础), Apache Felix …等

面向服务的方法是OSGi的强项之一,但是当您不得不处理带有大量依赖关系的应用程序时,我觉得这很重要。 OSGi解决了“地狱”的问题。
一个例子。 假设您在应用程序中使用两个库libX和libY。 我们还假设它们每个在libZ中都有一个依赖关系,但是版本不同。 libX取决于libZ 2.0,而libY取决于libZ 1.0
如果libZ 2.0与libZ 1.0不兼容,则在同一应用程序中同时使用它们时,可能会遇到难以解决的问题。 OSGi可以处理此类问题。 OSGi支持Import-Package指令,该指令可用于为应用程序-服务应使用的任何Java包指定一个版本。 OSGi类加载器能够根据此信息找到正确的包/罐。 在我之前的示例中,如果库libX,libY和libZ与OSGi兼容,则可以将它们全部加载到同一JVM中而不会出现问题: libZ 1.0将使用Export-Package指令org.libz; 版本= 1.0 libZ 2.0将使用Export-Package指令org.libz; 版本= 2.0 libX将使用Import-Package指令org.libz; 版本= 2.0 libY将使用Import-Package指令org.libz; 版本= 1.0 OSGi还为Java应用程序带来了更强大的模块化概念。 在捆绑包之外只能使用使用Export-Package指令导出的包。

在本文中,我将解释使用Eclipse Equinox容器的OSGi 。 在其计算机上安装了Eclipse IDE的任何人,也在Eclipse插件的文件夹中也安装了OSGi容器。

OSGi容器jar文件的名称类似于org.eclipse.osgi_ <version> .jar

您可以像这样启动OSGi

java -jar org.eclipse.osgi_3.5.2.R35x_v20100126.jar -console

附件是我如何启动OSGi容器的示例屏幕截图(类似于启动Tomcat )

现在,我们已经启动了OSGi容器,让我们使用Maven创建一个“ HelloWorld” OSGi应用程序。 项目结构如下所示:

以下是该项目的pom.xmlpom.xml还添加了2个配置文件,以便创建2个新模块( MathServiceMathServiceClient ),本文稍后将对此进行说明。

<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>com.linkwithweb.osgi</groupId><artifactId>HelloWorld</artifactId><version>0.0.1-SNAPSHOT</version><name>HelloWorld</name><dependencies><dependency><groupId>org.osgi</groupId><artifactId>org.osgi.core</artifactId><version>4.2.0</version></dependency></dependencies><build><finalName>HelloWorld-${version}</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.1</version><configuration><source>1.5</source><target>1.5</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile></archive></configuration></plugin></plugins></build><profiles><profile><id>MathService</id><build><finalName>MathService-${version}</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.1</version><configuration><source>1.5</source><target>1.5</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><excludes><exclude>**/*.xml</exclude><exclude>**/*.bsh</exclude><exclude>**/*.properties</exclude></excludes><archive><manifestFile>src/main/resources/MathService/META-INF/MANIFEST.MF</manifestFile></archive></configuration></plugin></plugins></build></profile><profile><id>MathServiceClient</id><build><finalName>MathServiceClient-${version}</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.1</version><configuration><source>1.5</source><target>1.5</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><excludes><exclude>**/*.xml</exclude><exclude>**/*.bsh</exclude><exclude>**/*.properties</exclude></excludes><archive><manifestFile>src/main/resources/MathServiceClient/META-INF/MANIFEST.MF</manifestFile></archive></configuration></plugin></plugins></build></profile></profiles></project>

如果仔细观察pom.xml,您将看到我们创建的每个OSGi捆绑包都有3个MANIFEST.MF定义。 这么说,让我解释一下OSGi捆绑包是什么。 OSGi软件包本质上与标准Java“ jar”文件相同,但其特定配置在“ jar的”清单文件中定义。 OSGi容器读取“罐子”清单文件中所有OSGi特定的条目,以激活捆绑包。 那不是很酷吗? 使用OSGi,我们避免像其他框架一样学习任何新的元数据格式!

这是我为MathServiceClient 捆绑包定义的示例Manifest.MF

Manifest-Version: 1.0
Bundle-Name: MathServiceClient
Bundle-Activator: com.linkwithweb.osgi.service.client.MathServiceClientActivator
Bundle-SymbolicName: MathServiceClient
Bundle-Version: 1.0.0
Import-Package: org.osgi.framework,com.linkwithweb.osgi.service

如您所见,除Manifest-Version以外的所有条目都是OSGi特定的。 这些条目定义了如何激活捆绑软件,捆绑软件的名称和版本,其所有从属库以及暴露给其他服务使用的扩展点。

让我向您展示如何将“ HelloWorld”捆绑软件安装到Equinox OSGi Container中。 以下是“ HelloWorld”捆绑包的MANIFEST.MF文件和Activator类。

package com.linkwithweb.osgi;import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;/*** @author Ashwin Kumar**/
public class HelloActivator implements BundleActivator {public void start(BundleContext context) {System.out.println("Hello World");}public void stop(BundleContext context) {System.out.println("Goodbye All");}
}
Manifest-Version: 1.0
Bundle-Name: HelloWorld
Bundle-Activator: com.linkwithweb.osgi.HelloActivator
Bundle-SymbolicName: HelloWorld
Bundle-Version: 1.0.0
Import-Package: org.osgi.framework

要构建捆绑包,请运行“ mvn clean package”

它将在您的Maven项目的目标文件夹中创建HelloWorld-0.0.1-SNAPSHOT.jar 。 这是显示如何在Equinox中安装和启动“ HelloWorld”捆绑软件的图像

如您所见,我们使用install命令安装捆绑软件,并使用start命令,使用捆绑软件安装后容器返回的捆绑软件ID启动捆绑软件。

现在,就捆绑软件的生命周期而言,启动捆绑软件将触发对捆绑软件的Activator类的“ start ”方法的调用,而停止捆绑软件将触发对捆绑软件的Activator类的“ stop ”方法的调用。 我们可以在容器的终端中看到上述行为的结果,该终端在模块启动时显示“ Hello World”消息!

恭喜,您已经了解了OSGi的基础知识,并且已经部署了第一个捆绑软件!

曝光和消费服务

为了解释这一点,我将实现一个非常简单的示例,在该示例中,我将发布一个可以添加两个数字的服务。

首先,我们需要定义一个接口,以向外部捆绑包(客户端)公开“添加”功能

package com.linkwithweb.osgi.service;/*** @author Ashwin Kumar**/
public interface MathService {/*** @param a* @param b* @return*/public int add(int a, int b);
}

现在执行类

package com.linkwithweb.osgi.service;/*** @author Ashwin Kumar**/
public class MathServiceImpl implements MathService {/* (non-Javadoc)* @see com.linkwithweb.osgi.service.MathService#add(int, int)*/public int add(int a, int b) {// TODO Auto-generated method stubreturn a+b;}}

接下来是Activator类,该类将“添加”服务注册到OSGi容器。

package com.linkwithweb.osgi.service;import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;/*** @author Ashwin Kumar**/
public class MathServiceActivator implements BundleActivator {/** (non-Javadoc)** @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)*/public void start(BundleContext context) {MathService service = new MathServiceImpl();// Third parameter is a hashmap which allows to configure the service// Not required in this examplecontext.registerService(MathService.class.getName(), service, null);System.out.println("Math Service Registered");}/** (non-Javadoc)** @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)*/public void stop(BundleContext context) {System.out.println("Goodbye From math service");}
}

以下是“添加”服务包的清单文件。

Manifest-Version: 1.0
Bundle-Name: MathService
Bundle-Activator: com.linkwithweb.osgi.service.MathServiceActivator
Bundle-SymbolicName: MathService
Bundle-Version: 1.0.0
Import-Package: org.osgi.framework
Export-Package: com.linkwithweb.osgi.service

如果您观察上面的清单,您会注意到我们正在导出一些软件包,以便以后使用。 同样,必须在此处定义所有运行时所需的软件包(使用Import-Package指令)。

就像本文的上一节一样,使用以下命令来构建jar文件

mvn -PMathService软件包

您可以在下面看到安装和启动OSGi捆绑软件的命令。

以下是“添加”服务的使用者的实现。 消费者打包在OSGi捆绑激活器类中,仅用于演示目的。 您可以自由地将使用者作为单独的OSGi服务实施,因为OSGi服务可以相互通信!

package com.linkwithweb.osgi.service.client;import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;import com.linkwithweb.osgi.service.MathService;/*** @author Ashwin Kumar**/
public class MathServiceClientActivator implements BundleActivator {MathService service;private BundleContext context;/** (non-Javadoc)** @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)*/public void start(BundleContext context) {this.context = context;// Register directly with the serviceServiceReference reference = context.getServiceReference(MathService.class.getName());service = (MathService) context.getService(reference);System.out.println(service.add(1, 2));}	/** (non-Javadoc)** @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)*/public void stop(BundleContext context) {System.out.println(service.add(5, 6));}
}

跟随是“添加”服务使用者捆绑包的清单文件。

Manifest-Version: 1.0
Bundle-Name: MathServiceClient
Bundle-Activator: com.linkwithweb.osgi.service.client.MathServiceClientActivator
Bundle-SymbolicName: MathServiceClient
Bundle-Version: 1.0.0
Import-Package: org.osgi.framework,com.linkwithweb.osgi.service

要创建,安装并启动“添加”服务客户端捆绑包,请遵循以下步骤:

mvn -PMathServiceClient软件包

就这样! 希望你喜欢它!

您可以在此处下载本文的源代码

参考:来自Felicitas和Beatitudo博客的 JCG合作伙伴 Aswin的OSGI,适合初学者使用Maven和Equinox(HowTo) 。

相关文章 :
  • Java Code Geeks Andygene Web原型
  • Spring,Quartz和JavaMail集成教程
  • 使用Spring将POJO公开为JMX MBean
  • 依赖注入–手动方式

翻译自: https://www.javacodegeeks.com/2011/06/osgi-using-maven-equinox.html

maven osgi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中、文件最重要的功能是( )和接收数据_Python基础语法14个知识点大串讲

来源&#xff1a;Python数据之道Python基础语法大串讲Python 是一门面向对象的编程语言&#xff0c;相信这篇文章对于初学者而言应该会有一个比较大的帮助&#xff0c;下面我们将 Python 中常用的基础语法和函数做了一个汇总&#xff0c;满满的干货&#xff0c;供大家学习。1、…

hadoop简单介绍_Hadoop:简单介绍

hadoop简单介绍什么是Hadoop&#xff1a; Hadoop是用Java编写的框架&#xff0c;用于在大型商品硬件群集上运行应用程序&#xff0c;并具有类似于Google File System和MapReduce的功能 。 HDFS是一个高度容错的分布式文件系统&#xff0c;与Hadoop一样&#xff0c;旨在部署在低…

java mvc 案例_springmvc经典案例

本想自己写一下总结&#xff0c;但是发现一篇好文&#xff0c;转发一下&#xff0c;日后自己再做补充&#xff1b;感谢Sunnier&#xff0c;引自&#xff1a;https://www.cnblogs.com/sunniest/p/4555801.htmlSpringMVC学习笔记----一、SpringMVC基础入门&#xff0c;创建一个He…

java泛型方法无参_从头再来:Java泛型(开发必须知道的)

Java泛型老规矩&#xff0c;测试一下&#xff0c;下面的程序能否正常运行&#xff1f;为什么&#xff1f;开头测试题泛型就是实现了参数化类型&#xff0c;也就是代码可以适用于多种类型。泛型是在编译期检查的&#xff0c;在编译期检查类型是否安全。我认为泛型最有用的就是和…

几种常见模式识别算法整理和总结

这学期选了门模式识别的课。发现最常见的一种情况就是&#xff0c;书上写的老师ppt上写的都看不懂&#xff0c;然后绕了一大圈去自己查资料理解&#xff0c;回头看看发现&#xff0c;Ah-ha&#xff0c;原来本质的原理那么简单&#xff0c;自己一開始仅仅只是被那些看似formidab…

fastd java下载_FastReport VCL报表控件

FastReport VCL报表控件是著名的 Delphi 打印控件。含全部源码。支持 Delphi 10.2 Tokyo&#xff0c;FastReport可以在大量的方式报表的创建过程中操纵对象。快速发展的报表和随后的打印&#xff0c;这样的优点&#xff0c;正如预览打印文档的外观。专业版除了报表标准版的功能…

#102030:在30天内运行20 10K来庆祝Java的20年

1995年5月23日是技术史上的重要时刻。 业界似乎并没有意识到当天发布的语言会在未来几年内完全改变技术的格局。 Java将在今年的同一天庆祝20岁生日。 Java 20年&#xff0c;哇&#xff01; 回顾20年前的存储器时代&#xff0c;思考一下Java的发明时间/方式。 万维网专用于精…

View 的 android:visibility属性的讨论

Android VIEW 中的 visibility 属性&#xff0c;在API中的描述为&#xff1a;Controls the initial visibility of the view. [控制VIEW的初始可见性]。 其中包含三个参数&#xff1a; * 默认值为visible&#xff0c;可见。这里需要注意的是 "invisible" 和 "go…

JQuery-Dialog(弹出窗口,遮蔽窗口)

在Ajax中经常用到的弹出窗口和遮蔽窗口。自己写肯定是一个最佳方案&#xff0c;但时间和成本上&#xff0c;还是决定了寻找现成的吧。大概罗列一下。需要我满足我几个条件 一定要简洁方便拥有遮蔽功能&#xff0c;Model Dialog &#xff0c;所谓的模态窗口可以根据HTML弹出窗口…

java调用接口实现的方法_java调用接口的实现方法

java调用接口的实现方法发布时间&#xff1a;2020-06-29 11:08:46来源&#xff1a;亿速云阅读&#xff1a;78作者&#xff1a;Leah本篇文章给大家分享的是有关java调用接口的实现方法&#xff0c;小编觉得挺实用的&#xff0c;因此分享给大家学习&#xff0c;希望大家阅读完这篇…

Java EE应用程序的单片到微服务重构

您是否曾经想过将现有的Java EE整体应用程序重构为基于微服务的应用程序需要做什么&#xff1f; 该博客解释了一个简单的购物车示例如何转换为基于微服务的应用程序&#xff0c;以及围绕它的一些担忧。 整体和基于微服务的应用程序的完整代码库位于&#xff1a; github.com/ar…

Java代码韦伯分布_第十五节、韦伯局部描述符(WLD,附源码)

纹理作为一种重要的视觉线索&#xff0c;是图像中普遍存在而又难以描述的特征&#xff0c;图像的纹理特征一般是指图像上地物重复排列造成的灰度值有规则的分布。纹理特征的关键在于纹理特征的提取方法。目前&#xff0c;用于纹理特征提取的方法有很多&#xff0c;最具有代表性…

JavaFX真实世界应用程序:欧洲电视网广播联盟

我荣幸地与今年在德累斯顿Saxonia 系统公司工作的Alexander Casall一起在JavaOne上展示了多个JavaFX Real-World应用程序。 在准备本次演讲时&#xff0c;我们向客户和合作伙伴发送了一份调查表&#xff0c;并向他们询问了一些与他们的项目&#xff0c;他们的应用程序以及他们对…

java 三大集合_java中的三大集合入门笔记(简单实用)

为什么使用集合框架如图&#xff1a;集合的好处&#xff1a;集合弥补了数组的缺陷&#xff0c;它比数组更灵活更实用&#xff0c;可大大提高软件的开发效率&#xff0c;而且不同的集合适用于不同的场合。Java集合主要分为以下3种类型Java集合框架提供了一套性能优良、使用方便的…

Java面试题2019简书_2019最新Spring面试题大全含答案之Spring Beans(2019最全Spring超级葵花宝典)...

1.什么是Spring beans&#xff1f;Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化&#xff0c;装配&#xff0c;和管理。这些beans通过容器中配置的元数据创建。比如&#xff0c;以XML文件中 的形式定义。Spring 框架定义的beans都是单件bean…

使用此首选项可加快Eclipse m2e配置

谁不认识他们。 Eclipse中的旧式JFace对话框可以使您直观地看到实际上是一个相当简单的XML或属性文件。 对于m2e&#xff0c;它看起来像这样&#xff1a; 不幸的是&#xff0c;此屏幕的加载速度有点慢&#xff0c;除了检查版本号和您将永远不会更改的其他内容之外&#xff0c…

【百度地图API】发布静态图API啦!只需一个网址,即可展示定制百度地图!

【百度地图API】发布静态图API啦&#xff01;只需一个网址&#xff0c;即可展示定制百度地图&#xff01; 原文:【百度地图API】发布静态图API啦&#xff01;只需一个网址&#xff0c;即可展示定制百度地图&#xff01;摘要&#xff1a; 百度地图静态图API&#xff01;您无须执…

脚本在流程中的性能影响

我们经常看到人们出于各种目的而使用脚本&#xff08;例如&#xff0c;在服务任务&#xff0c;执行侦听器等中&#xff09;。 使用脚本和Java逻辑通常很有意义&#xff1a; 它不需要打包到jar中并放在classpath上 它使流程定义更易于理解&#xff1a;无需查看其他文件 逻辑是…

PowerDesigner使用教程

原文&#xff1a;http://www.cnblogs.com/huangcong/archive/2010/06/14/1757957.html PowerDesigner是一款功能非常强大的建模工具软件&#xff0c;足以与Rose比肩&#xff0c;同样是当今最著名的建模软件之一。Rose是专攻UML对象模型的建模工具&#xff0c;之后才向数据库建模…

红帽峰会2015所需的JBoss BPM内容指南

明年再见&#xff1f; 今年在Red Hat Summit上&#xff0c;我们在JBoss BRMS和JBoss BPM Suite演讲中获得了很多乐趣。 在DevNation周围也有一些社区会议&#xff0c;重点介绍了使我们的产品成为可能的项目。 您可以在他们的博客上找到此演讲的概述&#xff0c;并在其中提供…