Intellij Idea 15中开发Maven+osgi项目(Apache felix环境)
来源:互联网 发布:织梦cms好用吗 编辑:程序博客网 时间:2024/05/30 04:05
1.Intellij Idea创建Maven项目
利用maven模板快速创建maven项目,如图操作,填写g(groupid)a(artifactid)v(version)。
maven home directory 选择系统默认或者自己下载下来的maven主目录。
2.将项目模块化
利用maven的依赖以及集成的特性,将项目模块化。
在主module下创建module并继承主module。
这里我创建了server以及client,项目结构如下图,先忽略红圈之外的文件夹:
主pom配置如下:
<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.renming.osgi.helloworld</groupId> <artifactId>helloworld</artifactId> <version>1.0.0</version> <modules> <module>server</module> <module>client</module> </modules> <packaging>pom</packaging> <name>helloworld</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>com.renming.osgi.helloworld</groupId> <artifactId>server</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.eclipse</groupId> <artifactId>osgi</artifactId> <version>3.9.1-v20130814-1242</version> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement></project>
server模块pom配置如下:
<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"> <parent> <artifactId>helloworld</artifactId> <groupId>com.renming.osgi.helloworld</groupId> <version>1.0.0</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>server</artifactId> <packaging>bundle</packaging> <name>server</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.eclipse</groupId> <artifactId>osgi</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>2.4.0</version> <extensions>true</extensions> <configuration> <instructions> <Bundle-Version>${project.version}</Bundle-Version> <Bundle-SymbolicName>$(replace;${project.artifactId};-;_)</Bundle-SymbolicName> <Export-Package> com.renming.osgi.helloworld.server.inter;version="${project.version}" </Export-Package> <Import-Package> org.osgi.framework </Import-Package> <Bundle-Activator> com.renming.osgi.helloworld.Activator </Bundle-Activator> </instructions> </configuration> </plugin> </plugins> </build></project>
client模块pom配置如下:
<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"> <parent> <artifactId>helloworld</artifactId> <groupId>com.renming.osgi.helloworld</groupId> <version>1.0.0</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>client</artifactId> <packaging>bundle</packaging> <name>client</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>com.renming.osgi.helloworld</groupId> <artifactId>server</artifactId> </dependency> <dependency> <groupId>org.eclipse</groupId> <artifactId>osgi</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>2.4.0</version> <extensions>true</extensions> <configuration> <instructions> <Bundle-Version>${project.version}</Bundle-Version> <Bundle-SymbolicName>$(replace;${project.artifactId};-;_) </Bundle-SymbolicName> <Import-Package> org.osgi.framework,com.renming.osgi.helloworld.server.inter;version="${project.version}" </Import-Package> <Bundle-Activator> com.renming.osgi.helloworld.Activator </Bundle-Activator> </instructions> </configuration> </plugin> </plugins> </build></project>
主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<ServiceRegistration> registrations = new ArrayList<ServiceRegistration>(); 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(); else System.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
- Intellij Idea 15中开发Maven+osgi项目(Apache felix环境)
- Apache Felix 的OSGi开发环境搭建
- Apache Felix 的OSGi开发环境搭建
- Apache Felix 的OSGi开发环境搭建
- 在Eclipse中开发OSGi(1)搭建Felix环境
- OSGI学习一(使用Apache Felix搭建OSGI开发环境)
- OSGI--apache felix 入门
- 在Eclipse中开发OSGi(3)在Felix环境中运行Bundle
- 最新版IntelliJ IDEA 15开发Java Maven项目
- 最新版IntelliJ IDEA 15开发Java Maven项目
- intellij IDEA开发工具项目maven管理
- intellij IDEA开发工具项目maven管理
- OSGI企业应用开发(二)Eclipse中搭建Felix运行环境
- OSGI企业应用开发(二)Eclipse中搭建Felix运行环境
- IntelliJ IDEA 中创建 Maven Scala 项目
- OSGI(Felix)项目开发和持续集成流程
- 在Eclipse中搭建Apache Felix环境
- IntelliJ IDEA 15 创建maven项目
- Python知识点整理(基础篇)
- 欢迎使用CSDN-markdown编辑器
- 二叉树的递归和非递归实现 java
- poj1753 Flip Game 状态压缩+bfs
- java/Character类/正则表达式/Pattern/Matcher/Math/Random类
- Intellij Idea 15中开发Maven+osgi项目(Apache felix环境)
- Codeforces 360Div2
- U-boot配置及编译阶段流程宏观分析
- 修改apache的最大连接数
- 在服务的入口req处报流水还是在出口rsp处报流水?
- 【iReport+JasperReport】2.在Java工程中利用jasper导出PDF报表
- hihoCoder 1089 : 最短路径·二:Floyd算法(水题,练手)
- 一不小心,七月了
- Lynx (纯文本网页浏览器)