热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IntellijIdea15中开发Maven+osgi项目(Apachefelix环境)

1.IntellijIdea创建Maven项目利用maven模板快速创建maven项目,如图操作,填写g(groupid)a(artifactid)v(

1.Intellij Idea创建Maven项目



利用maven模板快速创建maven项目,如图操作,填写g(groupid)a(artifactid)v(version)。

maven home directory 选择系统默认或者自己下载下来的maven主目录。

2.将项目模块化

利用maven的依赖以及集成的特性,将项目模块化。

在主module下创建module并继承主module。

这里我创建了server以及client,项目结构如下图,先忽略红圈之外的文件夹:



主pom配置如下:

4.0.0com.renming.osgi.helloworldhelloworld1.0.0serverclientpomhelloworldhttp://maven.apache.orgUTF-8com.renming.osgi.helloworldserver${project.version}org.eclipseosgi3.9.1-v20130814-1242providedjunitjunit3.8.1test


server模块pom配置如下:

helloworldcom.renming.osgi.helloworld1.0.04.0.0serverbundleserverhttp://maven.apache.orgUTF-8org.eclipseosgijunitjunit3.8.1testorg.apache.felixmaven-bundle-plugin2.4.0true${project.version}$(replace;${project.artifactId};-;_)com.renming.osgi.helloworld.server.inter;version="${project.version}"org.osgi.frameworkcom.renming.osgi.helloworld.Activator



client模块pom配置如下:

helloworldcom.renming.osgi.helloworld1.0.04.0.0clientbundleclienthttp://maven.apache.orgUTF-8com.renming.osgi.helloworldserverorg.eclipseosgijunitjunit3.8.1testorg.apache.felixmaven-bundle-plugin2.4.0true${project.version}$(replace;${project.artifactId};-;_)org.osgi.framework,com.renming.osgi.helloworld.server.inter;version="${project.version}"com.renming.osgi.helloworld.Activator


主pom和子pom拥有继承关系,同时进行了模块化。

3.编写简单的测试用例

通过实现BundleActivator接口,可以实现与osgi框架环境的通信。

这里需要实现start以及stop,分别在bundle启动以及终止的时候被调用。

这里让它在server bundle启动的时候注册一个简单的服务:

package com.renming.osgi.helloworld;import java.util.ArrayList;
import java.util.List;import com.renming.osgi.helloworld.server.impl.HelloImpl;
import com.renming.osgi.helloworld.server.inter.Hello;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;public class Activator implements BundleActivator {private List registrations = new ArrayList();private static BundleContext context;static BundleContext getContext() {return context;}public void start(BundleContext bundleContext) throws Exception {Activator.context = bundleContext;System.out.println("----------------hello start---------------------");//注册hello接口中的服务registrations.add(bundleContext.registerService(Hello.class.getName(), new HelloImpl("Hello, OSGi"), null));System.out.println("----------------hello start---------------------");}public void stop(BundleContext bundleContext) throws Exception {Activator.context = null;for (ServiceRegistration registration : registrations) {System.out.println("unregistering: " + registration);registration.unregister();}}}



需要注意的是编写完代码后,需要配置server模块pom中打包插件,完整的上面已经列出了。

然后是cilent模块中测试代码,需要从bundleContext中获取到对应的服务,只需要提供服务名就可以了。具体代码如下:

package com.renming.osgi.helloworld;import com.renming.osgi.helloworld.server.inter.Hello;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;public class Activator implements BundleActivator {public void start(BundleContext ctx) {System.out.println("----------------hello client start---------------------");ServiceReference ref = ctx.getServiceReference(Hello.class.getName());if (ref != null) {Hello hello = null;try {hello = (Hello) ctx.getService(ref);if (hello != null)hello.sayHello();elseSystem.out.println("Service:Hello---object null");} catch (RuntimeException e) {e.printStackTrace();} finally {ctx.ungetService(ref);hello = null;}} else {System.out.println("Service:Hello---not exists");}System.out.println("----------------hello client start---------------------");}public void stop(BundleContext ctx) throws Exception {}}



4.配置Apache felix环境

下载:http://felix.apache.org/downloads.cgi


解压之后拷贝bin、conf、bundle目录到主目录下方便执行以及修改配置,同时创建plugins文件夹用于存放我们编写的bundle。

最后目录结构如下:


---执行bin中felix.jar

---控制台显示g!无报错信息则执行成功

---执行命令lb,可以查看已启动bundle

---然后打包client模块以及server模块,并将打包的jar包拷贝到plugins中

---执行命令 install file:plugins/XXX.jar,会显示ID,然后执行start ID,最后执行lb查看是否启动成功,并打印对应的信息


由于client以及server都是在本地调用,如果需要远程调用可以参考这篇文章:

http://www.cnblogs.com/lw900320/archive/2012/06/26/2563221.html


推荐阅读
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 在编写顺序控制程序(梯形图)时,一些复杂的功能如时间控制和旋转换刀等难以仅通过位运算实现。因此,功能指令应运而生,旨在简化这些复杂操作的编程过程。本文详细介绍了FANUC PMC中常用的功能指令及其应用场景。 ... [详细]
  • 本文详细介绍了如何解决MyBatis中常见的BindingException错误,提供了多种排查和修复方法,确保Mapper接口与XML文件的正确配置。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
author-avatar
支着儿traister_107
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有